源代码如下所示:
import cv2
img = cv2.imread('lena.jpg')
t1 , thd = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
t2, Otsu = cv2.threshold(img,0 ,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
cv2.imshow('thd',thd)
cv2.imshow('otsu',Otsu)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.threshold()函数是以单通道的形式输入图形,而我在上述的代码中的图像是以彩色三通道的形式输入,因此导致的错误。
将彩色图片转变为单通道的灰度图片进行输入。
更改后的代码:
import cv2
img = cv2.imread('lena.jpg',0)
t1 , thd = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
t2, Otsu = cv2.threshold(img,0 ,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
cv2.imshow('thd',thd)
cv2.imshow('otsu',Otsu)
cv2.waitKey()
cv2.destroyAllWindows()
不同的地方时在cv2.imread()函数中加入了一个参数0,使图片以单通道的灰度图像输入。
*1.在本例中使用了Otsu方法进行阈值处理,Otsu方法可以根据当前图像给出最佳的类间分割阈值。过程是Otsu方法会遍历所有可能的阈值,从而找到最佳的阈值。
*2.在函数cv2.threshold()中对参数type的类型对传递一个参数“cv2.THRESH_OTSU”,即可实现Otsu方式的阈值分割。
*3.需要说明的是,在使用Otsu方法时,要把阈值设置为0,此时的函数cv2.threshold()会自动寻找最优阈值,并将该阈值返回。