C++圖像處理之雙邊濾波
本文實例為大家分享了C++圖像處理之雙邊濾波的具體代碼,供大家參考,具體內(nèi)容如下
1、 近期在學習雙邊濾波相關(guān)知識,其原理如下(以后補上):
2 、灰度圖雙邊濾波實現(xiàn)C++代碼如下,網(wǎng)上大多數(shù)是基于8位灰度圖和彩色圖像的。(此次代碼未經(jīng)優(yōu)化,可去除opencv依賴):
//灰度圖雙邊濾波 void m_bilateralFilter(cv::Mat src,cv::Mat& dst,int radius,float sigma_r,float sigma_d) { if (src.empty()) return; if (dst.empty()) { dst = src.clone(); } if (src.depth() == CV_16U){ for (int i = radius; i < src.rows - radius; i++) for (int j = radius; j < src.cols - radius; j++) { float sum_1 = .0f, sum_2 = .0f; for (int k = 0; k < 2 * radius - 1; k++) for (int l = 0; l < 2 * radius - 1; l++) { int dis_x = radius - k; int dis_y = radius - l; int coord_x_image = i - radius + k; int coord_y_image = j - radius + l; float dis_spatial = dis_x*dis_x + dis_y*dis_y; float dis_range = (src.at<unsigned short>(i, j) - src.at<unsigned short>(coord_x_image, coord_y_image))*(src.at<unsigned short>(i, j) - src.at<unsigned short>(coord_x_image, coord_y_image)); float c_tmp = exp(-dis_spatial / (2 * sigma_d * sigma_d)); float s_tmp = exp(-dis_range / (2 * sigma_r * sigma_r)); sum_1 += c_tmp*s_tmp*src.at<unsigned short>(coord_x_image, coord_y_image); sum_2 += c_tmp*s_tmp; } dst.at<unsigned short>(i, j) = sum_1 / sum_2; } } else if (src.depth() == CV_8U) { for (int i = radius; i < src.rows - radius; i++) for (int j = radius; j < src.cols - radius; j++) { float sum_1 = .0f, sum_2 = .0f; for (int k = 0; k < 2 * radius - 1; k++) for (int l = 0; l < 2 * radius - 1; l++) { int dis_x = radius - k; int dis_y = radius - l; int coord_x_image = i - radius + k; int coord_y_image = j - radius + l; float dis_spatial = dis_x*dis_x + dis_y*dis_y; float dis_range = (src.at<unsigned char>(i, j) - src.at<unsigned char>(coord_x_image, coord_y_image))*(src.at<unsigned char>(i, j) - src.at<unsigned char>(coord_x_image, coord_y_image)); float c_tmp = exp(-dis_spatial / (2 * sigma_d * sigma_d)); float s_tmp = exp(-dis_range / (2 * sigma_r * sigma_r)); sum_1 += c_tmp*s_tmp*src.at<unsigned char>(coord_x_image, coord_y_image); sum_2 += c_tmp*s_tmp; } dst.at<unsigned char>(i, j) = sum_1 / sum_2; } } }
3、目前是基于單通道圖像,效果如下:
原圖:
opencv 庫的效果(cv::bilateralFilter(img_src, img_dst, 10,10 * 2, 10 / 2))
該程序的效果(m_bilateralFilter(img_src, img_dst, 5, 10 * 2, 10 / 2))
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++ 數(shù)據(jù)結(jié)構(gòu)二叉樹(前序/中序/后序遞歸、非遞歸遍歷)
這篇文章主要介紹了C++ 數(shù)據(jù)結(jié)構(gòu)二叉樹(前序/中序/后序遞歸、非遞歸遍歷)的相關(guān)資料,這里提供實例代碼來幫助大家理解掌握二叉樹,需要的朋友可以參考下2017-07-07C++實現(xiàn)LeetCode(94.二叉樹的中序遍歷)
這篇文章主要介紹了C++實現(xiàn)LeetCode(94.二叉樹的中序遍歷),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07

數(shù)據(jù)結(jié)構(gòu)之數(shù)組Array實例詳解