【OpenCV学习】阈值处理错误:error: (-215:Assertion failed) src.type() == CV_8UC1 in function ‘threshold‘

2022-08-02,,,,

在使用cv2.threshold()函数对一幅图像进行阈值处理时出现了如下错误error: (-215:Assertion failed) src.type() == CV_8UC1 in function ‘cv::threshold’

源代码如下所示:

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()会自动寻找最优阈值,并将该阈值返回。

本文地址:https://blog.csdn.net/weixin_42415138/article/details/107367142

《【OpenCV学习】阈值处理错误:error: (-215:Assertion failed) src.type() == CV_8UC1 in function ‘threshold‘.doc》

下载本文的Word格式文档,以方便收藏与打印。