OpenCV入門(五)—— 關於濾波的圖像操作

OpenCV學習筆記



1. cvtColor(Mat input_img, Mat output_img , int code , int dstCn=0 );

這是一個對圖像顏色進行轉換的函數。

第一個參數 input_img 爲輸入的圖像,用Mat儲存;
第二個參數 output_img 爲輸出的圖像,用Mat儲存;
第三個參數 code 爲顏色空間轉換的代碼;
第四個參數表示的是圖像輸出的通道數,一般默認爲0。

有關顏色轉換代碼的詳細內容參考鏈接https://blog.csdn.net/cyf15238622067/article/details/82495382



2.Sobel(Mat input_img, Mat output_img , int depth, int dx, int dy );

這是一個對圖像進行平滑處理的函數,即索貝爾濾波。

sobel算子是一種常用的邊緣檢測算子,是一階的梯度算法。對噪聲具有平滑作用,提供較爲精確的邊緣方向信息,但是邊緣定位精度不夠高。

第一個參數 input_img 爲輸入的圖像,用Mat儲存;
第二個參數 output_img 爲輸出的圖像,用Mat儲存;
第三個參數爲輸出圖像的深度;
第四個參數 dx表示的是 X方向上的求導,即求 X方向的梯度,檢測出垂直方向上的邊緣;
第五個參數dy表示的是 y方向上的求導,即求 y方向的梯度,檢測出水平方向上的邊緣。

之後還有默認的一些參數 ,如:
第六個參數爲 int ksize=3 ,爲進行邊緣檢測時的內核大小爲 ksize x ksize ;
第七個參數爲 double scale=1 ,表示的是計算導數值時可選的縮放因子,默認值爲1時表示默認情況下是沒有應用縮放的;
第八個參數爲 double delta=0,表示在結果存入目標圖(第二個參數 output_img)之前可選的delta值;
第九個參數爲 int borderType=BORDER_DEFAULT表示的是邊界模式。

有關圖像深度的詳細內容參考鏈接https://blog.csdn.net/zxjor91/article/details/46584871 以及 https://blog.csdn.net/maweifei/article/details/51221259



3.createButton( “[str]” , buttonCallback , void*userdata , buttonType , int type) ;

這是一個創建按鈕的方法。

第一個參數 str爲按鈕名稱;
第二個參數buttonCallback爲回調函數,點擊該按鈕對圖像進行操作;
第三個參數爲回調用戶數據的指針;
第四個參數爲按鈕類型;
第五個參數爲複選框和單選按鈕默認的初始化類型。


OpenCV中有三個按鈕類型,具體如下:

  • QT_CHECKBOX : 複選框
  • QT_RADIOBOX : 單選框
  • QT_PUSH_BUTTON : 點擊按鍵

創建好的按鈕出現在控制面板上,每一個程序的控制面板是獨立的窗口。有以下幾種方式打開:

  1. 點擊工具欄最後一個按鈕
    在這裏插入圖片描述
  2. 通過 crtl + P 快捷鍵來打開控制面板
  3. 在窗口圖像中按右鍵並點擊” Display properties window “



4.blur( Mat input_img, Mat output_img , Size(W,H) );

這是一個均值濾波函數,對圖像進行平滑處理。

均值濾波是一種典型的線性濾波,主要是利用像素點鄰域的像素值來計算像素點的值。其具體方法是首先給出一個濾波模板kernel,該模板將覆蓋像素點周圍的其他鄰域像素點,去掉像素本身,將其鄰域像素點相加然後取平均值即爲該像素點的新的像素值,這就是均值濾波的本質。

第一個參數 input_img 爲輸入的圖像,用Mat儲存;
第二個參數 output_img 爲輸出的圖像,用Mat儲存;
第三個參數爲Size類型,表示的是 WxH 的內核大小。



5.medianBlur( Mat input_img, Mat output_img , int ksize);

這是一箇中值濾波函數,對圖像進行平滑處理。

中值濾波是一種典型的非線性濾波,是基於排序統計理論的一種能夠有效抑制噪聲的非線性信號處理技術,基本思想是用像素點鄰域灰度值的中值來代替該像素點的灰度值,讓周圍的像素值接近真實的值從而消除孤立的噪聲點,是非常經典的平滑噪聲處理方法。

第一個參數 input_img 爲輸入的圖像,用Mat儲存;
第二個參數 output_img 爲輸出的圖像,用Mat儲存;
第三個參數 ksize代表濾波模板的尺寸大小



6.bilateralFilter( Mat input_img , Mat output_img , int d , double sigmaColor , double sigmaSpace , int borderType=BORDER_DEFAULT );

這是一個雙邊濾波函數,對圖像進行平滑處理,並且能夠對圖像邊緣作出一定的保護。

雙邊濾波是一種非線性濾波,是結合圖像的空間鄰近度和像素值相似度的一種折衷處理,同時考慮空間與信息和灰度相似性。雙邊濾波器之所以能夠做到在平滑去噪的同時還能夠很好的保存邊緣,是由於其濾波器的核由兩個函數生成:空間域核和值域核。

第一個參數 input_img 爲輸入的圖像,用Mat儲存;
第二個參數 output_img 爲輸出的圖像,用Mat儲存;
第三個參數 d表示過濾過程中每個像素的領域直徑範圍;
第四個參數 sigmaColor爲顏色空間過濾器的sigma值,這個參數的值越大,表明該像素鄰域內有距離越遠的顏色會被混合到一起,產生較大的半相等顏色區域。
第五個參數 sigmaSpace爲座標空間中濾波器的sigma值,如果該值較大,則意味着越遠的像素將相互影響,從而使更大的區域中相似的顏色獲取相同的顏色。
第六個參數 borderType用於推斷圖像外部像素的某種邊界模式



7.Canny( Mat input_img , Mat output_img , double threshold1 , double threshold2 , int size=3 );

這是一個對輸入圖像進行邊緣檢測的函數,用以檢測強邊緣。

第一個參數 input_img 爲輸入的圖像,用Mat儲存;
第二個參數 output_img 爲輸出的圖像,用Mat儲存;
第三個參數 threshold1爲低閥值;
第四個參數 threshold2爲高閥值;
第五個參數 size爲Sobel算子核矩陣的大小

Canny邊緣檢測算法是一個多級邊緣檢測算法,它首先使用高斯平滑濾波器進行卷積降噪;然後使用Sobel濾波器進行處理,尋找圖像強度梯度;接着採用非極大值抑制的方法使模糊邊界變得清晰;最後採用滯後閥值來實現邊緣的去除保留。

關於滯後閥值的具體內容如下:

  • 低於 低閥值 的像素點被 去除
  • 高於 高閥值 的像素點被 保留
  • 介於 低閥值和高閥值之間 的像素點若與一個高於高閥值的像素點連接即 保留,反之則去除



8.dilate( Mat input_img , Mat output_img , Mat Kernel , Point anchor=Point(-1,-1) );

這是一個圖像形態學操作函數,使圖像膨脹。

第一個參數 input_img 爲輸入的圖像,用Mat儲存;
第二個參數 output_img 爲輸出的圖像,用Mat儲存;
第三個參數 Kernel爲濾波器內核,在形態學中稱爲結構元素;
第四個參數 anchor爲錨點的位置,默認值爲(-1,,1),即圖像中心

我們同時需要 getStructuringElement()函數 來配合第三個參數Kernel的使用。即它的作用爲構造一個結構元素,一般在dilate函數前使用。

Mat getStructuringElement(int shape,
						  Size esize, 
						  Point anchor = Point(-1, -1));

>第一個參數 shape爲內核形狀,主要有以下三種:
 1.矩形 : MORPH_RECT
 2.交叉形 : MORPH_CORSS
 3.橢圓形 : MORPH_ELLIPSE
>第二個參數 esize爲內核尺寸的大小
>第三個參數 anchor爲錨點的位置



9.erode( Mat input_img , Mat output_img , Mat Kernel , Point anchor=Point(-1,-1) );

這是一個圖像形態學操作函數,使圖像腐蝕。

第一個參數 input_img 爲輸入的圖像,用Mat儲存;
第二個參數 output_img 爲輸出的圖像,用Mat儲存;
第三個參數 Kernel爲濾波器內核,在形態學中稱爲結構元素;
第四個參數 anchor爲錨點的位置,默認值爲(-1,,1),即圖像中心


我們可以看出 dilate()函數erode()函數屬於同一類型的函數,只是作用不同,所以使用的時候只需要記憶其中一種模板就好了。不過還得注意的是,不要忘記先構造一個結構元素。



具體代碼如下

# CMakeLists.txt 文件內容
cmake_minimum_required(VERSION 2.8)
project(test8)

# add c++ standard of 11
set( CMAKE_CXX_FLAGS "-std=c++11" )

# find the library of OpenCV
find_package( OpenCV 3 REQUIRED )

# add head file
include_directories( ${OpenCV_INCLUDE_DIRS} )

add_executable( test8 test8.cpp )

#link the library of OpenCV
target_link_libraries( test8 ${OpenCV_LIBS} )

// test8.cpp 文件內容
#include<iostream>
#include<string>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;

Mat img;
bool applyGray = false ;     //轉換爲灰度圖
bool applyBlur = false ;     //模糊濾波
bool applySobel = false;     //索貝爾濾波

//檢查每個濾波的狀態變量
void applyFilters()
{
	Mat result;
	img.copyTo(result);
	if(applyGray){
		cvtColor(result , result , COLOR_BGR2GRAY);
	}
	if(applyBlur){
		blur(result , result , Size(7,7) );
	}
	if(applySobel){
		Sobel(result , result ,CV_8U , 1 , 1 );
	}
	imshow("maomi",result);
}


void grayCallback( int state, void *userdata)
{
	applyGray = true ;
   	applyFilters();
}

void bgrCallback( int state , void *userdata )
{
	applyGray = false ;
	applyFilters();
}

void blurCallback( int state , void *userdata)
{ 
	applyBlur = (bool)state;
	applyFilters();
}

void sobelCallback( int state , void *userdata)
{
	applySobel=!applySobel;
	applyFilters();
}



int main( int argc , char** argv)
{
	//讀取圖像
	img = imread("../maomi4.jpg");
	
	//創建窗口
	namedWindow("maomi");
	
	//創建按鈕
	createButton("Blur",blurCallback , NULL ,QT_CHECKBOX , 0 );
	createButton("Gray",grayCallback , NULL ,QT_RADIOBOX , 0 );
	createButton("RGB" ,bgrCallback , NULL ,QT_RADIOBOX , 1 );
	createButton("Sobel",sobelCallback , NULL ,QT_PUSH_BUTTON , 0) ;
	
	waitKey(0);
	destroyWindow("maomi");
	return 0;
}


演示結果如下


點擊Sobel按鈕,採用Sobel濾波後
在這裏插入圖片描述
採用均值濾波使圖像模糊化
在這裏插入圖片描述
採用顏色轉換使圖像灰度化
在這裏插入圖片描述要注意的是左上角的 test8 settings 即爲控制面板



文件目錄結構如下

在這裏插入圖片描述
其中的screenshot文件爲以上演示圖片。

發佈了49 篇原創文章 · 獲贊 11 · 訪問量 3063
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章