在Scipy(或其他类似库)中,是否有一种方法可以仅在某些所需点处使用给定卷积核对图像进行卷积?
我正在寻找类似于以下内容的东西:
ndimage.convolve(image, kernel, mask=mask)
当核需要应用时,mask
包含True
(或1
),否则为False
(或0
)。
编辑:以下是示例Python代码,可以实现我想要做的事情(但不比使用Scipy进行整个图像卷积更快):
def kernel_responses(im, kernel, mask=None, flatten=True):
if mask is None:
mask = np.ones(im.shape[:2], dtype=np.bool)
ks = kernel.shape[0]//2
data = np.pad(im, ks, mode='reflect')
y, x = np.where(mask)
responses = np.empty(y.shape[0], float)
for k, (i, j) in enumerate(zip(y, x)):
responses[k] = (data[i:i+ks*2+1, j:j+ks*2+1] * kernel).sum()
if flatten:
return responses
result = np.zeros(im.shape[:2], dtype=float)
result[y, x] = responses
return result
上述代码使用wrap
边界条件完成了任务,但内部循环是用Python实现的,因此速度较慢。我想知道是否已经在scipy
/opencv
/skimage
中实现了更快的方法。