对于某些光照不均的图像,这种全局阈值分割的方法的效果明显是不是很好
自适应阈值
自适应阈值法(adaptiveThreshold),它的思想不是计算全局图像的阈值,而是根据图像不同区域亮度分布,计算其局部阈值,所以对于图像不同区域,能够自适应计算不同的阈值,因此被称为自适应阈值法。
- 全局阈值的局限性,对光照度不均匀的图像容易错误的二值化分割
- 自适应阈值对图像模糊求差值然后二值化
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main() {
Mat src = imread("D:/ps/jisoo.png");
if (src.empty())
{
cout << "could not find the image";
return -1;
}
namedWindow("input", WINDOW_FREERATIO);
imshow("input", src);
//阈值计算算法很多,基本分为两类, 全局阈值与自适应阈值
Mat gray, binary;
cvtColor(src, gray, COLOR_BGR2GRAY);
imshow("gray", gray);
Scalar m = mean(gray);//就均值
cout << "mean :" << m[0];
threshold(gray, binary, m[0], 255, THRESH_BINARY);
imshow("binary1", binary);
//OTSU阈值分割 一般优先选这个
double t1=threshold(gray, binary, m[0], 255, THRESH_BINARY|THRESH_OTSU);
imshow("binary2", binary);
//三角法
double t2 = threshold(gray, binary, m[0], 255, THRESH_BINARY|THRESH_TRIANGLE);
imshow("binary3", binary);
cout << t1 << endl;
cout << t2 << endl;
waitKey(0);
destroyAllWindows();
return 0;
}
自适应阈值方法所得图像