如何将.HEIC/.HEIF图像读入(python)opencv进行后续处理?

plicqrtu  于 2023-03-23  发布在  Python
关注(0)|答案(3)|浏览(410)

对于一个大量使用opencv/numpy/scipy的python项目,我想摄取一个.HEIC/.HEIF图像**,而不需要**首先转换成任何其他格式,例如JPEG等。
有什么办法吗?
此链接并不意味着:
https://docs.opencv.org/3.0-beta/modules/imgcodecs/doc/阅读_and_writing_images.html?highlight=imread#Mat%20imread(const%20String&%20filename,%20int%20flags)
但提示启用构建标志OPENCV_BUILD_3RDPARTY_LIBS可能会有帮助。搜索该标志结果很少。
注意:请不要使用PIL/枕头,除非这是唯一的方法。
谢谢!

sf6xfgos

sf6xfgos1#

你可以用pyvips这样做:

#!/usr/bin/env python3

import pyvips
import numpy as np

# map vips formats to np dtypes
format_to_dtype = {
   'uchar': np.uint8,
   'char': np.int8,
   'ushort': np.uint16,
   'short': np.int16,
   'uint': np.uint32,
   'int': np.int32,
   'float': np.float32,
   'double': np.float64,
   'complex': np.complex64,
   'dpcomplex': np.complex128,
}

# vips image to numpy array
def vips2numpy(vi):
    return np.ndarray(buffer=vi.write_to_memory(),
                  dtype=format_to_dtype[vi.format],
                  shape=[vi.height, vi.width, vi.bands])

# Open HEIC image from iPhone
vipsim = pyvips.Image.new_from_file("iPhone.heic", access='sequential')
print(f'Dimensions: {vipsim.width}x{vipsim.height}')

# Do conversion from vips image to Numpy array
na = vips2numpy(vipsim)
print(f'Numpy array dimensions: {na.shape}, dtype:{na.dtype}')

示例输出

Dimensions: 3024x4032
Numpy array dimensions: (4032, 3024, 3), dtype:uint8
6kkfgxo0

6kkfgxo02#

你可以使用Python Wand来实现,它使用ImageMagick并安装了libheif委托,或者你可以简单地使用子进程调用从Python调用ImageMagick。

import subprocess

cmd = ['/usr/local/bin/convert','image.suffix','image.heic']

subprocess.call(cmd, shell=False)
fjnneemd

fjnneemd3#

使用OpenCV将HEIC转换为PNG

import numpy as np
    import cv2
    import pillow_heif
    
    heif_file = pillow_heif.open_heif("image.heic", convert_hdr_to_8bit=False, bgr_mode=True)
    np_array = np.asarray(heif_file)
    cv2.imwrite("rgb16.png", np_array)

如果不需要高位格式,则删除convert_hdr_to_8bit参数。
这是一个仅处理文件中第一个图像的简化示例。
P.S.:pillow_heif最小支持版本为0.10.0

相关问题