Python 在图像中查找颜色并在第二个图像上重新绘制(使用numpy)
我试图在一张图片中找到特定的颜色(或更可能的颜色范围),并在第二张图片上重新绘制坐标,以便进一步调查。因为我读了很多关于numpy有多伟大的文章,所以我开始使用它(我对python非常陌生,尤其是numpy)。 所以,我写了一些东西,一种颜色效果很好,但是很多颜色都有(性能)问题,我很确定,我可以通过使用numpy提供的更多功能来解决这个问题。基本上,我想杀死for循环。这是我的代码(稍后我必须添加更多颜色范围): 如果Python 在图像中查找颜色并在第二个图像上重新绘制(使用numpy),python,image,numpy,colors,find,Python,Image,Numpy,Colors,Find,我试图在一张图片中找到特定的颜色(或更可能的颜色范围),并在第二张图片上重新绘制坐标,以便进一步调查。因为我读了很多关于numpy有多伟大的文章,所以我开始使用它(我对python非常陌生,尤其是numpy)。 所以,我写了一些东西,一种颜色效果很好,但是很多颜色都有(性能)问题,我很确定,我可以通过使用numpy提供的更多功能来解决这个问题。基本上,我想杀死for循环。这是我的代码(稍后我必须添加更多颜色范围): 如果n\u测试形状为(w,h,3),则r、g和b的形状分别为(w,h)n_tes
n\u测试形状为(w,h,3)
,则r
、g
和b
的形状分别为(w,h)
n_test
是一个3D数组,但是r
、g、b`都是2D数组
现在,我们不必使用np.where
并选择与特定颜色相关的点,而是可以通过定义颜色范围的不等式来消除所有for循环
:
mask = (r >= 5) & (r <= 10) & (g >= 5) & (g <= 10) & (b >= 5) & (b <= 10)
mask=(r>=5)&(r=5)&(g=5)&(b=5)
返回与r
形状相同的二维布尔数组(即(w,h)
)。
和
应用逻辑和运算符元素。因此,mask
也是一个二维布尔数组。无论那些附加的表达是真的,这都是真的
ni_-test[mask]=0
使用二维布尔数组对二维数组ni_-test
进行索引,mask
。它将0分配给ni_测试中mask
为真的位置 好的,谢谢,效果很好。如果其他人有其他建议,我会等一段时间,但我想,差不多就是这样。我遇到了另一个问题。我想要一张monochron图片,而不是RGB图片。我试过一些东西,但结果很奇怪。到目前为止,有效的方法是在Image.fromarray(ni_test,'RGB')中添加.convert('1'),但这意味着,我创建了一个RGB图片,然后将其转换,而不是首先创建一个monochron图片。我修改了代码以输出单色图像。为此,我进行了ni_测试
形状n_测试。形状[:2]
,然后在模式L
中将其转换为PIL图像。我尝试了相同的方法,但使用了模式“1”。这真的没什么区别。
import PIL
import Image
import numpy as np
i = 0
im = Image.open('%*s.bmp' % (1, i)).convert('RGB')
n_test = np.asarray(im)
r, g, b = np.rollaxis(n_test, axis=-1)
ni_test = np.empty(n_test.shape[:2], dtype=np.uint8)
ni_test.fill(255)
mask = (r >= 5) & (r <= 10) & (g >= 5) & (g <= 10) & (b >= 5) & (b <= 10)
ni_test[mask] = 0
im_test = Image.fromarray(ni_test, '1')
im_test.save('test_%*s.bmp' % (1, i))
r, g, b = np.rollaxis(n_test, axis=-1)
mask = (r >= 5) & (r <= 10) & (g >= 5) & (g <= 10) & (b >= 5) & (b <= 10)