opencv简单滤波
生活随笔
收集整理的這篇文章主要介紹了
opencv简单滤波
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
歸一化塊濾波器:
OpenCV函數?blur?執行了歸一化塊平滑操作。
for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 ){ blur( src, dst, Size( i, i ), Point(-1,-1) );if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } }我們輸入4個實參 (詳細的解釋請參考 Reference):
- src: 輸入圖像
- dst: 輸出圖像
- Size( w,h ): 定義內核大小(?w?像素寬度,?h?像素高度)
- Point(-1, -1): 指定錨點位置(被平滑點), 如果是負值,取核的中心為錨點。
高斯濾波器:
OpenCV函數?GaussianBlur?執行高斯平滑 :
for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 ){ GaussianBlur( src, dst, Size( i, i ), 0, 0 );if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } }我們輸入4個實參 (詳細的解釋請參考 Reference):
- src: 輸入圖像
- dst: 輸出圖像
- Size(w, h): 定義內核的大小(需要考慮的鄰域范圍)。??和??必須是正奇數,否則將使用??和??參數來計算內核大小。
- : x 方向標準方差, 如果是??則??使用內核大小計算得到。
- : y 方向標準方差, 如果是??則??使用內核大小計算得到。.
中值濾波器:
OpenCV函數?medianBlur?執行中值濾波操作:
for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 ){ medianBlur ( src, dst, i );if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } }我們用了3個參數:
- src: 輸入圖像
- dst: 輸出圖像, 必須與?src?相同類型
- i: 內核大小 (只需一個值,因為我們使用正方形窗口),必須為奇數。
雙邊濾波器
OpenCV函數?bilateralFilter?執行雙邊濾波操作:
for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 ){ bilateralFilter ( src, dst, i, i*2, i/2 );if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } }我們使用了5個參數:
- src: 輸入圖像
- dst: 輸出圖像
- d: 像素的鄰域直徑
- : 顏色空間的標準方差
- : 坐標空間的標準方差(像素單位)
#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp"using namespace std; using namespace cv;/// 全局變量 int DELAY_CAPTION = 1500; int DELAY_BLUR = 100; int MAX_KERNEL_LENGTH = 31;Mat src; Mat dst; char window_name[] = "Filter Demo 1";/// 函數申明 int display_caption(char* caption); int display_dst(int delay);/** * main 函數 */ int main(int argc, char** argv) {namedWindow(window_name, CV_WINDOW_AUTOSIZE);/// 載入原圖像src = imread("C:/lena.jpg", 1);if (display_caption("Original Image") != 0) { return 0; }dst = src.clone();if (display_dst(DELAY_CAPTION) != 0) { return 0; }/// 使用 均值平滑if (display_caption("Homogeneous Blur") != 0) { return 0; }for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2){blur(src, dst, Size(i, i), Point(-1, -1));if (display_dst(DELAY_BLUR) != 0) { return 0; }}/// 使用高斯平滑if (display_caption("Gaussian Blur") != 0) { return 0; }for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2){GaussianBlur(src, dst, Size(i, i), 0, 0);if (display_dst(DELAY_BLUR) != 0) { return 0; }}/// 使用中值平滑if (display_caption("Median Blur") != 0) { return 0; }for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2){medianBlur(src, dst, i);if (display_dst(DELAY_BLUR) != 0) { return 0; }}/// 使用雙邊平滑if (display_caption("Bilateral Blur") != 0) { return 0; }for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2){bilateralFilter(src, dst, i, i * 2, i / 2);if (display_dst(DELAY_BLUR) != 0) { return 0; }}/// 等待用戶輸入display_caption("End: Press a key!");waitKey(0);return 0; }int display_caption(char* caption) {dst = Mat::zeros(src.size(), src.type());putText(dst, caption,Point(src.cols / 4, src.rows / 2),CV_FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255));imshow(window_name, dst);int c = waitKey(DELAY_CAPTION);if (c >= 0) { return -1; }return 0; }int display_dst(int delay) {imshow(window_name, dst);int c = waitKey(delay);if (c >= 0) { return -1; }return 0; }
總結
以上是生活随笔為你收集整理的opencv简单滤波的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像不断的腐蚀
- 下一篇: opencv 图像的腐蚀与膨胀