【问题标题】:How to save an image with the same properties as a different image如何将具有相同属性的图像保存为不同的图像
【发布时间】:2021-05-11 22:37:08
【问题描述】:

我想使用特定图像的属性,例如:

t0 = cv2.cvtColor(cv2.imread('original.jpg'), cv2.COLOR_BGR2RGB)

并保存具有相同属性的新图像。

重新表述我的问题:

我想以与“原始”相同的 dpi、尺寸、颜色属性 (RGB/BGR/GRAYSCALE) 等保存“new_image”

original = cv2.cvtColor(cv2.imread('original.jpg'), cv2.COLOR_BGR2RGB)
new_image = cv2.cvtColor(cv2.imread('new.jpg'), cv2.COLOR_BGR2RGB)

如何通过 opencv 或 matplotlib 实现?

【问题讨论】:

  • 您具体指的是哪些属性?
  • dpi 和尺寸
  • 这里有一些相关的想法...stackoverflow.com/a/57555123/2836621
  • 如果您使用的是 JPEG,而不是我上面的链接中的 PNG,我想您可以将 cv2.imencode() 放入内存中,然后搜索 JPEG APP0 标记并将这些字节替换为原始字节图像很容易。是的,这是一个 hack。

标签: python-3.x opencv matplotlib image-processing


【解决方案1】:

使用 opencv 中的 imwrite 方法。

import cv2

img='original.jpg'
t0 = cv2.cvtColor(cv2.imread(img), cv2.COLOR_BGR2RGB)

# To save your processed image
cv2.imwrite('img_t0.jpg',t0)

#To save your original file with save properties 
cv2.imwrite('new_original.jpg',img)

【讨论】:

    【解决方案2】:

    AFAIK,您无法在使用 OpenCV 编写 JPEG 时设置 dpi,因此您可以在之后使用 Python 的 subprocess 命令“shell out”exiftoolcv2.imwrite()写图片:

    exiftool -jfif:Xresolution=301 -jfif:Yresolution=302 result.jpg
    

    作为替代方案,这是一个相当讨厌的 hack,它覆盖 OpenCV 生成的 JPEG 文件中的 dpi 和 x 分辨率和 y 分辨率:

    #!/usr/bin/env python3
    
    import struct
    import numpy as np
    import cv2
    
    def writeJPEGwithdpi(im, filename, dpi=(72,72)):
       """Save the image as JPEG with embedded dpi"""
    
       # Encode as JPEG into memory
       retval, buffer = cv2.imencode(".jpg", im)
       s = bytearray(buffer)
    
       # APP0 segment looks like this
       # 0xFF, 0xE0,                     // APP0 segment
       # 0x00, 0x10,                     // size of segment, including these 2 bytes; 0x10 = 16 bytes
       # 0x4A, 0x46, 0x49, 0x46, 0x00,   // identifier string: "JFIF"
       # 0x01, 0x01,                     // JFIF version 1.01
       # 0x00,                           // density units (0=no units, 1=dpi)
       # 0x00, 0x01,                     // horizontal density
       # 0x00, 0x01,                     // vertical density
       # 0x00,                           // X thumbnail size
       # 0x00                            // Y thumbnail size
    
       # Find JFIF marker
       JFIF = s.find(b'JFIF\0')
    
       # Overwrite units, and x-resolution, and y-resolution 
       s[JFIF+7:JFIF+8]   = b'\x01'                                # density units = 1, i.e. dpi
       s[JFIF+8 :JFIF+10] = (dpi[0]).to_bytes(2, byteorder='big')  # 2 bytes of x-resolution
       s[JFIF+10:JFIF+12] = (dpi[1]).to_bytes(2, byteorder='big')  # 2 bytes of y-resolution
    
       with open(filename, "wb") as out:
          out.write(s)
    
    ################################################################################
    # main
    ################################################################################
    
    # Load sample image
    im = cv2.imread('/Users/mark/sample/images/lena.png')
    
    # Save at specific dpi
    writeJPEGwithdpi(im, "result.jpg", (77,309))
    

    exiftool检查结果:

    exiftool result.jpg
    
    ExifTool Version Number         : 12.00
    File Name                       : result.jpg
    Directory                       : .
    File Size                       : 105 kB
    File Modification Date/Time     : 2021:02:08 14:48:52+00:00
    File Access Date/Time           : 2021:02:08 14:48:54+00:00
    File Inode Change Date/Time     : 2021:02:08 14:48:52+00:00
    File Permissions                : rw-r--r--
    File Type                       : JPEG
    File Type Extension             : jpg
    MIME Type                       : image/jpeg
    JFIF Version                    : 1.01
    Resolution Unit                 : inches      <--- LOOKS GOOD
    X Resolution                    : 77          <--- LOOKS GOOD
    Y Resolution                    : 309         <--- LOOKS GOOD
    Image Width                     : 512
    Image Height                    : 512
    Encoding Process                : Baseline DCT, Huffman coding
    Bits Per Sample                 : 8
    Color Components                : 3
    Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)
    Image Size                      : 512x512
    Megapixels                      : 0.262
    

    【讨论】:

      猜你喜欢
      • 2018-07-03
      • 2013-11-13
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      • 2015-01-30
      • 2013-10-14
      • 2019-05-11
      • 2019-03-15
      相关资源
      最近更新 更多