亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++如何實現中值濾波

發布時間:2022-05-13 11:26:07 來源:億速云 閱讀:311 作者:iii 欄目:開發技術

這篇文章主要介紹了C++如何實現中值濾波的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C++如何實現中值濾波文章都會有所收獲,下面我們一起來看看吧。

中值濾波器是一種非線性濾波器,或者叫統計排序濾波器。

適用對象:帶椒鹽噪聲的圖像

由于椒鹽噪聲像素值與原圖像素值沒有關聯,隨機性較大,因此使用中值濾波可有效濾掉噪聲。

中值濾波需要對像素值進行排序,因此首先寫一個冒泡排序算法。

冒泡排序實現:

為提高效率加入標志位flag,當第i次尋找最大值時,如果相鄰兩個數均未發生互換,此時flag位為false,即說明此時數組已經按照遞增排列,可提前終止。此處應該注意flag=false所在位置,因為需要保證第i次尋找最大值過程中,遍歷到所有未參與排列的數據,所以flag=false應該放在循環條件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;  //只要發生一次交換就繼續判斷
                    int temp = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
    }    
}

中值濾波的實現:

需要注意的主要問題:

為了能夠遍歷到原圖的邊界,需要對原圖進行邊界擴充,擴充長度為(窗口的長度-1)/ 2。
注意利用窗口對擴充后的圖像遍歷時,起始的位置不是0,而是擴充的長度,因為這時對應的才是原圖的第一個像素點,同理結束的位置也是原圖的最后一個像素點。
另外為了方便將窗口內對應的像素存到容器中,可以寫兩個循環,循環長度為窗口的長度與寬度,依次將像素值存入容器中。
最后對容器內的像素按照遞增排列后,取中值賦給目標矩陣相應的位置,而此時的位置也應該用i-h,對應擴充前的位置。
經實踐證明我寫的這兩個算法可有效使用。

void medianFilter(cv::Mat& src, cv::Mat& dst, cv::Size width)
{
    //判斷窗口是否為奇數
    if (width.width % 2 == 0 || width.height % 2 == 0)
    {
        std::cout << "輸入窗口大小應該為奇數,請重新輸入" << 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++)
            {
                //定義容器存放窗口對應的像素
                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));
                    }
                }
                //對容器內存放的像素排序
                int len = width.area();
                bubble(v, len);
                //將中值賦給目標圖像對應位置
                dst.at<uchar>(i-h, j-w) = v[(len - 1) / 2];
                
            }
        }
        
    }
 
}

關于“C++如何實現中值濾波”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“C++如何實現中值濾波”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

茂名市| 龙游县| 罗源县| 永春县| 隆德县| 博湖县| 准格尔旗| 明溪县| 漳平市| 集安市| 鄂托克前旗| 四平市| 鹿泉市| 梅州市| 三河市| 德庆县| 鄂托克前旗| 塘沽区| 湘乡市| 和硕县| 虹口区| 巫溪县| 呼伦贝尔市| 石河子市| 化德县| 金湖县| 邵阳县| 象州县| 仲巴县| 黔西| 柯坪县| 都匀市| 华蓥市| 剑河县| 临高县| 吴桥县| 五家渠市| 凤冈县| 璧山县| 靖西县| 绥滨县|