【问题标题】:Convert all white pixels in the image into black pixels将图像中的所有白色像素转换为黑色像素
【发布时间】:2018-09-28 00:52:32
【问题描述】:

我有这张图片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)

但它会产生这个:

由于某种原因,我无法解释。

【问题讨论】:

    标签: python graphics computer-vision python-imaging-library cv2


    【解决方案1】:

    原因是模块 skimage(在您的情况下为函数 skimage.io.imsave)使用 RGB 颜色序列,而 OpenCV(在您的情况下为函数 cv2.imreadnotoriously 使用 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)
    

    结果:

    【讨论】:

    • 我猜看起来仍然是白色的部分只是非常浅的红色,在背景中看起来是白色的?
    • 确实如此。简单地反转图像可能会更好。参见上面的例子。
    • 美化。正是我想要的。
    猜你喜欢
    • 2019-12-13
    • 2015-05-05
    • 1970-01-01
    • 2018-12-23
    • 2020-05-25
    • 1970-01-01
    • 2018-03-16
    • 2015-02-04
    • 2019-03-28
    相关资源
    最近更新 更多