以布尔方式添加矩阵

时间:2014-08-14 07:13:14

标签: python image-segmentation

我有一些矩阵代表图片的分段部分。 我需要“添加”片段以制作分段图片。

可以使用数组进行更简单的解释。

a = [3, 0, 0, 0]
b = [3, 1, 0, 0]
c = [0, 0, 0, 1]

我怎样才能做出类似的事情:

result = a AND b AND c 
result = [3, 1, 0, 1]

这是某种叠加。

像素值与位置一致,因为它们来自相同的源图片。

感谢。

3 个答案:

答案 0 :(得分:2)

没有库函数可以执行此操作,但您仍然可以使用numpy函数来帮助计算。 np.nonzero将返回所有非零元素的索引,在您的情况下,您只需要最后一个这样的元素,这样您就可以使用np.max来查找它。

下面是两个执行此操作的函数,但是如果所有元素都为0则必须注意。其中一个函数是间隔开来的,为了可读性而编写(func),一个是单行列表理解因为LC只是 awesome。

import numpy as np

a = [3, 0, 0, 0]
b = [3, 1, 0, 0]
c = [0, 0, 0, 1]

data = np.array([a, b, c])

def func_LC(x):
    return np.array([row[np.max(np.nonzero(row))] if len(np.nonzero(row)[0]) else 0 for row in np.array(list(zip(*x)))])

def func(x):
    result = []
    for row in x:
        nonzero = np.nonzero(row)
        if len(nonzero[0]) == 0: # Handles if all elements are 0.
            result.append(0)
        else:
            result.append(row[np.max(nonzero)])

答案 1 :(得分:0)

我相信没有库函数可以做到这一点,所以,对于那些真正理解这个问题的人来说,这就是答案:

def non_Destructive_pixel_addition(original, segmentated):

    to_be_added = np.matrix(np.where(segmentated)).transpose()

    n, m = np.shape(to_be_added)

    for k in range(n):
        i = to_be_added[k, 0]
        j = to_be_added[k, 1]
        if (original[i,j] == 0):
            original[i,j] = segmentated[i,j]

答案 2 :(得分:-1)

您可以使用列表理解:

result = [a[i] | b[i] | c[i] for i in range(len(a))]

编辑:

如果值可以是不同的最大值:

result = [max(a[i], b[i], c[i]) for i in range(len(a))]