基于行列检测裁剪图像时遇ValueError问题求助
解决OpenCV像素判断引发的ValueError与代码逻辑问题
嘿,我来帮你排查下代码里的问题:
首先说说你遇到的ValueError原因
你用cv2.imread()读入的img是BGR三通道彩色图像,img[y,x]返回的是一个长度为3的numpy数组(比如纯黑色像素是[0,0,0])。当你写if img[y,x] == [0]:时,Python会把数组和[0]做逐元素比较,返回一个布尔数组(比如[True, False, False]),而if语句无法直接判断一个布尔数组的真假,所以抛出了那个歧义错误。
而且还有个隐藏问题:你前面做了二值化得到thresh图,但判断黑色像素时用的是原始img,这完全不匹配——thresh才是你处理后的黑白二值图,应该用它来判断黑色像素。
再说说代码里的其他逻辑错误
- 倒序遍历的
range参数写错了:比如for y in range(h,0),这个循环根本不会执行,因为range的起始值大于结束值且步长默认是正的,得改成range(h-1, -1, -1)才能从图像底部往上遍历。同理右侧的列遍历也要改。
修正后的代码
import cv2 import numpy as np img = cv2.imread('C:/Users/user/Desktop/FYP 2019/Sign Language 1/red1.png') gray = cv2.cvtColor(img.copy(), cv2.COLOR_BGR2GRAY) blur = cv2.GaussianBlur(gray,(5,5),0) ret, thresh = cv2.threshold(blur,125,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU) #get the images dimensions h = img.shape[0] w = img.shape[1] lower_min_point = -1 upper_min_point = -1 left_point = -1 right_point = -1 # 找最上方的黑色行 for y in range(0, h): for x in range(0, w): # 改用thresh单通道图判断,直接比较单值0 if thresh[y,x] == 0: upper_min_point = y break if upper_min_point != -1: break print(upper_min_point) # 找最下方的黑色行(修正range参数) for y in range(h-1, -1, -1): for x in range(0, w): if thresh[y,x] == 0: lower_min_point = y break if lower_min_point != -1: break print(lower_min_point) # 找最左侧的黑色列 for x in range(0, w): for y in range(0, h): if thresh[y,x] == 0: left_point = x break if left_point != -1: break print(left_point) # 找最右侧的黑色列(修正range参数) for x in range(w-1, -1, -1): for y in range(0, h): if thresh[y,x] == 0: right_point = x break if right_point != -1: break print(right_point) # 裁剪图像,注意切片是左闭右开,调整参数确保包含所有目标区域 crop = img[upper_min_point:lower_min_point+1, left_point:right_point+1] cv2.imshow("img", crop) cv2.waitKey(0) cv2.destroyAllWindows()
额外优化建议
嵌套循环遍历像素效率很低,你可以用numpy的向量化操作快速判断整行/整列是否有黑色像素,大幅提升代码速度:
# 找最上方有黑色的行 upper_min_point = np.argmax(thresh == 0, axis=0).min() # 找最下方有黑色的行 lower_min_point = h - np.argmax(np.flipud(thresh) == 0, axis=0).min() -1 # 找最左侧有黑色的列 left_point = np.argmax(thresh == 0, axis=1).min() # 找最右侧有黑色的列 right_point = w - np.argmax(np.fliplr(thresh) == 0, axis=1).min() -1
内容的提问来源于stack exchange,提问作者pohyu lim
相关产品推荐
相关产品推荐

