Part11. 阈值分割
图像分割是图像进行视觉分析和模式识别的基本前提,而阈值分割是最简单的图像分割方法。阈值分割是基于灰度值或灰度值的特性来将图像直接划分为区域,实现简单而且计算速度快。
11.1 threshold() 函数的5种处理类型
前面的文章提过,OpenCV 提供了基于灰度值的阈值分割函数 threshold(),在使用 threshold() 时先要将图像灰度化。
这个 threshold() 函数提供了 5 种阈值化类型。
THRESH_BINARY
将小于阈值的像素点灰度值置为0;大于阈值的像素点灰度值置为最大值(255)。
THRESH_BINARY_INV
将大于阈值的像素点灰度值置为0;小于阈值的像素点灰度值置为最大值(255)。
THRESH_TRUNC
小于阈值的像素点灰度值不变;大于阈值的像素点灰度值置为该阈值。
THRESH_TOZERO
大于阈值的像素点灰度值不变;小于阈值的像素点灰度值置为0
THRESH_TOZERO_INV
小于阈值的像素点灰度值不变;大于阈值的像素点置为0
下面的例子,通过获取图像的均值作为阈值,来分别展示这五种阈值分割的使用:
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace std;
using namespace cv;
int main(int argc,char *argv[])
{
Mat src = imread(".../landscape.jpg");
imshow("src",src);
Mat gray;
cvtColor(src,gray,COLOR_BGR2GRAY);
Scalar m = mean(gray);
int thresh = m[0];
Mat dst;
threshold(gray, dst,thresh,255, THRESH_BINARY);
imshow("thresh_binary",dst);
threshold(gray, dst,thresh,255, THRESH_BINARY_INV);
imshow("thresh_binary_inv",dst);
threshold(gray, dst,thresh,255, THRESH_TRUNC);
imshow("thresh_trunc",dst);
threshold(gray, dst,thresh,255, THRESH_TOZERO);
imshow("thresh_tozero",dst);