使用opencv动态获取子图像

时间:2018-06-19 10:27:24

标签: python python-3.x opencv ocr

我想为项目提取图像的特定部分。 因为,我将获得的图像是扫描文档,特定部分可能会移动一点点,我不能写硬编码值 Here is the image

我想从该图片中取出文字,但只有当我将该部分标记为红色时我才能管理

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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()

输入:

Input

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

Binary Image

输出:

Output