Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 图像分析(opencv或scikit图像),带噪扫描的倾斜_Python_Opencv_Scikit Image - Fatal编程技术网

Python 图像分析(opencv或scikit图像),带噪扫描的倾斜

Python 图像分析(opencv或scikit图像),带噪扫描的倾斜,python,opencv,scikit-image,Python,Opencv,Scikit Image,我确实有一些旧的银行对账单作为扫描,我想使用谷歌的thesseract引擎来提取文本。除非图像稍微旋转,否则效果很好。我想通过检测虚线来估计坡度和旋转角度。然而,要获得正确的参数是很困难的 如果我能去掉大线条的假象,我可能会在文本字符上使用最小旋转边界框(cv2.minareact) 也许另一种策略更合适?有什么想法吗 示例图像(删除了一些用于数据保护的字符): 艾德:我找到了一个似乎有效的解决方案。但是,我仍然想知道是否有更快的解决方案(每张图像大约需要1.5秒) 我确实使用了以下模板的fr

我确实有一些旧的银行对账单作为扫描,我想使用谷歌的thesseract引擎来提取文本。除非图像稍微旋转,否则效果很好。我想通过检测虚线来估计坡度和旋转角度。然而,要获得正确的参数是很困难的

如果我能去掉大线条的假象,我可能会在文本字符上使用最小旋转边界框(
cv2.minareact

也许另一种策略更合适?有什么想法吗

示例图像(删除了一些用于数据保护的字符):

艾德:我找到了一个似乎有效的解决方案。但是,我仍然想知道是否有更快的解决方案(每张图像大约需要1.5秒)

我确实使用了以下模板的from skimage:

template=plt.imread('template_long.png'))
模板=rgb2gray(模板)
模板=模板>阈值\平均值(模板)
对于范围(1)中的i:
#读入图像
img=cv2.imread('conversion/umsatz_{}.png'.格式(i))
#转换为灰度
灰色=cv2.CVT颜色(img,cv2.COLOR\U BGR2GRAY)
灰色=cv2。按位\u非(灰色)
#设置图像阈值,将所有前景像素设置为
#255和所有背景像素为0
thresh=cv2.阈值(灰色,0,255,cv2.thresh_二进制| cv2.thresh_大津)[1]
#边缘检测
#边缘=cv2.Canny(脱粒,2100,孔径尺寸=3)
#从检测到的边填充孔
#内核=np.ones((2,2),np.uint8)
#explate=cv2.explate(阈值、内核、迭代次数=1)
结果=匹配模板(阈值,模板)
掩码=结果<0.5
r=result.copy()
r[mask]=0
r[~mask]=1
plt.imshow(右)

如果问题出在大线条上,也许可以按大小进行过滤。如果您能够正确地获得虚线,那么您可以获得一个单应性,该单应性将虚线之间矩形的旋转矩形映射到未按您喜欢的大小旋转的矩形。然后这种单应性可以在整个图像中使用,以纠正itI。我尝试了另外两种方法,但都不起作用,但我认为这样可以节省一些时间,不尝试这些方法。1) 定义跨行求和图像的成本函数,然后计算零的数量。优化该成本函数将为您提供一个线条分隔良好的图像。2) 执行Hough变换,找到最匹配的直线,并按其角度旋转。(1) 因为代价函数不够平滑,所以不起作用(2)不起作用,因为存在一条比角色本身更突出的伪品线。@StefanvanderWalt没有找到最佳匹配线,即伪品线,也许更好的方法是使用所有其他水平线并平均其坡度。您应该能够从文本中获得大量的行,尤其是使用膨胀。@Moritz一种计算成本较低的方法是调整图像和模板的大小,应该能够获得类似的结果,但计算量要少得多。具有一半高度和宽度的图像的计算速度将提高四倍。
template = plt.imread('template_long.png')
template = rgb2gray(template)
template = template > threshold_mean(template)

for i in range(1):
    # read in image
    img = cv2.imread('conversion/umsatz_{}.png'.format(i))
    # convert to grayscale
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    gray = cv2.bitwise_not(gray)

    # threshold the image, setting all foreground pixels to
    # 255 and all background pixels to 0
    thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1] 

    # edge detection
    #edges = cv2.Canny(thresh,2,100, apertureSize = 3)

    # fill the holes from detected edges
    #kernel = np.ones((2,2),np.uint8)
    #dilate = cv2.dilate(thresh, kernel, iterations=1)

    result = match_template(thresh, template)

    mask = result < 0.5
    r = result.copy()
    r[mask] = 0
    r[~mask] = 1
    plt.imshow(r)