我正在尝试实现一个算法来验证RGB图像的4个邻居像素(上、下、左和右),如果所有像素的RGB值相等,我会在输出图像中标记一个像素为1,否则它将是0。非向量化实现代码如下:
def set_border_interior(img):
img_rows = img.shape[0]
img_cols = img.shape[1]
res = np.zeros((img_rows,img_cols))
for row in xrange(1,img_rows-1):
for col in xrange(1,img_cols-1):
data_b = set()
data_g = set()
data_r = set()
up = row - 1
down = row + 1
left = col - 1
right = col + 1
data_b.add(img.item(row,col,0))
data_g.add(img.item(row,col,1))
data_r.add(img.item(row,col,2))
data_b.add(img.item(up,col,0))
data_g.add(img.item(up,col,1))
data_r.add(img.item(up,col,2))
data_b.add(img.item(down,col,0))
data_g.add(img.item(down,col,1))
data_r.add(img.item(down,col,2))
data_b.add(img.item(row,left,0))
data_g.add(img.item(row,left,1))
data_r.add(img.item(row,left,2))
data_b.add(img.item(row,right,0))
data_g.add(img.item(row,right,1))
data_r.add(img.item(row,right,2))
if (len(data_b) == 1) and (len(data_g) == 1) and (len(data_r) == 1):
res.itemset(row,col, False)
else:
res.itemset(row,col, True)
return res
这种非向量化的方式真的很慢(甚至使用img.item读取数据和img.itemset设置新值)。有没有更好的方法在Numpy(或scipy)中实现呢?
all_equal
数组在两个方向上都缺少前面的第一个(索引为0
)和后面的最后一个(索引为n-1
),这与您之前所做的相同,我想。 - Jaime