【问题标题】:how to increase dpi with opencv?如何用opencv增加dpi?
【发布时间】:2019-08-21 01:50:15
【问题描述】:

在 ocr 使用 opencv 读取之前,我需要增加图像的 dpi。问题是:

  1. 我现在不知道我的图像 dpi
  2. 我不知道如何增加图像的 dpi

我在谷歌搜索,几乎每个答案都建议使用resize

cv2.resize()

image = cv2.imread("source.png")
resized_image = cv2.resize(image, (100, 50)) #I need to change it to 300 DPI

resize只是为了改变图片的大小,但毕竟没有增加图片的dpi,因为我尝试使用它,当我在photoshop中检查时,dpi没有改变

请帮我解答这 2 个问题

opencv 怎么做?

老实说,我需要将 dpi 更改为 300,为什么我需要知道当前的 dpi?因为如果它已经dpi > 300,所以我不需要转换它。

我是用 python 做的

【问题讨论】:

标签: python opencv


【解决方案1】:

dpi 只是 JPEG/TIFF/PNG 标头中的一个数字。在您打印图像之前,它与这个世界和他的狗完全无关,然后它决定了打印的大小,图像的尺寸(以像素为单位)。

在图像处理期间,它是无关紧要的。唯一感兴趣的是您拥有的像素数。这是图像质量或信息内容的最终决定因素 - 无论您想如何描述它。

我不相信你可以用 OpenCV 来设置它。您当然可以在终端中像这样使用 ImageMagick 进行设置:

mogrify -set density 300 *.png           # v6 ImageMagick
magick mogrify -set density 300 *.png    # v7 ImageMagick

您可以通过以下方式进行检查:

identify -format "Density: %x x %y" SomeImage.jpg    # v6 ImageMagick
magick identify -format ... as above                 # v7 ImageMagick

您可以在终端中使用 exiftool 执行类似的操作 - 请注意,exiftoolImageMagick 更小且更易于维护,因为它“只是” (非常有能力)单个 Perl 脚本:

从 EXIF IFD1 信息中提取图像分辨率:

exiftool -IFD1:XResolution -IFD1:YResolution image.jpg

从图像中提取名称中包含“分辨率”一词的所有标签|:

exiftool '-*resolution*' image.jpg

image.jpg 上设置 X/Y 分辨率(密度):

exiftool -xresolution=300 -yresolution=300 image.jpg

这是我在回答开头的意思的一个小演示......

使用 ImageMagick 创建没有 dpi 信息的 1024x768 图像:

convert -size 1024x768 xc:black image.jpg

现在检查一下:

identify -verbose image.jpg

Image: image.jpg
  Format: JPEG (Joint Photographic Experts Group JFIF format)
  Mime type: image/jpeg
  Class: PseudoClass
  Geometry: 1024x768+0+0
  Units: Undefined
  Colorspace: Gray
  Type: Bilevel
  ...
  ...

现在更改 dpi 并设置 dpi 单位并再次检查:

mogrify -set density 300 -units pixelsperinch image.jpg   # Change dpi

identify -verbose image.jpg                               # Examine

Image: image.jpg
  Format: JPEG (Joint Photographic Experts Group JFIF format)
  Mime type: image/jpeg
  Class: PseudoClass
  Geometry: 1024x768+0+0            <--- Number of pixels is unchanged
  Resolution: 300x300               <---
  Print size: 3.41333x2.56          <--- Print size is now known
  Units: PixelsPerInch              <---
  Colorspace: Gray
  Type: Bilevel
  ...
  ...

现在您可以看到,我们突然知道打印出来有多大,而且像素数没有改变。

【讨论】:

  • 我可以在同一代码中使用 open cv 和 imagemagick 吗?我的意思是我用 opencv 加载和处理图像,然后使用图像魔法改变 dpi
  • 当然,在完成处理和保存图像后,您可以在 Python 中使用 system()mogrify -set density 300 XYZ.png。 Python 中可能还有其他库 - 我只是在检查 - 也许exiv2 使用起来更自然。
  • 我没有使用 Python 绑定,但可能是 exiv2 python3-exiv2.readthedocs.io/en/latest/…
  • It is entirely irrelevant to the world and his dog until you print the image - 你在开玩笑吗?尝试在 PC 显示器和电影屏幕前看相同的图像。希望你能找到不同之处。 DPI 在每个图形设备(包括屏幕)中都很重要。
  • 感谢您的帮助,但我需要在不调用图像文件的情况下对其进行处理,因此在cv2.imread("image.png") 之后,我可以在不保存的情况下更改代码或内存中的分辨率。如果mogrify -set density 300 XYZ.png需要执行一个图像文件,而不是opencv图像数据
【解决方案2】:

尽管这是一篇旧文章,但我只想说,Tesseract 已经过测试,发现在字符高度约为 30 像素时运行得更好。请检查以下链接:

【讨论】:

  • 您链接到的文章明确指出 “OCR 错误率与大写字母的高度(以像素为单位)密切相关,无论 dpi 或点大小如何”,并且也 " xresyres 传递给 Tesseract 的 PIX 结构中的值几乎没有影响" ...从而确认 DPI 无关紧要,只是字符的高度应该是大约 30 像素 - 不考虑 dpi.
  • 我正在使用 CV2 为 OCR 预处理图像,我需要以某种方式转换图像的有效 DPI。如果我有一张大写字母为 1/4" 的纸,并且我在扫描仪上以 200DPI 扫描它 - 我的大写字母将获得 50 像素。我需要更改图像,以便获得最大30 表示字母。所以当我们说我们要更改图像中的 DPI 时,我们实际上是在说我们希望将像素数减少一个百分比,以便我们的 OCR 更好。那么我们如何使用 CV2 做到这一点?
【解决方案3】:

DPI 是图形设备的继承属性 - 显示器、扫描仪、相机等。例如 - 假设我们正在扫描图像,并且我们希望获得质量更好的图像 - 所以我们在扫描仪选项中设置更高的 DPI 值。如果没有更好的 DPI 选项 - 所以我们需要购买支持更多扫描分辨率的更好的扫描仪。有设备/方法可以实现100 000 DPI

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 2019-01-26
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多