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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

opencv 线性滤波器

發(fā)布時間:2025/4/16 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv 线性滤波器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
  • 用OpenCV函數(shù)?filter2D?創(chuàng)建自己的線性濾波器。

原理

Note

?

以下解釋節(jié)選自Bradski and Kaehler所著?Learning OpenCV?。

卷積

高度概括地說,卷積是在每一個圖像塊與某個算子(核)之間進(jìn)行的運算。

核是什么?

核說白了就是一個固定大小的數(shù)值數(shù)組。該數(shù)組帶有一個?錨點?,一般位于數(shù)組中央。

如何用核實現(xiàn)卷積?

假如你想得到圖像的某個特定位置的卷積值,可用下列方法計算:

  • 將核的錨點放在該特定位置的像素上,同時,核內(nèi)的其他值與該像素鄰域的各像素重合;
  • 將核內(nèi)各值與相應(yīng)像素值相乘,并將乘積相加;
  • 將所得結(jié)果放到與錨點對應(yīng)的像素上;
  • 對圖像所有像素重復(fù)上述過程。
  • 用公式表示上述過程如下:

    幸運的是,我們不必自己去實現(xiàn)這些運算,OpenCV為我們提供了函數(shù)?filter2D?。

    代碼

  • 下面這段程序做了些什么?

    • 載入一幅圖像

    • 對圖像執(zhí)行?歸一化塊濾波器?。舉例來說,如果該濾波器核的大小為??,則它會像下面這樣:

      程序?qū)?zhí)行核的大小分別為3、5、7、9、11的濾波器運算。

    • 該濾波器每一種核的輸出將在屏幕上顯示500毫秒

  • 本教程代碼所示如下。你也可以從?這里?下載。

  • #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include <stdlib.h> #include <stdio.h>using namespace cv;/** @函數(shù)main */ int main ( int argc, char** argv ) {/// 聲明變量Mat src, dst;Mat kernel;Point anchor;double delta;int ddepth;int kernel_size;char* window_name = "filter2D Demo";int c;/// 載入圖像src = imread( argv[1] );if( !src.data ){ return -1; }/// 創(chuàng)建窗口namedWindow( window_name, CV_WINDOW_AUTOSIZE );/// 初始化濾波器參數(shù)anchor = Point( -1, -1 );delta = 0;ddepth = -1;/// 循環(huán) - 每隔0.5秒,用一個不同的核來對圖像進(jìn)行濾波int ind = 0;while( true ){c = waitKey(500);/// 按'ESC'可退出程序if( (char)c == 27 ){ break; }/// 更新歸一化塊濾波器的核大小kernel_size = 3 + 2*( ind%5 );kernel = Mat::ones( kernel_size, kernel_size, CV_32F )/ (float)(kernel_size*kernel_size);/// 使用濾波器filter2D(src, dst, ddepth , kernel, anchor, delta, BORDER_DEFAULT );imshow( window_name, dst );ind++;}return 0; }

    說明

  • 載入一幅圖像

    src = imread( argv[1] );if( !src.data ){ return -1; }
  • 創(chuàng)建窗口以顯示結(jié)果

    namedWindow( window_name, CV_WINDOW_AUTOSIZE );
  • 初始化線性濾波器的參數(shù)

    anchor = Point( -1, -1 ); delta = 0; ddepth = -1;
  • 執(zhí)行無限循環(huán)。在循環(huán)中,我們更新了核的大小,并將線性濾波器用在輸入圖像上。下面,我們詳細(xì)分析一下該循環(huán):

  • 首先,我們定義濾波器要用到的核。像下面這樣:

    kernel_size = 3 + 2*( ind%5 ); kernel = Mat::ones( kernel_size, kernel_size, CV_32F )/ (float)(kernel_size*kernel_size);

    第一行代碼將?核的大小?設(shè)置為??范圍內(nèi)的奇數(shù)。第二行代碼把1填充進(jìn)矩陣,并執(zhí)行歸一化——除以矩陣元素數(shù)——以構(gòu)造出所用的核。

  • 將核設(shè)置好之后,使用函數(shù)?filter2D?就可以生成濾波器:

    filter2D(src, dst, ddepth , kernel, anchor, delta, BORDER_DEFAULT );

    其中各參數(shù)含義如下:

  • src: 源圖像
  • dst: 目標(biāo)圖像
  • ddepth:?dst?的深度。若為負(fù)值(如??),則表示其深度與源圖像相等。
  • kernel: 用來遍歷圖像的核
  • anchor: 核的錨點的相對位置,其中心點默認(rèn)為?(-1, -1)?。
  • delta: 在卷積過程中,該值會加到每個像素上。默認(rèn)情況下,這個值為??。
  • BORDER_DEFAULT: 這里我們保持其默認(rèn)值,更多細(xì)節(jié)將在其他教程中詳解
  • #. 我們在程序里寫了個?while?循環(huán)。每隔500毫秒,濾波器的核將在我們所指定的范圍內(nèi)更新。 結(jié)果 ========

  • 編譯好上述代碼之后,輸入圖像路徑的參數(shù),我們就可以執(zhí)行這個程序。其輸出結(jié)果是一個窗口,其中顯示了由歸一化濾波器模糊之后的圖像。每過0.5秒,濾波器核的大小會有所變化,如你在下面幾張圖像中所見:

  • 總結(jié)

    以上是生活随笔為你收集整理的opencv 线性滤波器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。