【问题标题】:Get Sub Image dynamically using opencv使用opencv动态获取子图像
【发布时间】:2018-06-19 10:27:23
【问题描述】:

我想为我的项目提取图像的特定部分。 由于我将获得的图像是扫描文档,因此该特定部分可能会发生一些变化,因此我无法编写硬编码值

我想从该图像中取出文本,但只有当我将该部分标记为红色时我才能做到这一点

【问题讨论】:

  • 我使用 Contours 和精明的边缘检测,但无法正确获得结果

标签: python python-3.x opencv ocr


【解决方案1】:

使用膨胀和制作轮廓。只需调整各种功能的参数即可获得所需的输出。

import matplotlib.pyplot as plt
import cv2
import numpy as np

img = cv2.imread('pan2.jpg')
img1 =  cv2.GaussianBlur(img,(5,5),0)
img1 = cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)
f1 = cv2.cvtColor(img1,cv2.COLOR_RGB2GRAY)
f1 = 255 - cv2.threshold(f1, 0,255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]
fgdilated = cv2.dilate(f1, kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3)) , iterations = 1)
fgclosing = cv2.morphologyEx(fgdilated, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (2,2)))

plt.imshow(fgclosing)
plt.show()
img2, contours, hierarchy = cv2.findContours(fgdilated, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)

for cnt in contours:
    #print(cnt)
    #print(cv2.contourArea(cnt))
    if cv2.contourArea(cnt) > 200:
        #hull = cv2.convexHull(cnt)
        #print(hull)
        #cv2.drawContours(img, [hull], -1, (255, 255, 255), 1)

        (x,y,w,h) = cv2.boundingRect(cnt)
        if h >7:
            cv2.rectangle(img, (x,y), (x+w,y+h), (255, 0, 255), 1)

plt.imshow(img)
plt.show()

输入:

这是我使用代码得到的二进制图像。

输出:

【讨论】:

    【解决方案2】:

    首先将GaussianBlur 应用于您的图像,例如。 G。内核大小为 3。

    使用Canny 找到具有适当值的边缘后(由于您拍摄图像 [扫描] 的条件差别不大,您应该能够在 canny 中找到这样的最小值/最大值),您可以找到边缘点使用findContours 使用minAreaRect 拟合矩形。然后裁剪这部分图像。

    【讨论】:

    • 是的,我试过了,但这似乎有点冗长,因为我希望它是动态的,所以在某些情况下它不起作用
    猜你喜欢
    • 2016-06-10
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 2018-08-19
    • 2019-01-02
    • 2021-11-20
    • 1970-01-01
    相关资源
    最近更新 更多