圖像處理(OpenCV 4.1.0 + Visual Studio 2019)

第三節:閾值分割

一、在使用Visual Studio編輯器學習C或者C++的時候,很多人都喜歡在一個項目中寫多個小程序來調試運行,因為每次新建一個項目都顯得比較繁瑣。但一個項目中包含多個main函數,項目是無法運行的。

二、解決辦法

1、首先我在該項目中建立了很多c++文件,如下圖所示

圖像處理(OpenCV 4.1.0 + Visual Studio 2019)

2、此時你只需要運行其中的一個c++文件,因此除了運行的源文件外,把其他所有的文件設置為不參與生成就可以,具體步驟如下:

2.1 對於不參與運行的c++文件,鼠標右鍵點擊屬性

圖像處理(OpenCV 4.1.0 + Visual Studio 2019)

2.2 將“從生成中排除”選項設置為是即可

圖像處理(OpenCV 4.1.0 + Visual Studio 2019)

2.3 若項目中包含很多c++ 文件,則可以使用快捷鍵shift一次性選中多個文件,進行上述操作即可。

三、閾值分割

3.1 選定下圖作為閾值分割的對象(圖像與背景相差較大,易於分割)

圖像處理(OpenCV 4.1.0 + Visual Studio 2019)

3.2 代碼如下所示:

圖像處理(OpenCV 4.1.0 + Visual Studio 2019)

3.3 按F5即可顯示結果,如下所示:

圖像處理(OpenCV 4.1.0 + Visual Studio 2019)

3.4、拖動閾值滑塊即可顯示閾值分割後的圖像(可以看出閾值在90的時候分割效果較好)

圖像處理(OpenCV 4.1.0 + Visual Studio 2019)

四、函數詳解

4.1、threshold函數:閾值分割

double cv::threshold(

InputArray src, // 輸入圖像

OutputArray dst, // 輸出圖像,即閾值操作處理後的圖像,為只有黑白的二值圖

double thresh, // 閾值

double maxval, // 最大值,設定輸出圖像灰度的最大值

int type // 閾值化操作的類型

);

參數說明

src:源圖像,可以為8位的灰度圖,也可以為32位的彩色圖像。(兩者由區別)

dst:輸出圖像

thresh:閾值

maxval:dst圖像中最大值

type:閾值類型

簡單閾值當然是最簡單,選取一個全局閾值,然後就把整幅圖像分成了非黑即白的二值圖像了。函數為cv2.threshold()
這個函數有四個參數,第一個原圖像,第二個進行分類的閾值,第三個是高於(低於)閾值時賦予的新值,第四個是一個方法選擇參數,常用的有:

cv2.THRESH_BINARY(黑白二值)

cv2.THRESH_BINARY_INV(黑白二值反轉)

cv2.THRESH_TRUNC (得到的圖像為多像素值)

cv2.THRESH_TOZERO

cv2.THRESH_TOZERO_INV

cv2.THRESH_OTSU(大津算法)

該函數有兩個返回值,第一個retVal(得到的閾值值(在後面一個方法中會用到)),第二個就是閾值化後的圖像。

4.2、createTrackbar函數:

用於創建一個可以調整數值的滑動條,函數原型如下:

CV_EXPORTS int createTrackbar(const String& trackbarname,

const String& winname,

int* value,

int count,

TrackbarCallback onChange = 0,

void* userdata = 0);

參數1:滑動條軌跡名

參數2:滑動條依附的窗口名

參數3:滑塊的位置,創建時,滑塊初始位置就是這個變量當前的值

參數4:軌跡的最大值

參數5:回調函數

參數6:默認0,用戶傳給回調函數的數據,如果第三個值為全局變量,忽略這個值.

如果使用第6個參數,則作為參數傳給回調函數的userdata

回調函數TrackbarCallback轉定義如下

typedef void (*TrackbarCallback)(int pos, void* userdata);

參數1:其中第一個參數是跟蹤欄位置

參數2:第二個參數是用戶數據,如果回調函數是NULL指針,則不會調用回調函數,而只會更新值(比如窗口中的圖像數據地址)

(*TrackbarCallback)為函數void (int pos,void* userdata)的別名

onChange 為 TrackbarCallback類型的一個變量。關係如下:

圖像處理(OpenCV 4.1.0 + Visual Studio 2019)

地址1 = TrackbarCallback;變量1 = onChange;函數入口 = void (int pos,void* userdata) 的函數變量名;函數體 = void (int pos,void* userdata);

(*TrackbarCallback) = 變量1 = 函數體 ;也就是說賦給函數指針的函數應該和函數指針所指的函數原型是一致的

所以回調函數聲明應為 void onChange(int,void*)。

4.3、namedWindow函數:新建一個顯示窗口,指定窗口的類型

void namedWindow(const string& winname, int flags = WINDOW_AUTOSIZE) ;

參數1:新建的窗口的名稱。自己隨便取。

參數2:窗口的標識,一般默認為WINDOW_AUTOSIZE 。

WINDOW_AUTOSIZE 窗口大小自動適應圖片大小,並且不可手動更改。(上面圖1就是使用的它)

WINDOW_NORMAL 用戶可以改變這個窗口大小(上面圖2就是使用的它)

WINDOW_OPENGL 窗口創建的時候會支持OpenGL

4.4、cvtColor函數:

用於將圖像從一個顏色空間轉換到另一個顏色空間的轉換(目前常見的顏色空間均支持),並且在轉換的過程中能夠保證數據的類型不變,即轉換後的圖像的數據類型和位深與源圖像一致。

具體調用形式如下:

void cv::cvtColor(

cv::InputArray src, // 輸入序列

cv::OutputArray dst, // 輸出序列

int code, // 顏色映射碼

int dstCn = 0 // 輸出的通道數 (0='automatic')

);

其中,最後一個參數dstCn用於指定目標圖像的通道數,如果指定的值是默認值0,那麼通道數將由輸入圖像和顏色轉換碼決定。

cv::cvtColor()支持多種顏色空間之間的轉換,其支持的轉換類型和轉換碼如下:

1、RGB和BGR(opencv默認的彩色圖像的顏色空間是BGR)顏色空間的轉換:

cv::COLOR_BGR2RGB

cv::COLOR_RGB2BGR

cv::COLOR_RGBA2BGRA

cv::COLOR_BGRA2RGBA

2、向RGB和BGR圖像中增添alpha通道:

cv::COLOR_RGB2RGBA

cv::COLOR_BGR2BGRA

3、從RGB和BGR圖像中去除alpha通道:

cv::COLOR_RGBA2RGB

cv::COLOR_BGRA2BGR

4、從RBG和BGR顏色空間轉換到灰度空間:

cv::COLOR_RGB2GRAY

cv::COLOR_BGR2GRAY

cv::COLOR_RGBA2GRAY

cv::COLOR_BGRA2GRAY

5、從灰度空間轉換到RGB和BGR顏色空間

cv::COLOR_GRAY2RGB

cv::COLOR_GRAY2BGR

cv::COLOR_GRAY2RGBA

cv::COLOR_GRAY2BGRA

6、RGB和BGR顏色空間與BGR565顏色空間之間的轉換

cv::COLOR_RGB2BGR565

cv::COLOR_BGR2BGR565

cv::COLOR_BGR5652RGB

cv::COLOR_BGR5652BGR

cv::COLOR_RGBA2BGR565

cv::COLOR_BGRA2BGR565

cv::COLOR_BGR5652RGBA

cv::COLOR_BGR5652BGRA

7、灰度空間域BGR565之間的轉換

cv::COLOR_GRAY2BGR555

cv::COLOR_BGR5552GRAY

8、RGB和BGR顏色空間與CIE XYZ之間的轉換

cv::COLOR_RGB2XYZ

cv::COLOR_BGR2XYZ

cv::COLOR_XYZ2RGB

cv::COLOR_XYZ2BGR

9、RGB和BGR顏色空間與uma色度(YCrCb空間)之間的轉換

cv::COLOR_RGB2YCrCb

cv::COLOR_BGR2YCrCb

cv::COLOR_YCrCb2RGB

cv::COLOR_YCrCb2BGR

10、RGB和BGR顏色空間與HSV顏色空間之間的相互轉換

cv::COLOR_RGB2HSV

cv::COLOR_BGR2HSV

cv::COLOR_HSV2RGB

cv::COLOR_HSV2BGR

11、RGB和BGR顏色空間與HLS顏色空間之間的相互轉換

cv::COLOR_RGB2HLS

cv::COLOR_BGR2HLS

cv::COLOR_HLS2RGB

cv::COLOR_HLS2BGR

12、RGB和BGR顏色空間與CIE Lab顏色空間之間的相互轉換

cv::COLOR_RGB2Lab

cv::COLOR_BGR2Lab

cv::COLOR_Lab2RGB

cv::COLOR_Lab2BGR

13、RGB和BGR顏色空間與CIE Luv顏色空間之間的相互轉換

cv::COLOR_RGB2Luv

cv::COLOR_BGR2Luv

cv::COLOR_Luv2RGB

cv::COLOR_Luv2BGR

14、Bayer格式(raw data)向RGB或BGR顏色空間的轉換

cv::COLOR_BayerBG2RGB

cv::COLOR_BayerGB2RGB

cv::COLOR_BayerRG2RGB

cv::COLOR_BayerGR2RGB

cv::COLOR_BayerBG2BGR

cv::COLOR_BayerGB2BGR

cv::COLOR_BayerRG2BGR

cv::COLOR_BayerGR2BGR

謝謝支持,歡迎交流


分享到:


相關文章: