为什么cv2.imread会更改像素值?

时间:2018-12-11 05:22:22

标签: python image-segmentation cv2

我最近注意到cv2.imread更改了图像的像素值。我正在进行细分,因此像素值非常重要,因为不同的像素值显示了不同的标签。我正在使用下面的代码,在这里我的输入图像是蒙版的黑白图像(在Matlab中阅读以确保像素值仅为0和1。)但是当我打印original_mask的像素值时,我看到了像素值已更改,并涉及许多不同的值。任何帮助是极大的赞赏。 而且,当我打印original_image.shape时,我看到图像是RGB,这意味着具有3个通道(k,k,3)而不是1个通道!!!!

        original_mask = cv2.imread(mask_dir + '/'+lists.iloc[i, 0] + '.png')
        print(original_mask, "original_masklllll")
        print(original_mask.shape, "original_mask")
        resized_mask = cv2.resize(original_mask, (256, 256))
        print(resized_mask.shape, "resized_mask")
        print(resized_mask, "resized_mask")
        print(resized_mask[:, :, 0], "resized_mask[:, :, 0]")

2 个答案:

答案 0 :(得分:1)

您需要使用cv2.INTER_NEAREST作为调整大小调用的输入。否则,您将在像素之间插入值,这不是所需的行为。更多信息here

cv2.resize(original_mask, (256,256),interpolation=cv2.INTER_NEAREST)

对于3个通道,它们都应包含相同的值,因此您可以使用original_mask[...,0]分割单个通道,或在对cv2.IMREAD_GRAYSCALE的调用中使用cv2.imread

答案 1 :(得分:1)

cv2.imread()中有一个默认的第二个参数可以生成3通道图像。如果是单通道源图像,则通过

img = cv2.imread(path, cv2.IMREAD_UNCHANGED)

,或者在任意图像的情况下,通过

img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)

将产生一个频道。