如何解决OpenCV中cv2.THRESH_OTSU的报错问题?
OpenCV THRESH_OTSU 报错解决
报错原因
OTSU阈值分割算法仅支持单通道的8位无符号整数(CV_8UC1)或16位无符号整数(CV_16UC1)图像,但你的输入图像light是4通道格式(CV_8UC4),不符合函数要求。
问题排查与修复步骤
检查输入图像通道数
你的代码中gray变量大概率不是真正的单通道灰度图,而是带Alpha通道的4通道图像(比如透明PNG)。可以通过print(gray.shape)验证:单通道图像形状为(height, width),4通道为(height, width, 4)。转换为单通道灰度图
如果是4通道图像,先将其转为单通道灰度图:gray = cv2.cvtColor(gray, cv2.COLOR_BGRA2GRAY)修正阈值函数的返回值接收
cv2.threshold返回两个值:自动计算的阈值和二值化后的图像。原代码中light,th1 = cv2.threshold(...)[1]写法错误,需正确接收两个值,或者只取二值化图像。
修正后的完整代码
import cv2 # 示例:读取带Alpha通道的图像并转灰度 # img = cv2.imread("your_image.png", cv2.IMREAD_UNCHANGED) # gray = cv2.cvtColor(img, cv2.COLOR_BGRA2GRAY) squareKern = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) light = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, squareKern) # 正确接收阈值和二值化图像 otsu_threshold, th1 = cv2.threshold(light, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) cv2.imshow("light", th1) cv2.waitKey(0) # 注意首字母小写,原代码拼写错误 cv2.destroyAllWindows()
额外注意
原代码中cv2.WaitKey(0)是拼写错误,应为cv2.waitKey(0),否则会触发新的报错。
内容的提问来源于stack exchange,提问作者GaneshSai_239
相关产品推荐
相关产品推荐

