Python中使用OpenCV结合Otsu法二值化灰度图报错如何解决
报错原因
从错误日志的提示可以直接定位问题:
THRESH_OTSU阈值模式要求输入图像必须是单通道8位无符号图(CV_8UC1)或单通道16位无符号图(CV_16UC1),但你实际传入的是4通道8位图像(CV_8UC4),不符合输入要求。- 根本原因是灰度转换代码传错了参数:
cv2.IMREAD_GRAYSCALE是cv2.imread的读入模式常量,不是cv2.cvtColor的颜色空间转换码,参数错误导致cvtColor没有正确将彩色图转为单通道灰度图,输出的仍是多通道图像,最终触发阈值函数报错。
修复方案
两种修复方式二选一即可:
方案1:修正cvtColor转换参数
将错误的转换码替换为BGR转灰度的正确常量cv2.COLOR_BGR2GRAY,修正后的代码:
import cv2 import argparse ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", required=True, help="输入图像路径") args = vars(ap.parse_args()) # 读入彩色图像 images = cv2.imread(args["image"]) # 正确转换为单通道灰度图 im_gray = cv2.cvtColor(images, cv2.COLOR_BGR2GRAY) # 调用Otsu二值化,此时手动传入的阈值会被算法自动计算的最优值覆盖,传0即可 (thresh, im_bw) = cv2.threshold(im_gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
方案2:直接以灰度模式读入图像
如果不需要用到原始彩色图,可以直接在imread阶段指定灰度模式读入,省去cvtColor转换步骤:
import cv2 import argparse ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", required=True, help="输入图像路径") args = vars(ap.parse_args()) # 直接读入单通道灰度图 im_gray = cv2.imread(args["image"], cv2.IMREAD_GRAYSCALE) (thresh, im_bw) = cv2.threshold(im_gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
补充说明:使用
THRESH_OTSU标志时,函数会自动遍历计算全局最优分割阈值,手动传入的thresh参数不会生效,因此不需要提前定义thresh = 200这类冗余变量,阈值参数位传0即可。
内容的提问来源于stack exchange,提问作者Octavian Niculescu
相关产品推荐
相关产品推荐

