本文共 3286 字,大约阅读时间需要 10 分钟。
像素是在模拟图像数字化时对连续空间进行离散化得到的。每个像素具有整数行(高)和列(宽)位置坐标,同时每个像素都具有整数灰度值或颜色值。
返回的第一个参数为阈值,第二个为结果图像
ret,dst = cv2.threshold(src,thresh,maxval,type)二值化阈值处理会将原始图像处理为仅有两个值的二值图像,其针对像素点的处理方式为:在8位图像中,最大值是255。因此,在对8位灰度图像进行二值化时,如果将阈值设定为127,那么: ● 所有大于127的像素点会被处理为255。 ● 其余值会被处理为0。
阈值设置为210: 设置为240:反二值化阈值处理的结果也是仅有两个值的二值图像,与二值化阈值处理的区别在于,二者对像素值的处理方式不同。反二值化阈值处理针对像素点的处理方式为:
● 对于灰度值大于阈值的像素点,将其值设定为0。 ● 对于灰度值小于或等于阈值的像素点,将其值设定为255。 上面的图使用反二值化阈值处理之后:截断阈值化处理会将图像中大于阈值的像素点的值设定为阈值,小于或等于该阈值的像素点的值保持不变
设置上面图片的阈值为210来处理: 发现设置为240时跟原图感觉差不多,说明像素值大于240的很少超阈值零处理会将图像中大于阈值的像素点的值处理为0,小于或等于该阈值的像素点的值保持不变。即先选定一个阈值,然后对图像做如下处理:
● 对于像素值大于阈值的像素点,其像素值将被处理为0。 ● 对于像素值小于或等于阈值的像素点,其像素值将保持不变。低阈值零处理会将图像中小于或等于阈值的像素点的值处理为0,大于阈值的像素点的值保持不变。即先选定一个阈值,然后对图像做如下处理:
● 对于像素值大于阈值的像素点,其值将保持不变。 ● 对于像素值小于或等于阈值的像素点,其值将被处理为0。对于色彩均衡的图像,直接使用一个阈值就能完成对图像的阈值化处理。但是,有时图像的色彩是不均衡的,此时如果只使用一个阈值,就无法得到清晰有效的阈值分割结果图像。 有一种改进的阈值处理技术,其使用变化的阈值完成对图像的阈值处理,这种技术被称为自适应阈值处理。在进行阈值处理时,自适应阈值处理的方式通过计算每个像素点周围临近区域的加权平均值获得阈值,并使用该阈值对当前像素点进行处理。与普通的阈值处理方法相比,自适应阈值处理能够更好地处理明暗差异较大的图像。 OpenCV提供了函数cv2.adaptiveThreshold()来实现自适应阈值
dst=cv.adaptiveThreshold(src,maxValue,adaptiveMethod,thresholdType,blockSize,C) ● dst代表自适应阈值处理结果。 ● src代表要进行处理的原始图像。需要注意的是,该图像必须是8位单通道的图像。 ● maxValue代表最大值。 ● adaptiveMethod代表自适应方法。 函数包含cv2.ADAPTIVE_THRESH_MEAN_C和cv2.ADAPTIVE_THRESH_GAUSSIAN_C两种不同的方法这两种方法都是逐个像素地计算自适应阈值,自适应阈值等于每个像素由参数blockSize所指定邻域的加权平均值减去常量C。两种不同的方法在计算邻域的加权平均值时所采用的方式不同: 【● cv2.ADAPTIVE_THRESH_MEAN_C:邻域所有像素点的权重值是一致的。 ● cv2.ADAPTIVE_THRESH_GAUSSIAN_C:与邻域各个像素点到中心点的距离有关,通过高斯方程得到各个点的权重值。】● thresholdType 代表阈值处理方式,该值必须是 cv2.THRESH_BINARY 或者cv2.THRESH_BINARY_INV中的一个。
● blockSize代表块大小。表示一个像素在计算其阈值时所使用的邻域尺寸,通常为3、5、7等。 ● C是常量。 一开始用这个方法的时候由于图片不是单通道的,导致报错,一定要注意。 报错:dst2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,5,3)cv2.error: OpenCV(4.5.1)
C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-wvn_it83\opencv\modules\imgproc\src\thresh.cpp:1676: error: (-215:Assertion failed) src.type() == CV_8UC1 in function ‘cv::adaptiveThreshold’
加上img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)后成功运行。
img = cv2.imread("p7.jpg")t,rst = cv2.threshold(img,200,255,cv2.THRESH_BINARY)img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)dst2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,5,3)dst = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 3)cv2.imshow("r",dst)cv2.imshow("r2",dst2)print(img)#
在 OpenCV 中,通过在函数 cv2.threshold()中对参数 type 的类型多传递一个参数“cv2.THRESH_OTSU”,即可实现Otsu方式的阈值分割。 需要说明的是,在使用Otsu方法时,要把阈值设为0。此时的函数cv2.threshold()会自动寻找最优阈值,并将该阈值返回。例如,下面的语句让函数cv2.threshold()采用Otsu方法进行阈值分割:
t,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) 与普通阈值分割的不同之处在于: ● 参数type增加了一个参数值“cv2.THRESH_OTSU”。 ● 设定的阈值为0。 ● 返回值t是Otsu方法计算得到并使用的最优阈值。 需要注意,如果采用普通的阈值分割,返回的阈值就是设定的阈值。实例:
img = cv2.imread("p7.jpg",0)t,rst = cv2.threshold(img,200,255,cv2.THRESH_BINARY)tt,rst2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
tt是获取到的最优阈值
img = cv2.imread(“p7.jpg”,0)中的第二个参数不能省略,不然会报错。 其中第二个参数可以取值: flag = -1, 8位深度,原通道 flag = 0, 8位深度,1通道 flag = 1, 8位深度,3通道 flag = 2, 原深度, 1通道 flag = 3, 原深度, 3通道 flag = 4, 8位深度,3通道 如果阈值设置为127,图片一片空白。转载地址:http://nvten.baihongyu.com/