gpt4 book ai didi

opencv - 为什么用 cv2 读取图像与 PIL 有不同的行为?

转载 作者:行者123 更新时间:2023-12-02 16:24:52 24 4
gpt4 key购买 nike

enter image description here

如上图所示,当我用枕头阅读时:

from PIL import Image
label = Image.open('example.png')
print(np.unique(array(label)))

数字在 [0, 34] 的范围内,这是正确的。但是,当我使用 cv2 阅读时:
import cv2
label = cv2.imread('example.png')
print(np.unique(label))

数字是 [0, 255] 这在我的应用程序中不正确。我怎样才能对齐 cv2 和 pil 的行为?

此外,当我检查解析此图像的 matlab 示例代码时,它是这样写的:
[labels, color_mappings] = imread('example.png')

看来 png文件有两个数据字段,一个是取值范围从0到34的字段,另一个是颜色像素,我如何用cv2解析它?

最佳答案

我认为 Dan 有正确的答案,但如果你想做一些“快速而肮脏”的测试,你可以使用以下代码:

  • 将您的调色板图像转换为 OpenCV 无需任何额外库即可读取的调色板索引的单 channel 灰度 PGM 图像,以及一个单独的调色板文件,您可以在之后应用它
  • 加载 OpenCV 可能已更改的索引的 PGM 文件,并重新应用保存的调色板

  • #!/usr/bin/env python3

    import numpy as np
    from PIL import Image

    # Open palette image and remove pointless alpha channel
    im = Image.open('image.png').convert('P')

    # Extract palette and save as CSV
    np.array(im.getpalette()).tofile('palette.csv',sep=',')

    # Save palette indices as single channel PGM image that OpenCV can read
    na = np.array(im)
    im = Image.fromarray(na).save('indices.pgm')

    这样就会 split image.png进入 indices.pgm OpenCV 可以读取为单 channel 图像和 palette.csv我们可以稍后重新加载。

    这是第二部分,我们从 indices.pgm 重建图像。和 palette.csv
    # First load indices
    im = Image.open('indices.pgm')

    # Now load palette
    palette = np.fromfile('palette.csv',sep=',').astype(np.uint8)

    # Put palette back into image
    im.putpalette(palette)

    # Save
    im.save('result.png')

    请记住不要在 OpenCV 中使用除 NEAREST_NEIGHBOUR 以外的任何插值,否则您将引入原始图像中不存在的新颜色。

    关键词 :Python、PNG、图像处理、调色板、调色板索引、调色板索引

    关于opencv - 为什么用 cv2 读取图像与 PIL 有不同的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61952256/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com