您好,登錄后才能下訂單哦!
這篇文章主要介紹了C++如何實現(xiàn)中值濾波的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C++如何實現(xiàn)中值濾波文章都會有所收獲,下面我們一起來看看吧。
中值濾波器是一種非線性濾波器,或者叫統(tǒng)計排序濾波器。
適用對象:帶椒鹽噪聲的圖像
由于椒鹽噪聲像素值與原圖像素值沒有關(guān)聯(lián),隨機性較大,因此使用中值濾波可有效濾掉噪聲。
中值濾波需要對像素值進(jìn)行排序,因此首先寫一個冒泡排序算法。
為提高效率加入標(biāo)志位flag,當(dāng)?shù)趇次尋找最大值時,如果相鄰兩個數(shù)均未發(fā)生互換,此時flag位為false,即說明此時數(shù)組已經(jīng)按照遞增排列,可提前終止。此處應(yīng)該注意flag=false所在位置,因為需要保證第i次尋找最大值過程中,遍歷到所有未參與排列的數(shù)據(jù),所以flag=false應(yīng)該放在循環(huán)條件for(int j=0; j<len-1-i; j++)的外部。
void bubble(std::vector<int> &arr, int len) { bool flag = true; for (int i = 0; i < len-1; i++) { while (flag) { flag = false; for (int j = 0; j < len - i - 1; j++) { if (arr[j + 1] < arr[j]) { flag = true; //只要發(fā)生一次交換就繼續(xù)判斷 int temp = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = temp; } } } } }
需要注意的主要問題:
為了能夠遍歷到原圖的邊界,需要對原圖進(jìn)行邊界擴充,擴充長度為(窗口的長度-1)/ 2。
注意利用窗口對擴充后的圖像遍歷時,起始的位置不是0,而是擴充的長度,因為這時對應(yīng)的才是原圖的第一個像素點,同理結(jié)束的位置也是原圖的最后一個像素點。
另外為了方便將窗口內(nèi)對應(yīng)的像素存到容器中,可以寫兩個循環(huán),循環(huán)長度為窗口的長度與寬度,依次將像素值存入容器中。
最后對容器內(nèi)的像素按照遞增排列后,取中值賦給目標(biāo)矩陣相應(yīng)的位置,而此時的位置也應(yīng)該用i-h,對應(yīng)擴充前的位置。
經(jīng)實踐證明我寫的這兩個算法可有效使用。
void medianFilter(cv::Mat& src, cv::Mat& dst, cv::Size width) { //判斷窗口是否為奇數(shù) if (width.width % 2 == 0 || width.height % 2 == 0) { std::cout << "輸入窗口大小應(yīng)該為奇數(shù),請重新輸入" << endl; exit(-1); } else { //計算邊界擴充長度 int h = (width.height - 1) / 2; int w = (width.width - 1) / 2; //對原圖邊界擴充 cv::Mat src_border; cv::copyMakeBorder(src, src_border, h, h, w, w, cv::BORDER_REFLECT_101); for (int i = h; i < src.rows + h; i++) { for (int j = w; j < src.cols + w; j++) { //定義容器存放窗口對應(yīng)的像素 std::vector <int> v; for (int ii = i - h; ii <= i + h; ii++) { for (int jj = j - w; jj <= j + w; jj++) { v.push_back(src_border.at<uchar>(ii, jj)); } } //對容器內(nèi)存放的像素排序 int len = width.area(); bubble(v, len); //將中值賦給目標(biāo)圖像對應(yīng)位置 dst.at<uchar>(i-h, j-w) = v[(len - 1) / 2]; } } } }
關(guān)于“C++如何實現(xiàn)中值濾波”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“C++如何實現(xiàn)中值濾波”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。