簡體   English   中英

OpenCV:OCR 前陰影圖像的輪廓檢測

[英]OpenCV: Contour detection of shadowed image before OCR

我正在嘗試對文檔圖片進行 OCR,我目前的方法是

  1. 將圖像讀取為灰度
  2. 二值化閾值
  3. 沿着從cv2.findContours()獲得的輪廓包裹透視

如果圖像沒有陰影,上述方法效果很好。 現在我想獲得陰影圖片的輪廓。 我的第一次嘗試是在第 2 步中使用cv2.adaptiveThreshold 。自適應閾值成功地削弱了陰影,但結果圖像失去了紙張和背景之間的對比度。 這使得 cv2 無法找到紙張的輪廓。 所以我需要使用其他方法來去除陰影。

有沒有辦法去除陰影保持背景顏色?

作為參考,這里是我用各種方法處理的示例圖片。 從左邊開始,我做了

  1. 灰度
  2. 閾值
  3. 自適應閾值
  4. 正常化

我的目標是獲得第二張沒有陰影的圖片。

在此處輸入圖片說明

請注意,我實際上有一個專門針對圖片的臨時解決方案,即單獨處理圖片帶有陰影的部分。 然而,它不是陰影圖片的通用解決方案,因為它的性能取決於陰影的大小、形狀和位置,因此請使用其他方法。

這是原圖。

在此處輸入圖片說明

這是在 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()

分配:

在此處輸入圖片說明

銳化:

在此處輸入圖片說明

閾值:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM