如何在PyOpenCV中保存DPI信息?解决Tesseract-OCR分辨率警告问题
在PyOpenCV中设置并保存图像DPI以解决Tesseract分辨率警告
嘿,我来帮你搞定这个Tesseract的DPI警告问题~首先得明确一点:OpenCV自带的cv2.imwrite()函数不支持直接写入图像的DPI元数据,因为它的核心是处理像素数据,对EXIF这类元数据的支持非常有限。不过我们有两种简单的办法解决这个问题,下面给你详细说:
方法一:用Pillow库补充DPI信息(推荐,最简便)
Pillow(Python Imaging Library的分支)对图像元数据的支持很完善,我们可以先用OpenCV完成图像处理,再转成Pillow的Image对象来设置并保存DPI。
修改后的完整代码如下:
import cv2 from PIL import Image import numpy as np def clear(img): back = cv2.imread("back.png", cv2.IMREAD_GRAYSCALE) img = cv2.bitwise_xor(img, back) ret, img = cv2.threshold(img, 120, 255, cv2.THRESH_BINARY_INV) return img def threshold(img): ret, img = cv2.threshold(img, 120, 255, cv2.THRESH_BINARY_INV) img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) ret, img = cv2.threshold(img, 248, 255, cv2.THRESH_BINARY) return img def formatImage(img): img = threshold(img) img = clear(img) return img # 用OpenCV完成图像预处理 img = formatImage(cv2.imread("1566135246468.png", cv2.IMREAD_COLOR)) # 转换OpenCV格式到Pillow格式(灰度图直接转换即可) pil_img = Image.fromarray(img) # 设置DPI参数,这里推荐用300dpi(OCR识别的常用最优分辨率) pil_img.save("aa.png", dpi=(300, 300))
代码说明:
- OpenCV处理后的图像是numpy数组,通过
Image.fromarray()可以直接转成Pillow的Image对象 - 调用Pillow的
save()方法时,通过dpi=(横向DPI, 纵向DPI)参数就能把DPI元数据写入图像文件 - Tesseract读取这个带DPI的图片时,就会自动识别分辨率,不会再弹出
Invalid resolution 0 dpi的警告了
方法二:用exif库给已保存的图片添加DPI
如果你更倾向于用OpenCV先保存图片,再手动补充DPI元数据,可以用exif库来操作:
import cv2 from exif import Image as ExifImage # 你的图像处理代码保持不变 def clear(img): back = cv2.imread("back.png", cv2.IMREAD_GRAYSCALE) img = cv2.bitwise_xor(img, back) ret, img = cv2.threshold(img, 120, 255, cv2.THRESH_BINARY_INV) return img def threshold(img): ret, img = cv2.threshold(img, 120, 255, cv2.THRESH_BINARY_INV) img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) ret, img = cv2.threshold(img, 248, 255, cv2.THRESH_BINARY) return img def formatImage(img): img = threshold(img) img = clear(img) return img # 用OpenCV保存处理后的图片 img = formatImage(cv2.imread("1566135246468.png", cv2.IMREAD_COLOR)) cv2.imwrite("aa.png", img) # 打开图片文件添加DPI元数据 with open("aa.png", "rb+") as f: exif_img = ExifImage(f) # 设置横向和纵向DPI为300 exif_img.x_resolution = 300 exif_img.y_resolution = 300 exif_img.resolution_unit = 2 # 2代表分辨率单位为英寸(Tesseract默认识别英寸单位) # 把修改后的内容写回文件 f.seek(0) f.write(exif_img.get_file())
注意事项:
- 这个方法需要先安装
exif库:pip install exif - 相比Pillow的方法,步骤更繁琐,所以更推荐第一种方案
最后补充一句:设置合适的DPI(比如300dpi)不仅能解决警告,还能让Tesseract的OCR识别准确率更高哦~
内容的提问来源于stack exchange,提问作者Jinnrry




