首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCV: OCR前阴影图像的轮廓检测

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

Stack Overflow用户
提问于 2020-09-14 12:24:31
回答 1查看 1K关注 0票数 1

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

grayscale

  • Binarize it thresholding

  • Wrap透视图沿cv2.findContours()

获得的等值线读取图像

如果图像不是阴影的话,上面的效果很好。现在我想得到阴影照片的轮廓。我的第一次尝试是在第二步中使用cv2.adaptiveThreshold。自适应阈值成功地削弱了阴影,但最终的图像失去了纸张和背景之间的对比度。这使得cv2不可能找到纸的轮廓线。所以我需要用其他方法来去除阴影。

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

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

  1. grayscale
  2. thresholding
  3. adaptive thresholdin
  4. normalization

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

请注意,我实际上有一个临时解决方案,特别是对图片,即处理部分的图片与阴影分开。然而,它并不是阴影图片的一般解决方案,因为它的性能取决于阴影的大小、形状和位置,所以请使用其他方法。

这是原画。

EN

回答 1

Stack Overflow用户

发布于 2020-09-14 18:49:51

这里是Python/OpenCV中使用除法的一种方法,然后是锐化和/或阈值化。

输入:

代码语言:javascript
复制
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()

分部:

锋利的:

被拘留者:

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63884290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档