作者:手机用户2502903937 | 来源:互联网 | 2022-12-02 16:40
我试图使用NumPy获取与特定颜色不同的图像像素列表.
例如,在处理以下图像时:
我设法使用以下方法获取所有黑色像素的列表:
np.where(np.all(mask == [0,0,0], axis=-1))
但是当我尝试做的时候:
np.where(np.all(mask != [0,0,0], axis=-1))
我得到一个非常奇怪的结果:
看起来NumPy只返回了指数,R,G和B都是非0
这是我正在尝试做的最小例子:
import numpy as np
import cv2
# Read mask
mask = cv2.imread("path/to/img")
excluded_color = [0,0,0]
# Try to get indices of pixel with different colors
indices_list = np.where(np.all(mask != excluded_color, axis=-1))
# For some reason, the list doesn't contain all different colors
print("excluded indices are", indices_list)
# Visualization
mask[indices_list] = [255,255,255]
cv2.imshow(mask)
cv2.waitKey(0)
Georgy..
9
您应该使用np.any
而不是np.all
第二种情况选择除黑色像素以外的所有像素:
np.any(image != [0, 0, 0], axis=-1)
或者通过以下方式反转布尔数组来获得黑色像素的补充~
:
black_pixels_mask = np.all(image == [0, 0, 0], axis=-1)
non_black_pixels_mask = ~black_pixels_mask
工作范例:
import numpy as np
import matplotlib.pyplot as plt
image = plt.imread('example.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 = np.any(image != [0, 0, 0], axis=-1)
# or non_black_pixels_mask = ~black_pixels_mask
image_copy[black_pixels_mask] = [255, 255, 255]
image_copy[non_black_pixels_mask] = [0, 0, 0]
plt.imshow(image_copy)
plt.show()
如果有人使用matplotlib绘制结果并获得完全黑色的图像或警告,请参阅此文章:将所有非黑色像素转换为一种颜色不会产生预期的输出
1> Georgy..:
您应该使用np.any
而不是np.all
第二种情况选择除黑色像素以外的所有像素:
np.any(image != [0, 0, 0], axis=-1)
或者通过以下方式反转布尔数组来获得黑色像素的补充~
:
black_pixels_mask = np.all(image == [0, 0, 0], axis=-1)
non_black_pixels_mask = ~black_pixels_mask
工作范例:
import numpy as np
import matplotlib.pyplot as plt
image = plt.imread('example.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 = np.any(image != [0, 0, 0], axis=-1)
# or non_black_pixels_mask = ~black_pixels_mask
image_copy[black_pixels_mask] = [255, 255, 255]
image_copy[non_black_pixels_mask] = [0, 0, 0]
plt.imshow(image_copy)
plt.show()
如果有人使用matplotlib绘制结果并获得完全黑色的图像或警告,请参阅此文章:将所有非黑色像素转换为一种颜色不会产生预期的输出
谢谢你的回答,我想我现在意识到为什么np.any是必要的.当我使用np.all时发生的事情是该数组只包含R!= 0和B!= 0和G!= 0的颜色.这意味着颜色[255,0,0]导致False.通过使用np.any,条件变为R!= 0或B!= 0或G!= 0