我如何将.HEIC/.HEIF图像读入(Python)OpenCV以进行进一步处理?

4
对于一个大量使用opencv/numpy/scipy的Python项目,我希望能够在不先转换为其他格式(如JPEG等)的情况下导入.HEIC/.HEIF图像。是否有这样的方法?这个链接暗示没有。

https://docs.opencv.org/3.0-beta/modules/imgcodecs/doc/reading_and_writing_images.html?highlight=imread#Mat%20imread(const%20String&%20filename,%20int%20flags)

但是提示启用构建标志OPENCV_BUILD_3RDPARTY_LIBS可能会有所帮助。搜索该标志几乎没有结果。

注意:除非这是唯一的方法,否则请不要使用PIL/Pillow。

谢谢!


@MarkSetchell,@jcupitt仍未发表评论:( 有什么想法吗? - jtlz2
3个回答

2
你可以使用 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

0
你可以使用Python Wand来完成这个,它使用安装了libheif代理的ImageMagick。或者你可以直接从Python中调用ImageMagick使用subprocess调用。
import subprocess

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

subprocess.call(cmd, shell=False)

0

使用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参数。
这是一个简化的示例,仅适用于文件中的第一张图像。
附注:pillow_heif的最低支持版本为0.10.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接