第三節:閾值分割
一、在使用Visual Studio編輯器學習C或者C++的時候,很多人都喜歡在一個項目中寫多個小程序來調試運行,因為每次新建一個項目都顯得比較繁瑣。但一個項目中包含多個main函數,項目是無法運行的。
二、解決辦法
1、首先我在該項目中建立了很多c++文件,如下圖所示
2、此時你只需要運行其中的一個c++文件,因此除了運行的源文件外,把其他所有的文件設置為不參與生成就可以,具體步驟如下:
2.1 對於不參與運行的c++文件,鼠標右鍵點擊屬性
2.2 將“從生成中排除”選項設置為是即可
2.3 若項目中包含很多c++ 文件,則可以使用快捷鍵shift一次性選中多個文件,進行上述操作即可。
三、閾值分割
3.1 選定下圖作為閾值分割的對象(圖像與背景相差較大,易於分割)
3.2 代碼如下所示:
3.3 按F5即可顯示結果,如下所示:
3.4、拖動閾值滑塊即可顯示閾值分割後的圖像(可以看出閾值在90的時候分割效果較好)
四、函數詳解
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類型的一個變量。關係如下:
地址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
謝謝支持,歡迎交流