我正在尝试在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。