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圖像處理】 調整圖像亮度與對比度

TAG:OpenCV | 计算机视觉 | 图像处理 |