引言
在图像处理中,二值化是一种常见的操作,它将图像中的像素值转换为 0 或 1,从而将图像分为黑白两部分。二值化在许多应用中非常有用,例如图像分割、目标检测、字符识别等。opencv 是一个功能强大的图像处理库,提供了多种二值化方法,本文将介绍其中的一些常用方法。
opencv 中的二值化方法
1.阈值二值化:通过设定一个阈值,将图像中的像素值与阈值进行比较,大于阈值的像素值设置为 1,小于阈值的像素值设置为 0。
2.自适应二值化:根据图像的局部特征自动确定阈值,从而适应不同亮度和对比度的图像。
3.基于直方图二值化:otsu法和三角形法基于直方图的二值化方法,它可以自动选择一个最优的阈值,使得类间方差最大。
opencv 中提供了多种图像二值化的函数,以下是两种常用的函数的详细介绍:
-
threshold()函数:- 函数原型:
threshold(src, thresh, maxval, type) - 参数说明:
src:输入图像,可以是灰度图像或彩色图像。thresh:阈值。maxval:最大值,通常为 255。type:二值化操作的类型,常用的有以下几种:thresh_binary:大于阈值的像素值设置为最大值,小于阈值的像素值设置为 0。thresh_binary_inv:大于阈值的像素值设置为 0,小于阈值的像素值设置为最大值。thresh_trunc:大于阈值的像素值设置为阈值,小于阈值的像素值保持不变。thresh_tozero:大于阈值的像素值保持不变,小于阈值的像素值设置为 0。thresh_tozero_inv:大于阈值的像素值设置为 0,小于阈值的像素值保持不变。
- 函数返回值:
retval:返回的阈值。dst:二值化后的图像。
- 函数原型:
-
adaptivethreshold()函数:- 函数原型:
adaptivethreshold(src, maxvalue, adaptivemethod, thresholdtype, blocksize, c) - 参数说明:
src:输入图像。maxvalue:最大值,通常为 255。adaptivemethod:自适应二值化的方法,常用的有以下两种:cv2.adaptive_thresh_mean_c:使用邻域的平均值作为阈值。cv2.adaptive_thresh_gaussian_c:使用邻域的高斯加权平均值作为阈值。
thresholdtype:二值化操作的类型,与cv2.threshold()函数相同。blocksize:邻域的大小,通常为奇数。c:常数,用于调整阈值。
- 函数返回值:
dst:二值化后的图像。
- 函数原型:
这两种函数的主要区别在于二值化的方式不同。threshold() 函数是基于全局阈值的二值化方法,需要手动指定阈值。而 adaptivethreshold() 函数是基于局部阈值的二值化方法,它根据图像的局部特征自动确定阈值,适用于光照不均匀或有噪声的图像。
在实际应用中,选择合适的二值化函数取决于图像的特点和需求。如果图像的光照比较均匀,可以使用 threshold() 函数;如果图像的光照不均匀或有噪声,可用 adaptivethreshold() 函数。
下面是示例代码:
mat image = imread("d:\\pycharmyunxing\\venv\\image1.png");
if (image.empty())
{
cout << "wenjianwei1.empty" << endl;
return -1;
}
imshow("yuantu", image);
mat grayimage;
cvtcolor(image, grayimage, color_bgr2gray);
mat imageb, imagebv, grayb, graybv, grayt, graytv, graytrunc;
// 彩色图像二值化
threshold(image, imageb, 125, 255, thresh_binary);
threshold(image, imagebv, 125, 255, thresh_binary_inv);
namedwindow("image_b", window_autosize);
imshow("image_b", imageb);
namedwindow("image_bv", window_autosize);
imshow("image_bv", imagebv);
// 灰度图像二值化
threshold(grayimage, grayb, 125, 255, thresh_binary);
threshold(grayimage, graybv, 125, 255, thresh_binary_inv);
namedwindow("gray_b", window_autosize);
imshow("gray_b", grayb);
namedwindow("gray_bv", window_autosize);
imshow("gray_bv", graybv);
// 灰度图像tozero变换
threshold(grayimage, grayt, 125, 255, thresh_tozero);
threshold(grayimage, graytv, 125, 255, thresh_tozero_inv);
namedwindow("gray_t", window_autosize);
imshow("gray_t", grayt);
namedwindow("gray_tv", window_autosize);
imshow("gray_tv", graytv);
// 灰度图像trunc变换
threshold(grayimage, graytrunc, 125, 255, thresh_trunc);
namedwindow("gray_trunc", window_autosize);
imshow("gray_trunc", graytrunc);
示例代码中是对于全局阈值处理中五种二值化操作的类型
-
thresh_binary:
- 这种方式是最简单的阈值处理方式。
- 对于大于阈值的像素,将其设置为最大值(通常是255)。
- 对于小于等于阈值的像素,将其设置为0。
- 这种方式可以很好地分离前景和背景,得到一个二值化的图像。
-
thresh_binary_inv:
- 这种方式与thresh_binary正好相反。
- 对于大于阈值的像素,将其设置为0。
- 对于小于等于阈值的像素,将其设置为最大值(通常是255)。
- 这种方式也可以得到一个二值化的图像,但前景和背景刚好相反。
-
thresh_trunc:
- 这种方式与前两种不同,它不会将像素值设置为0或最大值。
- 对于大于阈值的像素,将其设置为阈值。
- 对于小于等于阈值的像素,保持其原有的值不变。
- 这种方式可以用于截断过亮的区域,将其限制在阈值以下。
-
thresh_tozero:
- 这种方式也不会将像素值设置为0或最大值。
- 对于大于阈值的像素,保持其原有的值不变。
- 对于小于等于阈值的像素,将其设置为0。
- 这种方式可以用于分离前景和背景,并保留前景的原始灰度信息。
-
thresh_tozero_inv:
- 这种方式与thresh_tozero正好相反。
- 对于大于阈值的像素,将其设置为0。
- 对于小于等于阈值的像素,保持其原有的值不变。
- 这种方式可以用于分离背景,并保留小于等于阈值的像素的原始灰度信息。
下面是对于时对于otsu法和三角形法两种方法的示例代码。
见示例代码:
// otsu法和三角形法
mat image_thr = imread("d:\\pycharmyunxing\\venv\\8.jpg", imread_grayscale);
mat image_o, image_t;
threshold(image_thr, image_o, 100, 255, thresh_binary | thresh_otsu);
threshold(image_thr, image_t, 125, 255, thresh_binary | thresh_triangle);
imshow("原图", image_thr);
imshow("otsu", image_o);
imshow("三角形法", image_t);
这里给出效果图



然后是对于adaptivethreshold()使用的示例代码展示的是两种自适应确定阈值的方法:
mat adap_mean, adap_gauss;
adaptivethreshold(image_thr, adap_mean, 255, adaptive_thresh_mean_c, thresh_binary, 55, 0);
adaptivethreshold(image_thr, adap_gauss, 255, adaptive_thresh_gaussian_c, thresh_binary, 55, 0);
imshow("中值", adap_mean);
imshow("高斯", adap_gauss);
效果图:


发表评论