在对象高度和宽度上裁剪二进制图像
Posted
技术标签:
【中文标题】在对象高度和宽度上裁剪二进制图像【英文标题】:Crop Binary Image on Object Height and Width 【发布时间】:2019-02-20 11:53:37 【问题描述】:我有这张图片: character
我已成功隔离字符,现在我想将图像裁剪到二进制对象的边界。这是我要裁剪的清理后的图像:edited
我似乎无法弄清楚代码。这是我尝试过的:
inv = cv2.bitwise_not(img)
mask = np.zeros(img.shape, np.uint8)
_, cnts, hier = cv2.findContours(img.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
for c in cnts:
if cv2.contourArea(c) > 100:
cv2.drawContours(mask, [c], 0, 255, -1)
x, y, h, w = cv2.boundingRect(c)
roi = mask[y:y + h, x:x + w]
crop = img[y:y + h, x:x + w]
final = crop * (roi / 255)
【问题讨论】:
有什么问题? 如何将上面发布的第二张图片裁剪到黑/白区域的边缘? 这不是你的代码,对吧?你有没有尝试过一步一步来看看会发生什么? 致回答者:您甚至不需要计算轮廓。只需计算inv
中白点的边界框@
【参考方案1】:
您可以简单地使用 max 找到最大轮廓,使用 cv2.boundingRect
找到最大轮廓的坐标,然后您可以裁剪它。
c = max(contours, key = cv2.contourArea)
x,y,w,h = cv2.boundingRect(c)
在使用cv2.findContours
时最好使用cv2.RETR_EXTERNAL
而不是cv2.RETR_LIST
,因为在这种情况下,您只寻找对象的边界而不是内部细节。
【讨论】:
【参考方案2】:如果你想用点 (x1,y1) 和 (x2,y2) 裁剪图像
(x1,y1)+-------+
| |
| |
+-------+(x2,y2)
## mask is a numpy array (an image)
croped_image = mask[y1:y2, x1:x2] ## this will return a cropped image
但是对于你的问题,我猜你希望边界矩形裁剪二进制图像
见:https://docs.opencv.org/3.1.0/dd/d49/tutorial_py_contour_features.html
_, contours, _ = cv2.findContours( mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE )
contour = max(contours, key = cv2.contourArea)
x, y, w, h = cv2.boundingRect(contour)
x1, y1, x2, y2 = x, y, x+w, y+h
现在使用这些点来裁剪图像
【讨论】:
以上是关于在对象高度和宽度上裁剪二进制图像的主要内容,如果未能解决你的问题,请参考以下文章