threshold(
cv::InputArray src, // 输入图像
cv::OutputArray dst, // 输出图像
double thresh, // 阈值
double maxValue, // 向上最大值
int thresholdType // 阈值化操作的类型
);
几种操作类型,前五个对应下面原理图:
THRESH_BINARY 普通二值化
THRESH_BINARY_INV 普通二值化——取反
THRESH_TRUNC 截取峰值二值化
THRESH_TOZERO 取零二值化
THRESH_TOZERO_INV 取零二值化——取反
THRESH_OTSU 使用Otsu原理确定最优阀值大小
THRESH_TRIANGLE 使用三角函数原理确定最优阀值大小
原理图
#include <opencv2/opencv.hpp>
#include <stdio.h>
#include <stdlib.h>
using namespace cv;
using namespace std;
char file[] = "1.jpg";
int main(int argc, char** argv)
{
Mat img = imread(file, -1);
pyrDown(img, img, Size(img.cols/2, img.rows/2));
cvtColor(img, img, CV_BGR2GRAY);
imshow("1",img);
Mat out;
threshold(img, out, 127, 255, THRESH_BINARY);
imshow("2",out);imwrite("2.jpg", out);
threshold(img, out, 0, 255, THRESH_OTSU | THRESH_BINARY_INV);//使用Otsu方法确定最优阀值,但是选取的阀值方法需要这样填写
imshow("3",out);imwrite("3.jpg", out);
waitKey();
return 1;
}
2.jpg
3.jpg
adaptiveThreshold(
InputArray src, //源图像
OutputArray dst, //输出图像,与源图像大小一致
double maxValue, //最大值
int adaptiveMethod, //在一个邻域内计算阈值所采用的算法。
ADAPTIVE_THRESH_MEAN_C的计算方法是计算出领域的平均值再减去第七个参数double C的值
ADAPTIVE_THRESH_GAUSSIAN_C的计算方法是计算出领域的高斯均值再减去第七个参数double C的值
int thresholdType, //这是阈值类型,只有两个取值,分别为 THRESH_BINARY 和THRESH_BINARY_INV
int blockSize, //adaptiveThreshold的计算单位是像素的邻域块,邻域块取多大,就由这个值作决定
double C//这个参数实际上是一个偏移值调整量
);
#include <opencv2/opencv.hpp>
#include <stdio.h>
#include <stdlib.h>
using namespace cv;
using namespace std;
char file[] = "1.jpg";
int main(int argc, char** argv)
{
Mat img = imread(file, -1);
pyrDown(img, img, Size(img.cols/2, img.rows/2));
cvtColor(img, img, CV_BGR2GRAY);
imshow("1",img);
Mat out;
adaptiveThreshold(img, out, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 9, 0);
imshow("4",out);imwrite("4.jpg", out);
waitKey();
return 1;
}
4.jpg