1.简介
- 图像阈值化是图像处理的重要基础部分,应用很广泛,可以根据灰度差异来分割图像不同部分
- 阈值化处理的图像―般为单通道图像(厌度图)阈值化参数的设置可以使用滑动条来debug阈值化处理易光照影响,处理时应注意
threshold是固定阈值,就是根据这个点的像素值把它装换成对于的值
adaptiveThreshold是自适应阈值,它可以根据周围点的像素值来对于调整这个点的像素值
面对阈值化时最好做Trackbar来看一下效果
2.threshold
2.1api
threshold(src_gray, dst, threshold_value, max_BINARY_value,threshold_type );
//src_gray: 输入的灰度图像的地址。
//dst: 输出图像的地址。
//threshold_value: 进行阈值操作时阈值的大小。
//max_BINARY_value: 设定的最大灰度值(该参数运用在二进制与反二进制阈值操作中)。
//threshold_type: 阈值的类型。从下面提到的5种中选择出的结果。
threshold_type类型:
2.2代码演示
Mat srcImg = imread("E:\\OpenCV\\images\\lf.jpg",0);
Mat dstImg;
threshold(srcImg, dstImg, 100, 255, THRESH_BINARY);
imshow("dst", dstImg);
imshow("img", srcImg);
waitKey(0);
3.adaptiveThreshold自适应阈值
3.1api
void adaptiveThreshold( InputArray src, OutputArray dst, double maxValue, int adaptiveMethod,int thresholdType, int blockSize, double C );
参数1:InputArray类型的src,输入图像,填单通道,单8位浮点类型Mat即可。
参数2:函数运算后的结果存放在这。即为输出图像(与输入图像同样的尺寸和类型)。
参数3:预设满足条件的最大值。
参数4:指定自适应阈值算法。可选择ADAPTIVE_THRESH_MEAN_C 或 ADAPTIVE_THRESH_GAUSSIAN_C两种。
ADAPTIVE_THRESH_MEAN_C,为局部邻域块的平均值。该算法是先求出块中的均值,再减去常数C。
ADAPTIVE_THRESH_GAUSSIAN_C ,为局部邻域块的高斯加权和。该算法是在区域中(x,y)周围的像素根据高斯函数按照他们离中心点的距离进行加权计算, 再减去常数C。
参数5:指定阈值类型。可选择THRESH_BINARY或者THRESH_BINARY_INV两种。(即二进制阈值或反二进制阈值)。
参数6:表示邻域块大小,用来计算区域阈值,一般选择为3、5、7......等。
参数7:参数C表示与算法有关的参数,它是一个从均值或加权均值提取的常数,可以是负数。
3.2代码演示
Mat srcImg = imread("E:\\OpenCV\\images\\lf.jpg",0);
Mat dstImg;
adaptiveThreshold(srcImg, dstImg, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 3,0);
imshow("dst", dstImg);
imshow("img", srcImg);
waitKey(0);
4.Trackbar下阈值效果展示
#include "opencv2/opencv.hpp"
using namespace cv;
Mat srcImg, dstImg;
Mat dstImg2;
int thres_min = 20;
int block_size = 3;
int C0 = 3;
void OnThreshold(int, void* )
{
threshold(srcImg, dstImg, thres_min, 255, CV_THRESH_BINARY);
imshow("src", srcImg);
imshow("固定阈值", dstImg);
}
void OnAdaptiveThreshold(int, void* )
{
if(block_size % 2==0) //如果block_size是偶数
block_size++;
adaptiveThreshold(srcImg, dstImg2, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY_INV, block_size, C0);
imshow("自适应阈值", dstImg2);
}
void main()
{
srcImg = imread("0.bmp", 0); //以灰度模式读取
medianBlur(srcImg, srcImg, 5);
namedWindow("固定阈值", CV_WINDOW_AUTOSIZE);
namedWindow("自适应阈值", CV_WINDOW_AUTOSIZE);
//cvtColor(srcImg, dstImg, CV_BGR2GRAY);
//threshold(srcImg, dstImg, 100, 255, CV_THRESH_BINARY);
//threshold(srcImg, dstImg, 100, 255, CV_THRESH_BINARY_INV);
//threshold(srcImg, dstImg, 100, 255, CV_THRESH_TRUNC);
//threshold(srcImg, dstImg, 100, 255, CV_THRESH_TOZERO);
//threshold(srcImg, dstImg, 100, 255, CV_THRESH_TOZERO_INV);
//adaptiveThreshold(srcImg, dstImg, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY, 11, 5);
//adaptiveThreshold(srcImg, dstImg, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 11, 5);
createTrackbar("Threshold", "固定阈值", &thres_min, 255, OnThreshold, 0);
createTrackbar("Block_Size", "自适应阈值", &block_size, 255,OnAdaptiveThreshold, 0);
createTrackbar("C", "自适应阈值", &C0, 255, OnAdaptiveThreshold, 0);
OnThreshold(thres_min, 0); //回调函数初始化
OnAdaptiveThreshold(block_size, 0);
OnAdaptiveThreshold(C0, 0);
//imshow("src", srcImg);
//imshow("dst", dstImg);
waitKey(0);
}