经cv2二值化后的JPEG图像出现非0/255像素值,是否正常?
问题分析与解决
你遇到的这个现象不是操作错误,核心原因出在JPEG格式的特性上。
具体原因
- 用
cv2.threshold生成的thresh数组本身确实只有0和255两种像素值,但调用cv2.imwrite保存为JPEG时,JPEG的有损压缩算法会对像素做近似处理,导致部分像素偏离0或255,出现中间值。 - 要是换成PNG这类无损格式保存,就不会有这个问题——PNG会严格保留二值图的像素信息。
验证方法
你可以在保存前先检查thresh的像素值,比如加这段代码:
import numpy as np # 输出数组里的唯一像素值 print(np.unique(thresh))
运行后会得到[0 255],证明阈值处理后的结果是符合预期的,问题出在JPEG保存环节。
解决办法
- 优先换成PNG格式保存:
cv2.imwrite("C:\\Users\\***\\***\\Workspace\\Payment Advice 3 page - 3 - thresh.png", thresh)
- 如果必须用JPEG,可提高压缩质量(最高设为100),尽量减少像素偏差:
cv2.imwrite("C:\\Users\\***\\***\\Workspace\\Payment Advice 3 page - 3 - thresh.jpg", thresh, [int(cv2.IMWRITE_JPEG_QUALITY), 100])
不过即使质量拉满,JPEG仍可能存在轻微偏差,无损格式是更可靠的选择。
内容的提问来源于stack exchange,提问作者Roshan
相关产品推荐
相关产品推荐

