2 回答

TA貢獻1831條經驗 獲得超4個贊
zbar
,它做了一些預處理,沒有檢測到二維碼,你可以測試運行zbarimg image.jpg
。
好的二值化在這里很有用。我使用kraken.binarization.nlbin()
Kraken 庫的功能讓它工作。該庫適用于 OCR,但也適用于 QR 碼,通過使用非線性處理。Kraken 二值化代碼在這里。
這是示例的代碼:
from kraken import binarization
from PIL import Image
from pyzbar.pyzbar import decode
from pyzbar.pyzbar import ZBarSymbol
image_path = "image.jpg"
# binarization using kraken
im = Image.open(image_path)
bw_im = binarization.nlbin(im)
# zbar
decode(bw_im, symbols=[ZBarSymbol.QRCODE])
[Decoded(data=b'DE-AAA002065', type='QRCODE', rect=Rect(left=1429, top=361, width=300, height=306), polygon=[Point(x=1429, y=361), Point(x=1429, y=667), Point(x=1729, y=667), Point(x=1723, y=365)])]
下圖為二維碼后二維碼的清晰圖像:

TA貢獻1836條經驗 獲得超13個贊
我有一個類似的問題,Seanpue 的回答讓我走上了解決這個問題的正確軌道。由于我已經在使用 OpenCV 庫而不是 PIL 進行圖像處理,因此我使用OpenCV 教程中關于 Image Thresholding的說明來執行 Otsu 的二值化。這是我的代碼:
import cv2
from pyzbar.pyzbar import decode
from pyzbar.pyzbar import ZBarSymbol
image_path = "qr.jpg"
# preprocessing using opencv
im = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
blur = cv2.GaussianBlur(im, (5, 5), 0)
ret, bw_im = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# zbar
decode(bw_im, symbols=[ZBarSymbol.QRCODE])
[Decoded(data=b'DE-AAA002065', type='QRCODE', rect=Rect(left=1429, top=362, width=300, height=305), polygon=[Point(x=1429, y=362), Point(x=1430, y=667), Point(x=1729, y=667), Point(x=1724, y=366)])]
應用高斯模糊應該可以去除圖片中的噪點,以使二值化更有效,但對于我的應用程序來說,它實際上并沒有太大的區別。至關重要的是將圖像轉換為灰度以使閾值函數起作用(在此處通過打開帶有cv2.IMREAD_GRAYSCALE標志的文件來完成)。
添加回答
舉報