You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 23:46:03