CV圖像基本操作【4】——實現高斯與快速均值濾波

編程環境:

VS + OpenCV + C++
完整代碼已經更新至GitHub,歡迎fork~GitHub鏈接


聲明:創作不易,未經授權不得復制轉載
statement:No reprinting without authorization


內容:

1. 實現圖像的高斯濾波:

-通過調整高斯函數的標準差(sigma)來控制平滑程度;
-void Gaussian(const MyImage &input, MyImage &output, double sigma);
-濾波窗口大小取為[6*sigma-1],[.]表示取整;
-利用二維高斯函數的行列可分離性進行加速;
-先對每行進行一維高斯濾波,再對結果的每列進行同樣的一維高斯濾波;

2. 實現快速均值濾波

-實現圖像的均值濾波;
-濾波窗口大小通過參數來指定;
-void MeanFilter(const MyImage &input, MyImage &output, int window_size);
-采用積分圖進行加速,實現與濾波窗口大小無關的效率;

問題一:卷積核的大小問題:

通過創建進度條來動態的交互更改核的大小,其中高斯采用[6sigma-1]進度條值為sigma0.01,為保證程序能正常健壯執行,對于計算出的核大小需要檢查是否太小或為偶數:

int ksize = sigma * 6 - 1;
    if (ksize < 3) {
        cout << "ksize is too small!error" << endl;
        return;
    }
    int iRes = ksize % 2;
    if (iRes == 0) {
        ksize += 1;
}

問題二:邊緣處理

實用高斯和均值時都需考慮進行填充后才能進行濾波
常見的填充方式有三種:對稱復制填充、最邊緣復制填充、常量填充:
可以使用opencv內建的copyMakeBorder函數實現填充
不同填充效果如下;

image.png

image.png

image.png

結合效果發現對稱填充對高斯和均值濾波有更好的效果,也更符合客觀事實。

問題三:行列可分離的具體實現

描述:由于高斯函數可以寫成可分離的形式,因此可以采用可分離濾波器實現來加速。所謂的可分離濾波器,就是可以把多維的卷積化成多個一維卷積。具體到二維的高斯濾波,就是指先對行做一維卷積,再對列做一維卷積。這樣就可以將計算復雜度從O(MMNN)降到O(2MMN),M,N分別是圖像和濾波器的窗口大小。 這樣分解開來,算法的時間復雜度為O(ksize) ,運算量和濾波器的模板尺寸呈線性增長。
得到高斯濾波的一維數組,注意需要進行歸一化:

int half = ksize / 2;
    //初始化濾波核
    for (int i = 0; i < ksize; i++)
    {
        // 只需計算指數部分,高斯函數前的常數可以不用計算,會在歸一化的過程中給消去
        //以(half,half)為中心建立坐標系進行計算
        double g = exp(-(i - half) * (i - half) / (2 * sigma * sigma));
        sum += g;
        GS_filter[i] = g;
    }
    // 歸一化
    for (int i = 0; i < ksize; i++)
        GS_filter[i] /= sum;

并且需要對單通道和三通道圖像分別進行處理:

問題四:積分圖的算法實現問題

1、采用一維數組int * integral來存儲像素的積分,計算積分時注意可以使用迭代來降低復雜度,如下圖:

image.png

????Integral(i,j) = Integral(i,j-1) + prow(j)
????其中prow(j)為當前位置上的列的像素之和。
2、注意數組的大小由傳統的W * H改為 (W + 1) * (H + 1)會進一步使算法簡便,
使某個點的積分圖反映的是原圖中此位置左上角所有像素之和,這里是的累加和是不包括這個點像素本身的??梢院喕惴?,在計算時可以不用判斷是否為原圖的邊界像素,如下:

for (int yi = 1; yi < height+1; ++yi, Integral += 3 * (width + 1)) {
            //對第一列像素值單獨處理
            Integral[0] = 0;
            Integral[1] = 0;
            Integral[2] = 0;
            Vec3b rgb = src.at<Vec3b>(yi-1, 0);
            prow[0] += rgb[0];
            prow[1] += rgb[1];
            prow[2] += rgb[2];  
            Integral[3] = prow[0];
            Integral[4] = prow[1];
            Integral[5] = prow[2];      
    for (int xi = 2; xi < width+1; ++xi)
    {
            rgb = src.at<Vec3b>(yi-1, xi-1);
            prow[3*(xi-1)+0] += rgb[0];
            prow[3*(xi-1)+1] += rgb[1];
            prow[3*(xi-1)+2] += rgb[2];
    Integral[3 * xi + 0] = Integral[3 * (xi - 1) + 0] + prow[3 * (xi-1) + 0];
    Integral[3 * xi + 1] = Integral[3 * (xi - 1) + 1] + prow[3 * (xi-1) + 1];
    Integral[3 * xi + 2] = Integral[3 * (xi - 1) + 2] + prow[3 * (xi-1) + 2];
    }
}   

查閱資料,發現opencv中的內建函數也是這樣定義的:


image.png

最終實驗效果如下:


image.png

image.png

image.png

image.png

image.png

image.png

小結

圖像的濾波操作應該是圖像處理的基本操作,很多的圖像識別與分析算法都是以基本的卷積核為核心,所以掌握圖像基本卷積濾波操作還是很重要的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,698評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,202評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,742評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,580評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,297評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,688評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,693評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,875評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,438評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,183評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,384評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,931評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,612評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,022評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,297評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,093評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,330評論 2 377

推薦閱讀更多精彩內容