我是OpenCV的新手,在弄清楚如何在图像中裁剪矩形时遇到了一些麻烦.我有一张PDF格式的表格(我已经转换成图像),它看起来类似于这here.我想要裁剪到大矩形(而不是每个单独的矩形),这样我的输出图像就只是大矩形和其中包含的每一个.

我试图最终提取出包含在大矩形中的信息,但我的第一步是我需要在矩形周围进行裁剪;我的实际图像在矩形的顶部有一些文本,下面也有一些文本,就像示例图像一样.我try 在this question中使用该代码,但它产生的输出图像与原始图像没有什么不同,并且没有在矩形周围进行裁剪.

thresh_value = 10
img = cv2.medianBlur(img_raw, 5)
dilation = cv2.dilate(img,(3,3),iterations = 3)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
(T, thresh) = cv2.threshold(img_gray, thresh_value, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours = [i for i in contours if cv2.contourArea(i) < 5000]
cv2.drawContours(img, contours, -1, (0,0,0), 10, lineType=8)

cv2.imwrite("cropped_img.jpg", img)

在定义等高线和层次的那条线上,原始代码是_, contours, hierarchy =,但我收到了一个错误,说是ValueError: not enough values to unpack (expected 3, got 2).

我确实使用了boundingRect函数来删除空格(如下面的代码块所示),我认为这是最有希望的,但我不完全清楚如何将其调整为查找矩形,而不是查找文本.

gray = 255*(img_raw < 128).astype(np.uint8)
coords = cv2.findNonZero(gray)
x, y, w, h = cv2.boundingRect(coords)
processed_image = img_raw[y:y+h, x:x+w]

我到底做错了什么?

推荐答案

我做了以下操作来识别矩形,按面积计算的第三大轮廓原来是底部的大盒子:

img = cv2.imread("form.jpg")

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
(T, thresh) = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
sorted_contours = sorted(contours, key=cv2.contourArea, reverse=True)
cv2.drawContours(img, [sorted_contours[2]], -1, (0, 255, 0), 2)

为了更具体地回答您的问题,要裁剪图像,您必须获取边界矩形的属性并裁剪原始图像:

x, y, w, h = cv2.boundingRect(sorted_contours[2])
cropped_image = img[y:y + h, x:x + w]

Here is what I got as a result

Python相关问答推荐

创建带有二维码的Flask应用程序,可重定向到特定端点

如何使用矩阵在sklearn中同时对每个列执行matthews_corrcoef?

有条件地采样我的大型DF的最有效方法

在Pandas 日历中插入一行

比较两个二元组列表,NP.isin

Matlab中是否有Python的f-字符串等效物

max_of_three使用First_select、second_select、

Python json.转储包含一些UTF-8字符的二元组,要么失败,要么转换它们.我希望编码字符按原样保留

在Wayland上使用setCellWidget时,try 编辑QTable Widget中的单元格时,PyQt 6崩溃

如何在Polars中从列表中的所有 struct 中 Select 字段?

如何使用Pandas DataFrame按日期和项目汇总计数作为列标题

如何合并两个列表,并获得每个索引值最高的列表名称?

在两极中过滤

基于形状而非距离的两个numpy数组相似性

Numpyro AR(1)均值切换模型抽样不一致性

当单元测试失败时,是否有一个惯例会抛出许多类似的错误消息?

如果包含特定值,则筛选Groupby

BeautifulSoup:超过24个字符(从a到z)的迭代失败:降低了首次深入了解数据集的复杂性:

使用Python TCP套接字发送整数并使用C#接收—接收正确数据时出错

删除特定列后的所有列