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

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

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

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
问题中的错误信息"error: (-215:Assertion failed) src.type() == CV_8UC1 in function 'cv::distanceTransform'"是由OpenCV库中的distanceTransform函数引起的。这个错误是断言失败,意味着输入图像的类型不符合函数的期望类型CV_8UC1CV_8UC1表示一个无符号8位单通道图像。要解决这个问题,你需要确保输入图像的类型是CV_8UC1。 引用中提到了一个类似的错误信息,在threshold函数中断言失败,断言条件是src.type() == CV_8UC1。这意味着在调用distanceTransform函数之前,你可能需要先进行类似的图像阈值化操作,将图像转换为CV_8UC1类型。 引用中提到了一个尝试将图像类型转换为CV_8UC1的方法,使用了img.convertTo(src, CV_8UC1)。然而,这种方法并没有解决问题,可能是因为转换操作没有成功。 解决这个问题的一种方法是确保在调用distanceTransform函数之前,图像已经是CV_8UC1类型。你可以使用cv2.cvtColor函数将图像转换为灰度图像,然后使用cv2.threshold函数进行阈值化操作,确保图像的类型是CV_8UC1。然后再调用distanceTransform函数。 另外,还有可能是在调用distanceTransform函数之前没有正确加载图像或者图像路径不正确导致的错误。你可以检查图像是否正确加载并且路径是否正确。 综上所述,为了解决错误"error: (-215:Assertion failed) src.type() == CV_8UC1 in function 'cv::distanceTransform'",你可以按照以下步骤进行处理: 1. 确保正确加载图像并且图像路径正确。 2. 使用cv2.cvtColor函数将图像转换为灰度图像。 3. 使用cv2.threshold函数进行阈值化操作,将图像转换为CV_8UC1类型。 4. 然后再调用distanceTransform函数进行距离变换操作。 这样应该能够解决这个错误并正确执行distanceTransform函数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【OpenCV错误】error: (-215:Assertion failed) src.type() == CV_8UC1 in function 'threshold'](https://blog.csdn.net/donaldsy/article/details/102078401)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [opencv bug 处理](https://download.csdn.net/download/rechard_han/10562169)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值