2

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

import PIL, numpy
from PIL import Image

def add_color_range(p_a_c, r,r1,g,g1,b,b1):
    for ir in range(r, r1+1):
        for ig in range(g, g1+1):
            for ib in range(b, b1+1):
                p_a_c.extend([[ir,ig,ib]])
    return p_a_c

for i in range(1):
    im = Image.open('%*s.bmp'% (1, i))
    n_test = numpy.asarray(im)
    ni_test = numpy.zeros([1050,1680,3],dtype=numpy.uint8)
    ni_test.fill(255)
    c=[]
    c=add_color_range(c,5,10,5,10,5,10)

    for ic in range(len(c)):
        ind=numpy.where(numpy.all(n_test==c[ic],  axis=-1))
        for ii in range(len(ind[0])):
            ni_test[ind[0][ii],ind[1][ii]]=[0,0,0]
    im_test = Image.fromarray(ni_test, 'RGB')
    im_test.save('test_%*s.bmp'% (1, i))
4

1 回答 1

3
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))

解释:

如果我正确地理解了您的代码,那么您正在寻找颜色在特定范围内的点。为三个 RGB 通道中的每一个定义变量会很方便:

r, g, b = np.rollaxis(n_test, axis=-1)

如果n_test.shape(w, h, 3)那么 的形状r,gb是 每个(w, h)n_test是一个 3D 数组,但rg ,b` 是每个 2D 数组。

现在,我们可以通过定义颜色范围的不等式np.where来消除所有与特定颜色相关的点,而不是使用和选择点:for-loops

mask = (r >= 5) & (r <= 10) & (g >= 5) & (g <= 10) & (b >= 5) & (b <= 10)

每个括号表达式,例如返回一个与(ie )(r >= 5)形状相同的 2D 布尔数组。以元素方式应用逻辑和运算符。二维布尔数组也是如此。只要所有这些括号表达式都为真,它就为真。r(w, h)&mask

ni_test[mask] = 0使用 2D 布尔数组索引 2Dni_test数组,mask. 它将 0 分配给那些ni_testmaskTrue 的位置。

于 2013-05-25T12:13:24.540 回答