我正在尝试使用以下脚本解码 Aztec 条形码:
import zxing
reader = zxing.BarCodeReader()
barcode = reader.decode("test.png")
print(barcode)
这是输入图像:
以下是输出:
条形码(原始=无,解析=无, 路径='/Users/dhiwatdg/Desktop/test.png',格式=无,类型=无, 点=无)
我确定它是有效的阿兹特克条形码。不是脚本无法解码。
未检测到条形码,因为黑条周围存在强烈的“振铃”伪像(可能是“散焦”问题的结果)。
我们可以应用二进制阈值来获得黑色和白色之间更高的对比度。
找到正确的阈值很困难...
为了找到正确的阈值,我们可以从
cv2.THRESH_OTSU
返回的自动阈值开始,并增加阈值直到检测到条形码。注:
代码示例:
import cv2
import zxing
reader = zxing.BarCodeReader()
img = cv2.imread('test.png', cv2.IMREAD_GRAYSCALE) # Read the image as grayscale.
thresh, bw = cv2.threshold(img, 0, 255, cv2.THRESH_OTSU) # Apply automatic binary thresholding.
while thresh < 245:
print(f'thresh = {thresh}')
cv2.imshow('bw', bw) # Show bw image for testing
cv2.waitKey(1000) # Wait 1 second (for testing)
cv2.imwrite('test1.png', bw) # Save bw as input image to the barcode reader.
barcode = reader.decode("test1.png", try_harder=True, possible_formats=['AZTEC'], pure_barcode=True) # Try to read the barcode
if barcode.type is not None:
break # Break the loop when barcode is detected.
thresh += 10 # Increase the threshold in steps of 10
thresh, bw = cv2.threshold(img, thresh, 255, cv2.THRESH_BINARY) # Apply binary threshold
cv2.imwrite('bw.png', bw) # Save bw for debugging
cv2.destroyAllWindows()
print(barcode)
thresh
的最后一个值 = 164
。
最后
bw
图片:@Rotem 的解决方案 效果完美。我还发现通过应用维纳滤波器可以使用以下解决方案。
import cv2
import zxing
img = cv2.imread("test.png")
dst = cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21)
cv2.imwrite("test_tmp.png", dst)
reader = zxing.BarCodeReader()
barcode = reader.decode("test_tmp.png")
print(barcode)