我正在尝试实现高斯滤波器。为此,我使用内核3x3和图像数组。我遇到的问题是为数组的每个[i,j]元素定义一个子矩阵3x3。我在代码中写了详细信息。
import numpy as np
import scipy
from scipy import misc
import matplotlib.pyplot as plt
imagen = scipy.misc.imread("C:\\Users\\Reymi\\Downloads\\imagen.png") #importing image of original size (1929, 1280)
imagen_real = scipy.pad(array=imagen, pad_width=[1, 1], mode='constant', constant_values=0) #add 1 column and 1 row of zeros to avoid the kernel of going outside the array. size is (1931, 1282)
imagen_nueva = np.empty((1931, 1282)) #the new image. the same size as the image I will filter
(dim_x,dim_y)=np.shape(imagen_real)
ker1 = np.array([[1/16, 1/8, 1/16], #3x3 kernel
[1/8, 1/4, 1/8],
[1/16, 1/8, 1/16]])
def multiplicar_entero():
global imagen_nueva
for i in range(1,dim_x): #the range starts from 1 to avoid the column and row of zeros, and ends before the last col and row of zeros
for j in range(1,dim_y):
imagen_entry = np.empty((3, 3)) #Main problem here: how do I define a 3x3 matrix for each entry?
valor = np.sum(imagen_entry*ker1) #Matrix 3x3 is filled with the elements around each [i, j] entry of the array
imagen_real[i, j] = valor
imagen_nueva = np.append(imagen_real[i, j], (1931, 1282)) #This is supposed to each new [i, j] entry to the new image
print("La imagen con el blur effect es la siguiente:\n")
multiplicar_entero() #calls function
plt.imshow(imagen_nueva) #Show new image
plt.gray()
plt.show()
很抱歉长代码。并感谢您的帮助。
答案 0 :(得分:0)
您的代码存在一些问题:
scipy.misc.ascent
。我对下面的代码做了一些修改,我想你可以看到我是如何解决你的问题的。具体来说,您希望使用:
索引,它允许您提取数组的子集并使用array[i, j]
来分配结果:
import numpy as np
import scipy
from scipy import misc
import matplotlib.pyplot as plt
imagen = scipy.misc.ascent() # Freely available image
(dim_x, dim_y) = np.shape(imagen)
ker1 = np.array([[1/16, 1/8, 1/16], #3x3 kernel
[1/8, 1/4, 1/8],
[1/16, 1/8, 1/16]])
def multiplicar_entero(imagen):
imagen_nueva = np.zeros(imagen.shape) #the new image. the same size as the image I will filter
for i in range(1,dim_x-1): #the range starts from 1 to avoid the column and row of zeros, and ends before the last col and row of zeros
for j in range(1,dim_y-1):
imagen_entry = imagen[i-1:i+2, j-1:j+2]
valor = np.sum(imagen_entry*ker1) #Matrix 3x3 is filled with the elements around each [i, j] entry of the array
imagen_nueva[i, j] = valor
return imagen_nueva
imagen_nueva = multiplicar_entero(imagen)
plt.imshow(imagen_nueva) #Show new image
plt.gray()
plt.show()