我想在下一页上获得首字母(“h”)周围框的坐标(以及与其他首字母类似的坐标,因此opencv模板匹配不是一个选项):
在本教程之后,我尝试使用opencv等高线解决问题:
import cv2
import matplotlib.pyplot as plt
page = "image.jpg"
# read the image
image = cv2.imread(page)
# convert to RGB
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# convert to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
# create a binary thresholded image
_, binary = cv2.threshold(gray, 0,150,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# find the contours from the thresholded image
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# draw all contours
image = cv2.drawContours(image, contours, 3, (0, 255, 0), 2)
plt.savefig("result.png")
结果当然不是我想要的:
有没有人知道一个可行的算法(可能还有一个实现),可以为我的任务提供一个简单的解决方案?
3条答案
按热度按时间xmjla07d1#
你可以通过过滤你的轮廓来找到目标区域。现在,您至少可以使用两个筛选条件。一个是过滤
area
-也就是说,丢弃太小和太大的轮廓,直到你得到你要找的轮廓。另一种是通过计算extent
每一个轮廓。这个extent
等高线面积与其边框面积之比。你在寻找一个正方形的轮廓,所以extent
应该接近1.0
.让我们看看代码:
代码的第一部分为您获取一个二进制图像,您可以将其用作计算轮廓的遮罩:
现在,让我们过滤轮廓。让我们使用
area
先接近。你需要定义一系列minimum area
以及maximum area
过滤不在此范围内的所有内容。我已经试探性地从30000
px至150000
二甲苯:一旦你成功地过滤了这个区域,你就可以计算出
bounding rectangle
轮廓的cv2.boundingRect
. 可以检索边界矩形的x
,y
(左上)坐标及其width
以及height
. 之后,只需在原始输入的深拷贝上绘制矩形。现在,让我们看看第二个选项,使用轮廓的
extent
. 这个for
循环修改如下:两种方法都会产生这样的结果:
5t7ly7z52#
你差点就拿到了。你只需要过滤面积和纵横比轮廓。下面是我在python/opencv中的方法。
输入:
阈值图像:
形态学图像:
生成的轮廓图像:
06odsfpq3#
要得到这样的结果:
您需要检测图像中面积从第二到最大的轮廓,因为面积最大的轮廓就是图像的边界。
所以有了等高线列表,我们可以通过内置的
sorted
方法,使用cv2.contourArea
方法作为自定义键:以上只考虑了等高线的面积;如果你想要更可靠的结果,你可以这样做,它将只检测轮廓是4边。