1 基于阈值
1.1 原理
灰度阈值化,是最简单且速度最快的图像分割方法,广泛应用在硬件图像处理领域 (例如,基于 FPGA 的实时图像处理)。
假设输入图像为 f,输出图像为 g,则阈值化公式如下:
g(i,j)={10当 f(i, j) ≥ T 时当 f(i, j) < T 时
也即,遍历图像中的所有像素,当像素值 f (i, j) ≥ T 时,分割后的图像元素 g (i, j) 是物体像素,否则为背景像素。
1.2 适用范围
当各个物体之间不接触,且物体灰度和背景灰度之间差别比较明显时,灰度阈值化是非常合适的分割方法。
1.3 cv::threshold 函数
OpenCV 中的阈值化函数为 threshold,其使用如下所示:
double cv::threshold ( InputArray src, // 输入图像 (单通道,8位或32位浮点型) OutputArray dst, // 输出图像 (大小和类型,都同输入) double thresh, // 阈值 double maxval, // 最大灰度值(使用 THRESH_BINARY 和 THRESH_BINARY_INV类型时) int type // 阈值化类型(THRESH_BINARY, THRESH_BINARY_INV; THRESH_TRUNC; THRESH_TOZERO, THRESH_TOZERO_INV) )
1) THRESH_BINARY
dst(x,y)={maxval0if src(x, y) > threshotherwise
2) THRESH_TRUNC
dst(x,y)={thresholdsrc(x,y)if src(x, y) > threshotherwise
3) THRESH_TOZERO
dst(x,y)={src(x,y)0if src(x, y) > threshotherwise
1.4 示例
下面是阈值化类型和阈值可选的代码示例,摘自 OpenCV 例程,略作修改
#include "opencv2/imgproc.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui.hpp" using namespace cv; int threshold_value = 0; int threshold_type = 3; int const max_value = 255; int const max_type = 4; int const max_BINARY_value = 255; Mat src, src_gray, dst; const char* window_name = "Threshold Demo"; const char* trackbar_type = "Type: \n 0: Binary \n 1: Binary Inverted \n 2: Truncate \n 3: To Zero \n 4: To Zero Inverted"; const char* trackbar_value = "Value"; void Threshold_Demo(int, void*); int main( int, char** argv ) { // 读图 src = imread("Musikhaus.jpg",IMREAD_COLOR); if( src.empty() ) return -1; // 转化为灰度图 cvtColor( src, src_gray, COLOR_BGR2GRAY ); // 显示窗口 namedWindow( window_name, WINDOW_AUTOSIZE ); // 滑动条 - 阈值化类型 createTrackbar( trackbar_type, window_name, &threshold_type,max_type,Threshold_Demo); // 滑动条 - 阈值 createTrackbar( trackbar_value,window_name, &threshold_value,max_value,Threshold_Demo); Threshold_Demo(0, 0); waitKey(0); } void Threshold_Demo(int, void*) { /* 0: Binary 1: Binary Inverted 2: Threshold Truncated 3: Threshold to Zero 4: Threshold to Zero Inverted */ threshold(src_gray, dst, threshold_value, max_BINARY_value, threshold_type); imshow(window_name, dst); }