我有一个为无网格表创建网格线的脚本:
脚本之前:
脚本之后:
是否有一种简单的方法,使用 OpenCV 来裁剪“脚本之后”图像,使其仅包含四边边界框?示例输出:
编辑:
我目前正在研究一种解决方案,该解决方案可以找到垂直/水平方向的第一条/最后一条全黑像素线。它会起作用,但想知道是否有更优雅的东西。
当然,可以使用 OpenCV 裁剪“脚本后”图像以仅包含四边形边界框。以下是一种更优雅的方法:
1. 查找轮廓并排序
-
查找轮廓:
在二进制图像(似乎已经拥有的图像)上使用
cv2.findContours
。 - 排序轮廓: 按大小对轮廓进行排序,并选择最大的轮廓,因为它很可能对应于的边界框。
2. 查找边界矩形并裁剪
-
边界矩形:
使用
cv2.boundingRect
查找最大轮廓的边界矩形。这将为提供裁剪区域的x
、y
、宽度
和高度
。 - 裁剪图像: 使用这些值从原始图像中裁剪出感兴趣的区域。
以下是 Python 代码:
import cv2
# 加载图像(替换为的图像路径)
image = cv2.imread('your_image.png')
# 将图像转换为灰度(如果它已经是,则跳过此步骤)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 查找轮廓
contours, _ = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 按面积对轮廓进行排序并获取最大的轮廓
contours = sorted(contours, key=cv2.contourArea, reverse=True)
largest_contour = contours[0]
# 查找边界矩形
x, y, w, h = cv2.boundingRect(largest_contour)
# 裁剪图像
cropped_image = image[y:y+h, x:x+w]
# 显示或保存裁剪的图像
cv2.imshow("Cropped Image", cropped_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
此代码首先查找图像中的所有轮廓,按大小对它们进行排序,找到最大轮廓的边界框,最后裁剪并显示/保存裁剪的图像。
此方法应该比查找第一条和最后一条黑线更健壮且更通用,因为它不依赖于特定于行的特征,并且即使网格线不完美也能工作。
标签:python,opencv,computer-vision,bounding-box From: 67150566