将图像中所有的白色像素转换为黑色像素。

4

我有这张图片rand-walk-2.png

rand-walk-2.png

我想把所有的白色像素点转换为黑色像素点,以便得到一张红色随机漫步在黑色背景上的图片。这意味着我不能只是反转颜色。我的当前代码只是找到白色像素并将它们设置为黑色:

from PIL import Image
import PIL.ImageOps    
import numpy as np
from skimage.io import imsave
import cv2


in_path  = 'rand-walk-2.png'
out_path = 'rand-walk-trial.png'


Image = cv2.imread(in_path)
Image2 = np.array(Image, copy=True)

white_px = np.asarray([255, 255, 255])
black_px = np.asarray([0  , 0  , 0  ])

(row, col, _) = Image.shape

for r in xrange(row):
    for c in xrange(col):
        px = Image[r][c]
        if all(px == white_px):
            Image2[r][c] = black_px

imsave(out_path, Image2)

但它会产生这个结果:

rand-walk-trial.png

原因我无法解释。

1个回答

7
原因是模块skimage(在您的情况下为函数skimage.io.imsave)使用RGB颜色顺序,而OpenCV(在您的情况下为函数cv2.imread臭名昭著地使用BGR颜色顺序。因此,脚本会使蓝色和红色交换。

您有两种解决方案:在读取后直接将图像转换为RGB:

Image = cv2.imread(in_path)
Image = cv2.cvtColor(Image, cv2.COLOR_BGR2RGB)

或者使用cv2保存输出图像:

cv2.imwrite(out_path, Image2)

结果:

黑色背景上的红色随机走动


另一个解决方案,可以得到更好的输出,就是反转你的图像:

Image = cv2.imread(in_path)
Image = cv2.bitwise_not(Image)
cv2.imwrite(out_path, Image)

结果:

黑色背景上美丽的青色随机行走图

或者,如果您仍然想要红色,可以反转、去除绿色通道并交换蓝色和红色:

Image = cv2.imread(in_path)
Image = cv2.bitwise_not(Image)
b,g,r = cv2.split(Image)
z = np.zeros_like(g)
Image = cv2.merge((z,z,b))
cv2.imwrite(out_path, Image)

结果:

黑色背景上的美丽红色随机漫步


这是一个包含图片链接的HTML代码,图片展示了黑色背景上的美丽红色随机漫步。

我猜那些仍然看起来白色的部分只是非常浅的红色,再次出现在背景中显得白色? - xiaolingxiao
1
确实。你可能最好只是反转图像。请参见上面的示例。 - Andriy Makukha
美化。正是我想要的。 - xiaolingxiao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接