阈值分割5种方法
寻找阈值2种方法
double cv::threshold (InputArray src,
OutputArray dst,
double thresh,
double maxval,
int type
)
参数 | 含义 |
---|---|
src | 输入,要求是单通道图像 |
thresh | 门限值 |
maxval | 超过门限的像素被赋予的新值 |
type | 处理算法类别 |
type的取值
类型 | 含义 |
---|---|
THRESH_BINARY | 超过thresh的像素被设为maxval, 其他被设为0 |
THRESH_BINARY_INV | 相反 |
THRESH_TRUNC | 超过thresh的像素被设为maxval, 其他不变 |
THRESH_TOZERO | 超过thresh的像素不变, 其他设为0 |
THRESH_TOZERO_INV | 相反 |
THRESH_OTSU | flag, use Otsu algorithm to choose the optimal threshold value |
THRESH_TRIANGLE | flag, use Triangle algorithm to choose the optimal threshold value |
THRESH_OTSU和THRESH_TRIANGLE和前面的type可以组合使用,好处是不用自己指定thresh值,系统会进行计算并且作为返回值返回。
THRESH_OTSU文档上说如果图像黑白分明,就可以用这个。
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
Mat src, gray_src, dst;
int threshold_value = 127;
int threshold_max = 255;
int type_value = 2;
int type_max = 4;
const char* output_title = "binary image";
void Threshold_Demo(int, void*);
int main(int argc, char** argv) {
src = imread("C:/Users/Luyubo/Pictures/lena.jpg");
if (!src.data) {
printf("could not load image...\n");
return -1;
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
namedWindow(output_title, CV_WINDOW_AUTOSIZE);
imshow("input image", src);
createTrackbar("Threshold Value:", output_title, &threshold_value, threshold_max, Threshold_Demo);
createTrackbar("Type Value:", output_title, &type_value, type_max, Threshold_Demo);
Threshold_Demo(0, 0);
waitKey(0);
return 0;
}
void Threshold_Demo(int, void*) {
cvtColor(src, gray_src, CV_BGR2GRAY);
threshold(gray_src, dst, 0, 255, THRESH_TRIANGLE | type_value);//自动计算阈值,不可调节阈值,可以调节阈值分割类型。
//threshold(gray_src, dst, threshold_value, threshold_max, type_value);可以调节阈值,可以调节阈值分割类型。
imshow(output_title, dst);
}