Python 如何进行numpy数组颜色相似性转换

Python 如何进行numpy数组颜色相似性转换,python,numpy,Python,Numpy,如果一个数组有一个numpy数组,并且它的形状是(19201080,3),我如何将所有类似于绿色的像素精确地更改为(0255,0) 我认为这样做效率不高,但确实有效。你所说的“关闭”是非常重要的。如果完美绿色的像素

如果一个数组有一个numpy数组,并且它的形状是(19201080,3),我如何将所有类似于绿色的像素精确地更改为(0255,0)


我认为这样做效率不高,但确实有效。

你所说的“关闭”是非常重要的。如果完美绿色的像素<<代码> Ly2范数小于<代码> 50 ,则认为像素“接近”为绿色。使用这样的标准,可以使用矢量化方法有效地进行替换。在这种情况下,使用布尔掩码,该掩码为
True
所有像素都接近,而
False
所有像素都不接近

import numpy as np 

# first make a test image

nx = ny = 300 # dimensions of image
green = np.array([0,255,0]) # perfect green 
im = np.random.randint(0,255,size=(nx,ny,3)) # make a fake image 


# now we make a boolean mask with shape (nx, ny) 
# it is true everywhere the L_2 distance between a pixel in im and a
# perfect green is less than 50. Here's where you need to confine what
# you mean by 'close'

mask = np.sum((im-green)**2,axis=-1) < 50**2 # mask with shape (nx, ny)
im[mask] = green # reassign all close pixels to green 
将numpy导入为np
#首先制作一个测试图像
nx=ny=300#图像尺寸
绿色=np.数组([0255,0])#完全绿色
im=np.random.randint(0255,size=(nx,ny,3))#制作一个假图像
#现在我们用形状(nx,ny)制作一个布尔掩码
#im中的一个像素和a之间的L_2距离在任何地方都是如此
#完美绿色小于50。这是你需要限制的地方
#你的意思是“接近”
遮罩=np.和((im绿色)**2,轴=-1)<50**2#带形状的遮罩(nx,ny)
im[遮罩]=绿色#将所有接近的像素重新指定为绿色

取决于“相似”的含义,可能使用2个“for”循环遍历所有像素,在每个像素中使用一个“if”语句检查中间值是否大于200,其他值是否小于50。是否要使用此配置的像素坐标?在最后一行中,我得到了一个ValueError“NumPy布尔数组索引分配无法将3个输入值分配给掩码为真的407846输出值”我认为这是因为我们将一个数组(绿色)分配给int。那么有什么办法解决它吗?现在可以了@クロポ. 我忘了一个总数。如果你有很多图像要处理,这会很快。但是,你需要将你的意思限制在接近绿色。我以类似的方式写了,发现它不够有效,因为我需要每秒处理30帧。你能一次在ram中保存所有30帧吗?最快的方法是堆叠一些数字
k
frames转换成一个形状
(k,nx,ny,3)
数组,以与我的响应类似的方式对整个对象进行布尔屏蔽,然后再次将屏蔽数组拆分为
0
轴上的帧
import numpy as np 

# first make a test image

nx = ny = 300 # dimensions of image
green = np.array([0,255,0]) # perfect green 
im = np.random.randint(0,255,size=(nx,ny,3)) # make a fake image 


# now we make a boolean mask with shape (nx, ny) 
# it is true everywhere the L_2 distance between a pixel in im and a
# perfect green is less than 50. Here's where you need to confine what
# you mean by 'close'

mask = np.sum((im-green)**2,axis=-1) < 50**2 # mask with shape (nx, ny)
im[mask] = green # reassign all close pixels to green