[英]OpenCV: Contour detection of shadowed image before OCR
我正在嘗試對文檔圖片進行 OCR,我目前的方法是
cv2.findContours()
獲得的輪廓包裹透視如果圖像沒有陰影,上述方法效果很好。 現在我想獲得陰影圖片的輪廓。 我的第一次嘗試是在第 2 步中使用cv2.adaptiveThreshold
。自適應閾值成功地削弱了陰影,但結果圖像失去了紙張和背景之間的對比度。 這使得 cv2 無法找到紙張的輪廓。 所以我需要使用其他方法來去除陰影。
有沒有辦法去除陰影保持背景顏色?
作為參考,這里是我用各種方法處理的示例圖片。 從左邊開始,我做了
我的目標是獲得第二張沒有陰影的圖片。
請注意,我實際上有一個專門針對圖片的臨時解決方案,即單獨處理圖片帶有陰影的部分。 然而,它不是陰影圖片的通用解決方案,因為它的性能取決於陰影的大小、形狀和位置,因此請使用其他方法。
這是原圖。
這是在 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.