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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

OpenCv学习篇——图像中值滤波算法

發布時間:2024/8/1 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCv学习篇——图像中值滤波算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一.算法原理

簡單的說:以一個3*3的模板劃過一幅圖像,以像素1到像素9的中位數代替像素5的值。這種濾波的比較適合椒鹽噪聲這種情況。因為椒鹽的值無非是0或255.

二.需要知道的幾個知識點

1.希爾排序法:

由于要找到9個數中的中位數,所以需要將9個像素進行排序,當然簡單的插入排序法也可以進行排序,這里介紹一種希爾排序法。http://www.iqiyi.com/v_19rrhzyejc.html?這是當時本人學習希爾排序看的視頻。https://www.cnblogs.com/chengxiao/p/6104371.html這個帖子講的也是不錯的

希爾排序法簡單的來說選取一個步長從第一個數開始間隔步長個數選取先進行直接排序,步長不為1的時候不會得到順序排列的數組只會得到一個更加有序的數組直到步長為1的時候才能得到順序排列的數組。

uchar Median(uchar n1, uchar n2, uchar n3, uchar n4, uchar n5,uchar n6, uchar n7, uchar n8, uchar n9)
{
?uchar arr[9];
?arr[0] = n1;
?arr[1] = n2;
?arr[2] = n3;
?arr[3] = n4;
?arr[4] = n5;
?arr[5] = n6;
?arr[6] = n7;
?arr[7] = n8;
?arr[8] = n9;
?for (int gap = 9 / 2; gap > 0; gap /= 2)//希爾排序? ,確定分多少個子序列
??for (int i = gap; i < 9; ++i)
???for (int j = i - gap; j >= 0 && arr[j] > arr[j + gap]; j -= gap)
????swap(arr[j], arr[j + gap]);
?return arr[4];//返回中值?
}

如果for循環轉不出來,不要犯懶可以跟我一樣用筆轉一圈。

跟著走一圈這個排序差不多就出來了。

2.椒鹽噪聲函數

//圖像椒鹽化?
void salt(Mat &image, int num)?
{??????
?if (!image.data) return;//防止傳入空圖?
?int i, j;
?srand(time(NULL));
?for (int x = 0; x < num; ++x)
?{
??i = rand() % image.rows;
??j = rand() % image.cols;
??image.at(i, j)[0] = 255;
??image.at(i, j)[1] = 255;
??image.at(i, j)[2] = 255;
?}
}? 這個函數就是隨機在行列里產生255的值入參為一個mat 類圖像的變量和究竟要多少椒鹽點

三.程序源碼

#include
#include
#include
#include ?
#include?
using namespace cv;
using namespace std;
//求九個數的中值?
uchar Median(uchar n1, uchar n2, uchar n3, uchar n4, uchar n5,uchar n6, uchar n7, uchar n8, uchar n9)
{
?uchar arr[9];
?arr[0] = n1;
?arr[1] = n2;
?arr[2] = n3;
?arr[3] = n4;
?arr[4] = n5;
?arr[5] = n6;
?arr[6] = n7;
?arr[7] = n8;
?arr[8] = n9;
?for (int gap = 9 / 2; gap > 0; gap /= 2)//希爾排序? ,確定分多少個子序列
??for (int i = gap; i < 9; ++i)
???for (int j = i - gap; j >= 0 && arr[j] > arr[j + gap]; j -= gap)
????swap(arr[j], arr[j + gap]);
?return arr[4];//返回中值?
}

//圖像椒鹽化?
void salt(Mat &image, int num)?
{??????
?if (!image.data) return;//防止傳入空圖?
?int i, j;
?srand(time(NULL));
?for (int x = 0; x < num; ++x)
?{
??i = rand() % image.rows;
??j = rand() % image.cols;
??image.at(i, j)[0] = 255;
??image.at(i, j)[1] = 255;
??image.at(i, j)[2] = 255;
?}
}

//中值濾波函數?
void MedianFlitering(const Mat &src, Mat &dst)
{
?if (!src.data)
??return;
?Mat _dst(src.size(), src.type());
?for (int i = 0; i
??for (int j = 0; j < src.cols; ++j)
??{
???if ((i - 1) > 0 && (i + 1) < src.rows && (j - 1) > 0 && (j + 1) < src.cols)
???{
????_dst.at(i, j)[0] = Median(src.at(i, j)[0], src.at(i + 1, j + 1)[0],
?????src.at(i + 1, j)[0], src.at(i, j + 1)[0], src.at(i + 1, j - 1)[0],
?????src.at(i - 1, j + 1)[0], src.at(i - 1, j)[0], src.at(i, j - 1)[0],
?????src.at(i - 1, j - 1)[0]);
????_dst.at(i, j)[1] = Median(src.at(i, j)[1], src.at(i + 1, j + 1)[1],
?????src.at(i + 1, j)[1], src.at(i, j + 1)[1], src.at(i + 1, j - 1)[1],
?????src.at(i - 1, j + 1)[1], src.at(i - 1, j)[1], src.at(i, j - 1)[1],
?????src.at(i - 1, j - 1)[1]);
????_dst.at(i, j)[2] = Median(src.at(i, j)[2], src.at(i + 1, j + 1)[2],
?????src.at(i + 1, j)[2], src.at(i, j + 1)[2], src.at(i + 1, j - 1)[2],
?????src.at(i - 1, j + 1)[2], src.at(i - 1, j)[2], src.at(i, j - 1)[2],
?????src.at(i - 1, j - 1)[2]);
???}
???else
????_dst.at(i, j) = src.at(i, j);
??}
?_dst.copyTo(dst);//拷貝?
}


void main()

{
?Mat image = imread("fzh.jpg");

?Mat Salt_Image;
?image.copyTo(Salt_Image);
?salt(Salt_Image, 3000);

?Mat image3, image4;
?MedianFlitering(Salt_Image, image3);
?medianBlur(Salt_Image, image4, 3);
?imshow("原圖", image);
?imshow("自定義中值濾波處理后", image3);
?imshow("openCV自帶的中值濾波", image4);
?waitKey();?
}

四.實現效果圖


總結

以上是生活随笔為你收集整理的OpenCv学习篇——图像中值滤波算法的全部內容,希望文章能夠幫你解決所遇到的問題。

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