【问题标题】:OpenCV: Contour detection of shadowed image before OCROpenCV:在 OCR 之前对阴影图像进行轮廓检测
【发布时间】:2020-09-14 12:24:31
【问题描述】:

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

  1. 以灰度方式读取图像
  2. 二值化阈值
  3. 沿从cv2.findContours() 获得的轮廓包裹透视图

如果图像没有阴影,上述方法效果很好。现在我想得到阴影图片的轮廓。我的第一次尝试是在步骤 2 中使用cv2.adaptiveThreshold。自适应阈值成功地削弱了阴影,但结果图像失去了纸张和背景之间的对比度。这使得 cv2 无法找到纸张的轮廓。所以我需要用其他方法去除阴影。

有什么方法可以去除阴影,保持背景颜色?

这里是我正在使用各种方法处理的示例图片供参考。从左到右,我做到了

  1. 灰度
  2. 阈值
  3. 自适应阈值
  4. 标准化

我的目标是获得第二张没有阴影的图片。

请注意,我其实有一个专门针对图片的临时解决方案,就是单独处理图片有阴影的部分。然而,它不是阴影图片的通用解决方案,因为它的性能取决于阴影的大小、形状和位置,所以请使用其他方法。

这是原图。

【问题讨论】:

  • 如何使用 hough 分割收据(找到定义边界的喜欢)然后交叉点找到角落?
  • 可以发你的原图吗

标签: python image opencv ocr


【解决方案1】:

这是 Python/OpenCV 中使用除法归一化的一种方法,可选地,后跟锐化和/或阈值化。

输入:

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

部门:

锐化:

阈值:

【讨论】:

    猜你喜欢
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多