Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在图像中查找颜色并在第二个图像上重新绘制(使用numpy)_Python_Image_Numpy_Colors_Find - Fatal编程技术网

Python 在图像中查找颜色并在第二个图像上重新绘制(使用numpy)

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

我试图在一张图片中找到特定的颜色(或更可能的颜色范围),并在第二张图片上重新绘制坐标,以便进一步调查。因为我读了很多关于numpy有多伟大的文章,所以我开始使用它(我对python非常陌生,尤其是numpy)。 所以,我写了一些东西,一种颜色效果很好,但是很多颜色都有(性能)问题,我很确定,我可以通过使用numpy提供的更多功能来解决这个问题。基本上,我想杀死for循环。这是我的代码(稍后我必须添加更多颜色范围):

如果
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)