1.14【OpenCV圖像處理】基本閾值操作
固定閾值threshold()、5種閾值類型、閾值自動尋找方法THRESH_OTSU | type_value
1.14.1 圖像閾值 - threshold();
threshold(gray_src, dst, threshold_value, threshold_max,THRESH_BINARY); //原圖,目標圖,已知閾值,閾值最大值,閾值類型
閾值:簡單點說是把圖像分割的標尺。這個標尺是根據什麼產生的,可以用閾值產生演算法(opencv有兩個演算法)或者是自己指定一個閾值來進行分割。
如下分蘋果,大於某一像素的變為黑色,小於某一像素的變為白色,即可通過閾值把圖像分割了。
固定閾值:
threshold (
InputArray src, //輸入圖像(輸入灰度,則輸出為二值化圖)
OutputArray dst, //輸出相同通道大小類型的圖像
double thresh, //設置固定閾值
double maxval, //閾值最大值
int type //閾值類型
)
自適應閾值:(見1.12)
adaptiveThreshold(gray_src, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2); //二值化圖像,最大值,自適應閾值方法(平均或高斯),閾值類型(二值化),塊大小,常數
1.14.2 閾值處理類型
可以根據有5種閾值類型來分割(Binary segmentation二值分割)。
threshold(gray_src, dst, threshold_value, threshold_max, type_value); //閾值類型,原圖,目標圖,固定閾值,閾值最大值,閾值類型nprintf("%d", THRESH_BINARY); //0,二值化nprintf("%d", THRESH_BINARY_INV); //1,反二值化nprintf("%d", THRESH_TRUNC); //2,截斷nprintf("%d", THRESH_TOZERO); //3,取零nprintf("%dn", THRESH_TOZERO_INV); //4,反取零n
(0)閾值二值化(threshold binary)
THRESH_BINARY
threshold(gray_src, dst, threshold_value, threshold_max, THRESH_BINARY); //閾值二值化n
左下方直方圖表示圖像像素點Src(x,y)值的分布情況,藍色水平線表示閾值,大於閾值的取最大值255,小於閾值的取最小值0:
(1)閾值反二值化(threshold binary Inverted)
THRESH_BINARY_INV
左下方的圖表示圖像像素點Src(x,y)值分布情況,藍色水平線表示閾值,大於閾值的取最小值0,小於閾值的取最大值255:
(2)截斷 (truncate)
THRESH_TRUNC
左下方的圖表示圖像像素點Src(x,y)值分布情況,藍色水平線表示閾值 ,大於閾值的跟閾值相等,小於閾值的不變:
(3)閾值取零 (threshold to zero)
THRESH_TOZERO
左下方的圖表示圖像像素點Src(x,y)值分布情況,藍色水平線表示閾值,大於閾值的不變,小於閾值的取最小值0:
(4)閾值反取零 (threshold to zero inverted)
THRESH_TOZERO_INV
左下方的圖表示圖像像素點Src(x,y)值分布情況,藍色水平線表示閾值,大於閾值的取最小值0,小於閾值的不變:
1.14.3 閾值尋找方法
有2種閾值自動計算的方法,這兩種方法必須是單通道8位灰度圖像。
THRESH_OTSU otsu閾值法
THRESH_TRIANGLE 三角閾值法
threshold(gray_src, dst, 0, 255, THRESH_OTSU | type_value); //自動計算二值化otsu閾值,忽略輸入的閾值n
完整程序:
/*1.14 基本閾值操作*/n#include <opencv2/opencv.hpp>n#include <iostream> n#include <math.h>nusing namespace cv; //使用cv命名空間nnMat src, dst, gray_src;nint threshold_value = 127;nint threshold_max = 255;nint type_value = 2;nint type_max = 4;nnconst char* output_title = "binary image";nvoid Threshold_Demo(int, void*);nnint main(int argc, char** argv) { //argc 表示命令行輸入參數的個數(以空白符分隔),argv中存儲了所有的命令行參數nn src = imread("E:/OpenCV/testimage/test5.jpg");nif (src.empty()) {n printf("could not load image...n");nreturn -1;n }n namedWindow("input image", CV_WINDOW_AUTOSIZE);n namedWindow(output_title, CV_WINDOW_AUTOSIZE);n imshow("input image", src);nn createTrackbar("Threshold value", output_title, &threshold_value, threshold_max, Threshold_Demo); //創建跟蹤條,命名,窗口名,調整的值,最大值,控制的功能函數n createTrackbar("Type Value", output_title, &type_value, type_max, Threshold_Demo); //跟蹤條調整閾值類型n Threshold_Demo(0, 0);nn printf("%d", THRESH_BINARY); //0,二值化n printf("%d", THRESH_BINARY_INV); //1,反二值化n printf("%d", THRESH_TRUNC); //2,截斷n printf("%d", THRESH_TOZERO); //3,取零n printf("%dn", THRESH_TOZERO_INV); //4,反取零nn waitKey(0);nreturn 0;n}n/*閾值操作*/nvoid Threshold_Demo(int, void*) {n cvtColor(src, gray_src, CV_BGR2GRAY);n// threshold(gray_src, dst, threshold_value, threshold_max, THRESH_BINARY); //閾值二值化n// threshold(gray_src, dst, threshold_value, threshold_max, type_value); //原圖,目標圖,已知閾值,閾值最大值,閾值類型nthreshold(gray_src, dst, 0, 255, THRESH_OTSU | type_value); //自動計算閾值,忽略輸入的閾值n// threshold(gray_src, dst, 0, 255, THRESH_TRIANGLE | type_value); //自動計算三角閾值,忽略輸入的閾值n imshow(output_title, dst);n}n
運行結果:
推薦閱讀:
※亮度響應與HDR基礎
※如何讓模糊圖片變得更清晰?
※無痛理解系列---開篇
※1.7【OpenCV圖像處理】 調整圖像亮度與對比度