赞
踩
在图像处理中,二值化是一种常见的操作,它将图像中的像素值转换为 0 或 1,从而将图像分为黑白两部分。二值化在许多应用中非常有用,例如图像分割、目标检测、字符识别等。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:
THRESH_BINARY_INV:
THRESH_TRUNC:
THRESH_TOZERO:
THRESH_TOZERO_INV:
下面是对于时对于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);
效果图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。