将图像中的所有白色像素转换为黑色像素
Convert all white pixels in the image into black pixels
我有这张图片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)
但它会产生这个:
出于某种原因我无法解释。
原因是模块skimage (in your case function skimage.io.imsave
) uses RGB color sequence, whereas OpenCV (in your case function cv2.imread
) notoriously使用了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)
结果:
我有这张图片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)
但它会产生这个:
出于某种原因我无法解释。
原因是模块skimage (in your case function skimage.io.imsave
) uses RGB color sequence, whereas OpenCV (in your case function cv2.imread
) notoriously使用了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)
结果: