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

时间:2020-05-22 09:49:52

标签: opencv python-imaging-library

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进行解析?

1 个答案:

答案 0 :(得分:1)

我认为Dan的答案是正确的,但是如果您想进行“快速而肮脏的”测试,则可以使用以下代码进行操作:

  • 将您的调色板图像转换为OpenCV无需任何额外库即可读取的调色板索引的单通道灰度PGM图像,以及一个可以在以后应用的单独的调色板文件

  • 重新加载OpenCV可能已更改的索引的PGM文件,然后重新应用保存的调色板


   capturedImageButton.setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent photoCaptureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(photoCaptureIntent, 100);
            }
        });

  capturedImageButton1.setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent photoCaptureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(photoCaptureIntent, 101);
            }
        });


  @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode == RESULT_OK){
            switch (this.resultCode){
                 case 100:
                    Bitmap bitmap = (Bitmap)data.getExtras().get("data");
                    capturedImageButton.setImageBitmap(bitmap);
                    break;

                case 101:
                    Bitmap bitmap = (Bitmap)data.getExtras().get("data");
                    capturedImageButton1.setImageBitmap(bitmap);
                    break;

               default:
                  break;
            }

        }
    }

因此,将#!/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') 分成image.png,OpenCV可以将其读取为单个通道图像,而indices.pgm则可以稍后再加载。

这是第二部分,我们从palette.csvindices.pgm重建图像

palette.csv

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

关键字:Python,PNG,图像处理,调色板,调色板索引,调色板索引