Python OpenCV:OCR前阴影图像的轮廓检测

Python OpenCV:OCR前阴影图像的轮廓检测,python,image,opencv,ocr,Python,Image,Opencv,Ocr,我正在尝试OCR文档图片,我目前的方法是 将图像读取为灰度 对其进行二值化阈值化 沿从cv2.findContours()获得的轮廓包裹透视图 如果图像没有阴影,上述方法效果很好。现在我想得到阴影图片的轮廓。我的第一次尝试是在步骤2中使用cv2.adaptiveThreshold。自适应阈值成功地削弱了阴影,但生成的图像失去了纸张和背景之间的对比度。这使得cv2无法找到纸张的轮廓。所以我需要使用其他方法来移除阴影 有没有办法去除阴影以保持背景色? 这里是我用各种方法处理的示例图片,以供参考。从左

我正在尝试OCR文档图片,我目前的方法是

  • 将图像读取为灰度
  • 对其进行二值化阈值化
  • 沿从
    cv2.findContours()获得的轮廓包裹透视图
  • 如果图像没有阴影,上述方法效果很好。现在我想得到阴影图片的轮廓。我的第一次尝试是在步骤2中使用
    cv2.adaptiveThreshold
    。自适应阈值成功地削弱了阴影,但生成的图像失去了纸张和背景之间的对比度。这使得cv2无法找到纸张的轮廓。所以我需要使用其他方法来移除阴影

    有没有办法去除阴影以保持背景色?

    这里是我用各种方法处理的示例图片,以供参考。从左开始,我做到了

  • 灰度
  • 阈值
  • 自适应阈值
  • 规范化
  • 我的目标是获得第二张没有阴影的图片

    请注意,我实际上有一个临时解决方案专门用于图片,即单独处理带有阴影的图片部分。然而,这不是阴影图片的一般解决方案,因为其性能取决于阴影的大小、形状和位置,因此请使用其他方法

    这是原图


    在Python/OpenCV中,有一种方法使用除法规范化,然后可选地进行锐化和/或阈值化

    输入:


    分部:

    锐化:

    阈值:


    如何使用hough(找到定义边界的类)分割收据,然后通过交叉点找到角点?您可以发布原始图像吗
    import cv2
    import numpy as np
    import skimage.filters as filters
    
    # read the image
    img = cv2.imread('receipt.jpg')
    
    # convert to gray
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    # blur
    smooth = cv2.GaussianBlur(gray, (95,95), 0)
    
    # divide gray by morphology image
    division = cv2.divide(gray, smooth, scale=255)
    
    
    # sharpen using unsharp masking
    sharp = filters.unsharp_mask(division, radius=1.5, amount=1.5, multichannel=False, preserve_range=False)
    sharp = (255*sharp).clip(0,255).astype(np.uint8)
    
    # threshold
    thresh = cv2.threshold(sharp, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
    
    # save results
    cv2.imwrite('receipt_division.png',division)
    cv2.imwrite('receipt_division_sharp.png',sharp)
    cv2.imwrite('receipt_division_thresh.png',thresh)
    
    
    # show results
    cv2.imshow('smooth', smooth)  
    cv2.imshow('division', division)  
    cv2.imshow('sharp', sharp)  
    cv2.imshow('thresh', thresh)  
    cv2.waitKey(0)
    cv2.destroyAllWindows()