opencv - OpenCV找到这个图像的轮廓来裁剪和旋转
问题描述
我正在尝试检测此图像的轮廓,以便在 openCV 中对其进行裁剪。
我想出了工作代码,但是,如果图像上有一些轻微的背景,它将失败。
图像处理:
检测边界(蓝点):
裁剪/旋转:
但是,对于这样的图像,加上一些背景光,它就行不通了:
预处理:
边界检测:
def preProcessing(img):
imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
adaptive_thresold1 = 31
adaptive_thresold2 = 7
blur = cv2.blur(imgGray, (3, 3))
thresh = cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,adaptive_thresold1,adaptive_thresold2)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
close = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=2)
stackedImages = hp.stackImages(0.1,([img,thresh, close],[img,thresh, close]))
cv2.imshow("WorkFlow", stackedImages)
cv2.waitKey(0)
return thresh
def getContours(img):
biggest = np.array([])
maxArea = 0
img = cv2.bitwise_not(img)
contours,hierarchy = cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
for cnt in contours:
area = cv2.contourArea(cnt)
if area>5000:
print (area)
#cv2.drawContours(imgContour, cnt, -1, (255, 0, 0), 3)
peri = cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,0.02*peri,True)
if area >maxArea and len(approx) == 4:
biggest = approx
maxArea = area
print ("ok")
print (biggest)
out = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
cv2.drawContours(out, biggest, -1, (255, 0, 0), 50)
stackedImages = hp.stackImages(0.1,([img,out],[img,out]))
cv2.imshow("WorkFlow", stackedImages)
cv2.waitKey(0)
return biggest
有什么建议可以让这段代码更可靠吗?
解决方案
尝试使用Otsu 的阈值,而不是使用自适应阈值。
更改此行
thresh = cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,adaptive_thresold1,adaptive_thresold2)
在您的代码中 -
retval_blue, thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
这在图像中对我有用。
推荐阅读
- flutter - 如何通过颤动在屏幕上的某处点击来隐藏覆盖
- java - 使用 setter 方法更新 Room Database 中特定 ID 的特定字段
- installation - 安装程序 EXE 无法启动 - 没有任何错误消息
- linux - 如何使用 Bash 在电子邮件的消息正文中插入新行?
- reactjs - Docker compose:react app 和 nginx 之间共享静态卷
- go - 在数据库中编组 JSON 字段以使用 Pop 进行结构
- python - 获取 AttributeError:模块“aws_cdk.aws_cognito”没有属性“UserPoolResourceServer”错误
- string - 删除包含特定字符串的重复快捷方式
- visual-foxpro - 如何将列表框项目与foxpro中表格中的备注字段进行比较以获得完全匹配?
- java - 带有空日期参数的休眠本机查询