我最近注意到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]")
答案 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)
将产生一个频道。