【发布时间】:2020-05-02 09:48:50
【问题描述】:
我的目标是实现一个中值滤波器,它是一个函数,它将(大部分)二维数组中的每个像素替换为其周围像素的中值。可用于图像去噪。
我的实现从原始矩阵中提取子矩阵,其中包含像素本身及其邻居。这种提取目前是通过 for 循环完成的,正如您可以想象的那样,for 循环占用了大约 95% 的执行时间。
这是我当前的实现:
def median_blur(img, fsize=3):
img_intermediate = np.zeros((img.shape[0] + 2, img.shape[1] + 2), np.uint8) # First intermediate img, used for padding original image
img_intermediate[1:img.shape[0]+1, 1:img.shape[1]+1] = img
img_result = np.empty((*img.shape, fsize, fsize), np.uint8) # Will contain result, first receives kernel-submatrices
# Extract submatrices from image
for i in range(img.shape[0]):
for j in range(img.shape[1]):
img_result[i, j] = img_intermediate[i:i+fsize, j:j+fsize]
img_result = img_result.reshape(*img.shape, fsize**2) # Reshape Result-Matrix
img_result = np.median(img_result, axis=2) # Calculate median in one go
return img_result.astype('uint8')
如何使用矢量化操作提取这些子矩阵?
作为奖励,如果有计算机视觉经验的人正在阅读本文:除了将中值滤波器应用于中间零填充矩阵之外,还有更好的方法来实现中值滤波器吗?
非常感谢。
【问题讨论】:
-
median filter in scipy 涵盖了您的用例。
-
@edoput 它被多个库(scipy、scikit-image、opencv...)所覆盖,但我的目标是以最高效的方式自己实现它。
-
使用
view-as_windows: stackoverflow.com/questions/42831022 然后使用np.median? -
@Divakar 感谢您的提及,我不知道该功能!它不会是唯一的 numpy 解决方案,但肯定会做我想做的事。
-
view_as_windows是一个独立的函数代码库。因此,您可以从源代码中获取它。
标签: python numpy image-processing computer-vision vectorization