一、二值化
二值化是将一张单通道的图像中的像素分别设为0或者255 的操作,在数字图像处理的过程中这个一部分是很重要的,halcon 中有9个二值化的算子,每个用法都有各自的优势,这个等后面复习halcon 的时候再总结一下,然后和Opencv的二值化做一个对比,这里只说threshold和adaptiveThreshold算子
二、全局固定二值化-threshold
double threshold(
const Mat& src, // 必须是 8/32 位的图像
Mat& dst,
double thresh, // 手动输入的阈值0-255
double maxVal, // 最大阈值 一般都是255
int thresholdType // 这个是最重要的一个参数:阈值类型,有如下几个类型:
src(x,y) 表示原图的(x,y)点的像素值,thresh,手动输入的参数值,maxVal 最大值:
THRESH_BINARY:src(x,y)>thresh?maxVal:0;
THRESH_BINARY_INV:src(x,y)>thresh?0:maxVal;
THRESH_TRUNC: src(x,y)>thresh?thresh:src(x,y);(大于阈值=阈值,其他不变)
THRESH_TOZERO:src(x,y)>thresh?src(x,y):0;(大于阈值=原值,其他0)
THRESH_TOZERO_INV:src(x,y)>thresh?0:src(x,y);
THRESH_OTSU:不支持32位的,只支持8位的,非常适合有双峰的图像,
THRESH_TRIANGLE:不支持32位的,只支持8位的,适合单个波峰
)
代码显示如下:
int type_value = 2;
int type_Max = 5;
Mat src, src_gray, dest1, dest2;
int threshold_value = 127;
int threshold_max = 255;
const char* output_litle = "Binary_out_demo";
void Threshold_Demo(int, void*);
void Threshold_Demo(int, void*)
{
cvtColor(src, src_gray, CV_BGR2GRAY);
threshold(src_gray, dest1, threshold_value, threshold_max, type_value);
imshow(output_litle, dest1);
}
int main(int args, char* arg)
{
// point
src = imread("C:\\Users\\19473\\Desktop\\opencv_images\\88.jpg");
if (!src.data)
{
printf("could not load image....\n");
}
//1 显示灰色图像
namedWindow("input_demo", CV_WINDOW_AUTOSIZE);
namedWindow(output_litle, CV_WINDOW_AUTOSIZE);
imshow("input_demo", src);
createTrackbar("Threshold Value:", output_litle, &threshold_value, threshold_max, Threshold_Demo);
createTrackbar("Threshold Model:", output_litle, &type_value, type_Max, Threshold_Demo);
Threshold_Demo(0, 0);
waitKey(0);
return -1;
}
三、局部自动阈值
adaptiveThreshold(
InputArray src, // 必须是8位的图像
OutputArray dst,
double local,// 局部的阈值,0-255
int adaptiveMethod, // 在邻域块中计算阈值用的方法,有两个:
ADAPTIVE_THRESH_MEAN_C:表示计算出领域的 平均值 -C(输入的第七个参数)
ADAPTIVE_THRESH_GAUSSIAN_C:表示计算出领域的 高斯均值 - C(输入的第七个参数)
int thresholdType, // 阈值类型,有两个类型:
THRESH_BINARY: src(x,y)>local?255:0;
THRESH_BINARY_INV :与THRESH_BINARY 相反
int blockSize, // 邻域块的大小,奇数
double C // 是一个偏移量
)
图像显示
代码显示
int block_size = 10;
int size_Max = 40;
Mat src, src_gray, dest1, dest2;
int local_threshold_value = 127;
int local_threshold_max = 255;
const char* output_litle = "Binary_out_demo";
void adaptiveThreshold_Demo(int, void*);
void adaptiveThreshold_Demo(int, void*)
{
cvtColor(src, src_gray, CV_BGR2GRAY);
src_gray.convertTo(src_gray, CV_8UC1);
int size_s = 2 * block_size + 1;
adaptiveThreshold(src_gray, dest1, local_threshold_value, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, size_s,10);
imshow(output_litle, dest1);
}
int main(int args, char* arg)
{
// point
src = imread("C:\\Users\\19473\\Desktop\\opencv_images\\88.jpg");
if (!src.data)
{
printf("could not load image....\n");
}
//1 显示灰色图像
namedWindow("input_demo", CV_WINDOW_AUTOSIZE);
namedWindow(output_litle, CV_WINDOW_AUTOSIZE);
imshow("input_demo", src);
createTrackbar("local Value:", output_litle, &local_threshold_value, 255, adaptiveThreshold_Demo);
createTrackbar("local Model:", output_litle, &block_size, size_Max, adaptiveThreshold_Demo);
adaptiveThreshold_Demo(0, 0);
waitKey(0);
return -1;
}
待续。。。。。。