我试图在python中实现图像过滤器,比如Gausian。
当我试图优化代码以允许5×5内核时,我遇到了一个问题。
我的目标是允许将任何nxn Gausian核应用于图像。
目前的执行情况
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核之后,我目前遇到的错误是:
形状(5,4)和(5,5)不对齐: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)如何修改代码?
发布于 2022-04-18 22:28:17
模拟您的大小为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。
https://stackoverflow.com/questions/71915308
复制相似问题