[英]Convolve an RGB image with a custon neighbout kernel using Python and Numpy
我正在尝试实现一种算法来验证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)中实现这个?
将边框放在一边,无论如何都没有明确定义功能,您可以执行以下操作:
import numpy as np
import matplotlib.pyplot as plt
rows, cols = 480, 640
rgb_img = np.zeros((rows, cols, 3), dtype=np.uint8)
rgb_img[:rows//2, :cols//2] = 255
center_slice = rgb_img[1:-1, 1:-1]
left_slice = rgb_img[1:-1, :-2]
right_slice = rgb_img[1:-1, 2:]
up_slice = rgb_img[:-2, 1:-1]
down_slice = rgb_img[2:, 1:-1]
all_equal = (np.all(center_slice == left_slice, axis=-1) &
np.all(center_slice == right_slice, axis=-1) &
np.all(center_slice == up_slice, axis=-1) &
np.all(center_slice == down_slice, axis=-1))
plt.subplot(211)
plt.imshow(rgb_img, interpolation='nearest')
plt.subplot(212)
plt.imshow(all_equal, interpolation='nearest')
plt.show()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.