標籤:opencv 閾值操作
原理摘自:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/threshold/threshold.html目標:
本節簡介:
- OpenCV中的閾值(threshold)函數: threshold 的運用。
基本理論:
-
注意:
-
本節的解釋出自Bradski與Kaehler的書籍
Learning OpenCV 。
什麼是閾值?
最簡單的映像分割的方法。
應用舉例:從一副映像中利用閾值分割出我們需要的物體部分(當然這裡的物體可以是一部分或者整體)。這樣的映像分割方法是基於映像中物體與背景之間的灰階差異,而且此分割屬於像素級的分割。
為了從一副映像中提取出我們需要的部分,應該用映像中的每一個像素點的灰階值與選取的閾值進行比較,並作出相應的判斷。(注意:閾值的選取依賴於具體的問題。即:物體在不同的映像中有可能會有不同的灰階值。
一旦找到了需要分割的物體的像素點,我們可以對這些像素點設定一些特定的值來表示。(例如:可以將該物體的像素點的灰階值設定為:‘0’(黑色),其他的像素點的灰階值為:‘255’(白色);當然像素點的灰階值可以任意,但最好設定的兩種顏色對比較強,方便觀察結果)。
閾值化的類型:
OpenCV中提供了閾值(threshold)函數: threshold 。
這個函數有5種閾值化類型,在接下來的章節中將會具體介紹。
為瞭解釋閾值分割的過程,我們來看一個簡單有關像素灰階的圖片,該圖如下。該圖中的藍色水平線代表著具體的一個閾值。
閾值類型1:二進位閾值化
閾值類型2:反二進位閾值化
閾值類型3:截斷閾值化
閾值類型4:閾值化為0
閾值類型5:反閾值化為0
部分代碼:
// ConsoleApplication3_6_23.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include<opencv2/opencv.hpp>#include<iostream>using namespace std;using namespace cv;Mat src,gray,dst;int thr_value = 0;int thr_type = 0;const int max_type = 4;const int max_value = 255;const int max_binary_value = 255;char *windowName = "Demo";void Image_thred(int,void*);int _tmain(int argc, _TCHAR* argv[]){src = imread("test.png");if(!src.data)return -1;cvtColor(src,gray,CV_RGB2GRAY);namedWindow("灰階圖",CV_WINDOW_AUTOSIZE);imshow("灰階圖",gray);namedWindow(windowName,CV_WINDOW_AUTOSIZE);createTrackbar("Type: \n 0: Binary \n 1: Binary Inverted \n 2: Truncate \n 3: To Zero \n 4: To Zero Inverted",windowName,&thr_type,max_type,Image_thred);createTrackbar("Value",windowName,&thr_value,max_value,Image_thred);Image_thred(0,0);waitKey(0);return 0;}void Image_thred(int,void*){ /* 0: 二進位閾值 1: 反二進位閾值 2: 截斷閾值 3: 0閾值 4: 反0閾值 */threshold(gray,dst,thr_value,max_binary_value,thr_type);imshow(windowName,dst);}關鍵函數解釋:
threshold( src_gray, dst, threshold_value, max_BINARY_value,threshold_type );
- src_gray: 輸入的灰階映像的地址。
- dst: 輸出映像的地址。
- threshold_value: 進行閾值操作時閾值的大小。
- max_BINARY_value: 設定的最大灰階值(該參數運用在二進位與反二進位閾值操作中)。
- threshold_type: 閾值的類型。從上面提到的5種中選擇出的結果。