为什么需要自适应阈值处理
颜色平衡的图像,直接使用1个阈值就可以完成图像的阈值化处理。 但是,有时图像的颜色不均衡,在这种情况下,仅利用一个阈值不能得到清晰的有效的阈值分割图像,因此需要采用自适应的阈值处理。
简单地说,自适应阈值处理是指计算以各像素点的轴为附近区域的加权平均值来求出阈值,并使用该阈值处理当前的像素点。
优点是可以更好地处理明暗差较大的图像。
adaptiveThreshold
opencv提供了cv2.adaptiveThreshold ()函数以实现自适应阈值处理。 定义如下。
自适应阈值(src,最大值,自适应方法,阈值类型,块大小,c,dst=无) :src :要处理的原始图像
最大值:表示最大值
自适应方法:自适应方法
阈值类型:表示阈值处理方法,该值必须为cv2.THRESH_BINARY或cv2.THRESH_BINARY_INV
块大小:块的大小。 表示一个像素在计算阈值时使用的附近的大小,通常为3、5、7等
c :常数
参数可以确保在处理图像时,必须提供自定义的阈值处理方法。 OpenCV提供了两种类型的信息: cv2.自适应_沟通_门限和cv2.自适应_沟通_高斯信息_ c。 这些都是每个像素的计算自适应阈值,自适应阈值等于每个像素在参数blockSize中指定的附近的加权平均减去常数c。
这里,用两种不同的方法计算附近的加权平均值
(1) cv2.ADAPTIVE_THRESH_MEAN_C )附近所有像素点的权重值一致
2 ) cv2.ADAPTIVE_THRESH_GAUSSINA_C )通过与从附近的各像素到中心点的距离相关的高斯方程式得到各点的权重值
让我们来看看各自的效果。 具体代码如下。
导入CV 2
img=cv2. im读取(‘4. jpg ‘,0 ) )。
t,结果_ img=cv2.阈值(img,127,255,cv2.阈值) ) ) ) ) ) ) ) )。
atmc _ img=cv2 .自适应阈值(img,255,cv2 .自适应阈值,cv2 .阈值,5,3 )
atgc _ im=cv2 .自适应阈值(img,255,cv2 .自适应_阈值,cv2 .阈值,5,3
cv2.imshow(img )、img ) )。
cv2. im show (结果img,结果img ) ) ) ) )。
CV2.imshow(atmc_img,atmc_img ) ) ) ) ) ) ) ) ) ) )。
CV2.imshow(atgc_im,ATGC_im ) ) ) ) )。
cv2.waitKey () )。
cv2.destroyAllWindows (() ) 9500.163.com) ) ) ) )。
Otsu处理
函数cv2.threshold ) )函数进行阈值处理时,需要自定义阈值。 虽然图像通常是色彩平衡的,但在这种情况下,直接设置阈值进行处理是合适的。
但是,实际处理的图像容易变得更复杂,不太可能直接观察阈值,如果一个一个地尝试,工作量一定会很大。
Otsu法可以根据当前图像给出最佳的类间分割阈值。 简单地说,Otsu方法遍历所有可能的阈值,以找到最佳阈值。
cv2.threshold ) )函数为我们提供了传递给cv2.THRESH_OTSU的type参数,以实现Otsu方法的阈值分割。
使用Otsu方法时,请注意将阈值设置为0。 此时的cv2.threshold ()会自动查找最佳阈值并返回该阈值。 如果上面的代码有t,则返回的是阈值。
那么,就用Otsu处理来实现吧。 具体代码如下。
导入CV 2
img=cv2. im读取(‘4. jpg ‘,0 ) )。
t1,结果_ img=cv2.阈值(img,127,255,cv2.阈值) ) ) ) ) ) ) ) )。
t2,Otsu _ img=CV2.阈值(IMG,0,255,CV2.阈值_二进制值) ) ) ) ) ) ) )。
cv2.imshow(img )、img ) )。
cv2. im show (结果img,结果img ) ) ) ) )。
打印(T2 ) )。
CV2.imshow(otsu_img,Otsu_img ) ) ) ) ) )。
cv2.waitKey () )。
cv2.destroyAllWindows () )执行后,效果如下。
由此可知,该图像的最佳二值化阈值处理阈值为145。