日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV实现同态滤波

發布時間:2023/12/20 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV实现同态滤波 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

同態濾波是屬于圖像增強的一個小算法,其原理和代碼實現在眾多博客中均有提及,再此,只對學習中一些自認為有用的知識點進行總結。

實現和學習過程中的一些總結:

  • 同態濾波類似于灰度變換,都是對灰度級進行動態范圍壓縮和對比度增強來改善圖像的外觀。
  • 圖像f(x,y)f(x,y)f(x,y)可以表示為其照射分量i(x,y)i(x,y)i(x,y)和反射分量r(x,y)r(x,y)r(x,y)的乘積,即:f(x,y)=i(x,y)r(x,y)f(x,y)=i(x,y)r(x,y)f(x,y)=i(x,y)r(x,y)
  • 照射分量對應圖像中的低頻部分,在光源中來說對應漫反射光,反射分量對應圖像中高頻部分,在光源中對于鏡面反射光。
  • 在算法開始,先要對圖像進行對數處理,若f(x,y)f(x,y)f(x,y)中有任何零值,則必須將圖像加1,以避免In(0)In(0)In(0)的出現,然后從最終結果中減去1。

一些未出現的工具函數可以參考我之前的博客:圖像基礎頻率域濾波


代碼實現如下:

//func: 創建濾波傳遞函數 //size: 擴展后圖像的大小 //gamma_L: 控制低頻下限 //gamma_H: 控制高頻上限 //c,D0: 控制濾波函數剖面的偏斜度 cv::Mat calc_Homomorphic(cv::Size size, double gamma_L, double gamma_H, double c, double D0) {cv::Mat result(size, CV_64FC1);int cx = size.width / 2;int cy = size.height / 2;for (int i = 0; i < result.rows; ++i){double* p = result.ptr<double>(i);for (int j = 0; j < result.cols; ++j){double d_2 = std::pow(i - cy, 2) + std::pow(j - cx, 2);//同態濾波傳遞函數p[j] = (gamma_H - gamma_L) * (1 - std::exp(-c * d_2 / (D0 * D0))) + gamma_L;}}//創建雙通道圖像,便于與復數圖像相乘cv::Mat planes[] = { result.clone(), result.clone() };cv::Mat Homomorphic;merge(planes, 2, Homomorphic);return Homomorphic; }//************************main入口*************************//int main() {std::string path = "PET_image.tif";cv::Mat src = cv::imread(path, cv::IMREAD_GRAYSCALE);if (!src.data) {std::cout << "Could not open or find the image" << std::endl;return -1;}//源圖像轉化為對數形式cv::Mat srclogMat;src.convertTo(srclogMat, CV_64FC1);srclogMat = srclogMat + cv::Scalar::all(1);cv::log(srclogMat, srclogMat);//擴展圖像,擴展部分使用零填充cv::Mat paddedMat;int m = cv::getOptimalDFTSize(src.rows);int n = cv::getOptimalDFTSize(src.cols);//on the border add zero valuescv::copyMakeBorder(srclogMat, paddedMat, 0, m - src.rows, 0, n - src.cols, cv::BORDER_CONSTANT, cv::Scalar::all(0));cv::Mat paddedMatdouble;paddedMat.convertTo(paddedMatdouble, CV_64FC1);//使傅里葉變換中心化Dftshift(paddedMatdouble, paddedMatdouble);//創建一個復數圖像F(u, v)cv::Mat complexF;cv::dft(paddedMatdouble, complexF, cv::DFT_COMPLEX_OUTPUT);//創建同態濾波傳遞函數double gamma_L = 0.25, gamma_H = 2.0;double c = 1.0, D0 = 160;cv::Mat Homomorphic = calc_Homomorphic(paddedMat.size(), gamma_L, gamma_H, c, D0);cv::Mat complexFH;cv::Mat iDft;//采用對應像素相乘G(u, v) = H(u, v) * F(u, v)cv::multiply(complexF, Homomorphic, complexFH);cv::idft(complexFH, iDft, cv::DFT_REAL_OUTPUT | cv::DFT_SCALE);//最后不要忘了再完成一次移動Dftshift(iDft, iDft);//之前進行了對數變換,現在要變換回來cv::exp(iDft, iDft);iDft = iDft - cv::Scalar::all(1);cv::Mat result = iDft(cv::Rect(0, 0, src.cols, src.rows)).clone();//截斷負值,歸一化并轉換為ucharMinusToZero(result, result);normalize(result, result, 0, 1, cv::NORM_MINMAX);result.convertTo(result, CV_8UC1, 255);cv::imwrite("ascend_ET.png", result);cv::waitKey(0);return 0; }

測試結果:

總結

以上是生活随笔為你收集整理的OpenCV实现同态滤波的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。