You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在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

火山引擎 最新活动