高斯模糊图像处理矩阵乘法



我正在尝试在python中实现图像过滤器,如高斯模糊。

我遇到了一个问题,当我试图优化我的代码,以允许一个5 × 5的内核。

我的目标是允许任何nxn高斯内核应用于图像。

当前实现

def gaussianOperator(roi, kernel):
container = np.copy(roi)
size = container.shape
for i in range(size[0] - 2):
for j in range(size[1] - 2):
container[i+1][j+1] = np.sum(roi[i:i + 5, j:j + 5].dot(kernel))
# container[i+1][j+1] = g                                      

return container  

在尝试允许n × n内核后,我目前遇到的错误是:

<<blockquote>(5,5) and (5,5) not aligned: 4 (dim 1) != 5 (dim 0)

我计算和和点积的那行过去是这样的:

gx = roi[i - 1][j - 1] * kX[0][0] + roi[i][j - 1] * kX[0][2] + roi[i + 1][j - 1] * kX[1][0] + roi[i - 1][j + 1] * kX[1][2] + roi[i][j + 1] * kX[2][0] + roi[i + 1][j + 1] * kX[2][2] 

这段代码在一个3 * 3的内核上运行得很好。

创建内核的函数如下:

def gkern(l=5, sig=1.):

ax = np.linspace(-(l - 1) / 2., (l - 1) / 2., l)
gauss = np.exp(-0.5 * np.square(ax) / np.square(sig))
kernel = np.outer(gauss, gauss)

return kernel / np.sum(kernel)

如何修改代码?

模拟大小为3的内核情况:

In [174]: roi = np.arange(10)
...: for i in range(roi.shape[0]-2):
...:     x = roi[i:i+3]
...:     print(x.shape, x)
...: 
...: 
(3,) [0 1 2]
(3,) [1 2 3]
(3,) [2 3 4]
(3,) [3 4 5]
(3,) [4 5 6]
(3,) [5 6 7]
(3,) [6 7 8]
(3,) [7 8 9]

现在大小为5:

In [175]: roi = np.arange(10)
...: for i in range(roi.shape[0]-2):
...:     x = roi[i:i+5]
...:     print(x.shape, x)
...: 
(5,) [0 1 2 3 4]
(5,) [1 2 3 4 5]
(5,) [2 3 4 5 6]
(5,) [3 4 5 6 7]
(5,) [4 5 6 7 8]
(5,) [5 6 7 8 9]
(4,) [6 7 8 9]
(3,) [7 8 9]

哎呀,x在以后的迭代中太短了

调整范围

In [176]: roi = np.arange(10)
...: for i in range(roi.shape[0]-4):
...:     x = roi[i:i+5]
...:     print(x.shape, x)
...: 
(5,) [0 1 2 3 4]
(5,) [1 2 3 4 5]
(5,) [2 3 4 5 6]
(5,) [3 4 5 6 7]
(5,) [4 5 6 7 8]
(5,) [5 6 7 8 9]

我让你把它推广到2d。

最新更新