猿问

将所有非黑色像素转换为一种颜色不会产生预期的输出

我试图选择非黑色像素,然后将它们着色为黑色,将黑色像素着色为白色。我使用了Stack Overflow 上提供的解决方案,但到目前为止它对我不起作用。


import numpy as np

import matplotlib.pyplot as plt



image = plt.imread('Perforated_carbon/faltu.png')

plt.imshow(image)

plt.show()

image_copy = image.copy()


black_pixels_mask = np.all(image == [0, 0, 0], axis=-1)


non_black_pixels_mask = ~black_pixels_mask

# or non_black_pixels_mask = np.any(image != [0, 0, 0], axis=-1)  


image_copy[black_pixels_mask] = [255, 255, 255]

image_copy[non_black_pixels_mask] = [0, 0, 0]


plt.imshow(image_copy)

plt.show()

这是我目前得到的图像

http://img2.mukewang.com/616534be0001e4c902050253.jpg

我最喜欢的是这个


http://img3.mukewang.com/616534c80001ca4301790238.jpg

附加信息:


>>> image.shape

(256, 192, 3)

>>> image.dtype

dtype('float32')

>>> import matplotlib; print(matplotlib.__version__)

2.0.0


慕后森
浏览 198回答 2
2回答

繁花如伊

怎么换black_pixels_mask = np.all(image == [0, 0, 0], axis=-1);到black_pixels_mask = np.all(image == [0, 0, 0], axis=2)

月关宝盒

问题是在 matplotlib 版本 <2.2.0 中,当您将数组传递给包含超出预期范围的数据时,没有规范化和任何警告imshow。所以,你可能会得到一些意想不到的结果,比如这里:Bizzare matplotlib behavior in display images cast as floats如果您将 matplotlib 更新到版本 >=2.2.0,则在运行问题中的代码时,您将看到以下警告:Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).并且生成的图像将是您想要的图像。所以,我给你的建议是更换image_copy[black_pixels_mask] = [255, 255, 255]经过image_copy[black_pixels_mask] = [1, 1, 1]并且还需要更新 matplotlib。这是 GitHub 上的相关问题:imshow不规范 RGB 图像中的颜色范围,以及拉取请求:将RGB 数据剪辑到imshow.
随时随地看视频慕课网APP

相关分类

Python
我要回答