C++圖像處理之雙邊濾波
本文實(shí)例為大家分享了C++圖像處理之雙邊濾波的具體代碼,供大家參考,具體內(nèi)容如下
1、 近期在學(xué)習(xí)雙邊濾波相關(guān)知識(shí),其原理如下(以后補(bǔ)上):
2 、灰度圖雙邊濾波實(shí)現(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 庫(kù)的效果(cv::bilateralFilter(img_src, img_dst, 10,10 * 2, 10 / 2))

該程序的效果(m_bilateralFilter(img_src, img_dst, 5, 10 * 2, 10 / 2))

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)文件的生成和使用教程
庫(kù)文件是計(jì)算機(jī)上的一類文件,可以簡(jiǎn)單的把庫(kù)文件看成一種代碼倉(cāng)庫(kù),它提供給使用者一些可以直接拿來(lái)用的變量、函數(shù)和類,下面這篇文章主要給大家介紹了關(guān)于C++靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)文件的生成和使用的相關(guān)資料,需要的朋友可以參考下2023-03-03
C++?sqlite3數(shù)據(jù)庫(kù)配置使用教程
SQLite 是一種嵌入式的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),它是一個(gè)開(kāi)源項(xiàng)目,已經(jīng)被廣泛應(yīng)用于各種應(yīng)用程序和操作系統(tǒng)中,這篇文章主要介紹了C++?sqlite3數(shù)據(jù)庫(kù)配置使用,需要的朋友可以參考下2023-08-08
C++ 打開(kāi)選擇文件夾對(duì)話框選擇目錄的操作
這篇文章主要介紹了C++ 打開(kāi)選擇文件夾對(duì)話框選擇目錄的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
C語(yǔ)言從txt文件中逐行讀入數(shù)據(jù)存到數(shù)組中的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇C語(yǔ)言從txt文件中逐行讀入數(shù)據(jù)存到數(shù)組中的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12
淺析結(jié)束程序函數(shù)exit, _exit,atexit的區(qū)別
在一個(gè)程序中最多可以用atexit()注冊(cè)32個(gè)處理函數(shù),這些處理函數(shù)的調(diào)用順序與其注冊(cè)的順序相反,也即最先注冊(cè)的最后調(diào)用,最后注冊(cè)的最先調(diào)用2013-09-09
c++實(shí)現(xiàn)一個(gè)簡(jiǎn)易的網(wǎng)絡(luò)緩沖區(qū)的實(shí)踐
這篇文章主要介紹了c++實(shí)現(xiàn)一個(gè)簡(jiǎn)易的網(wǎng)絡(luò)緩沖區(qū)的實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
C++關(guān)鍵字mutable學(xué)習(xí)筆記
這篇文章主要為大家介紹了C++關(guān)鍵字mutable學(xué)習(xí)筆記,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10

