我正在生成一些基本的高斯滤波演示,但我得到了特殊的输出图,因为它们没有线性模糊。下面的代码导入任何图像,然后应用std(sigma)值为1,大小为5的高斯滤波器。
我认为它可能是一个有限的vs无限滤波器数组假设问题,但不确定。 conv2函数不是我自己的函数,而是Matlabs conv2函数的模拟函数,我在这里找到了。
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
from scipy.ndimage.filters import convolve
def conv2(x,y):
"""
This function the 2D convolution of two 2D input array x and y.
Parameters
----------
x : ndarray
y : ndarray
Returns
----------
z : convolved image output
Usage:
z = conv2(x,y,mode='same')
"""
# Add singleton dimensions
if (len(x.shape) < len(y.shape)):
dim = x.shape
for i in range(len(x.shape),len(y.shape)):
dim = (1,) + dim
x = x.reshape(dim)
elif (len(y.shape) < len(x.shape)):
dim = y.shape
for i in range(len(y.shape),len(x.shape)):
dim = (1,) + dim
y = y.reshape(dim)
origin = ()
# Apparently, the origin must be set in a special way to reproduce
# the results of scipy.signal.convolve and Matlab
for i in range(len(x.shape)):
if ( (x.shape[i] - y.shape[i]) % 2 == 0 and
x.shape[i] > 1 and
y.shape[i] > 1):
origin = origin + (-1,)
else:
origin = origin + (0,)
z = convolve(x,y, mode='constant', origin=origin)
return z
# Question 1 - Guassian Blur
def Gaussian_filter(gamma, N):
"""
Create the Gaussian filters
"""
Amp = 1 / (2*np.pi*gamma**2)
x = np.arange(-N,N,0.5)
y = np.arange(-N,N,0.5)
[x,y] = np.meshgrid(x,y)
g = Amp * np.exp(-(x**2 + y **2)/(2*gamma**2))
return g
im = Image.open("/home/will/Downloads/lenaTest3.jpg")
arr = np.array(im)
sigma=1
N=5
gaus = Gaussian_filter(sigma,5)
plt.figure(1)
plt.subplot(1,4,1)
plt.imshow(arr,cmap='gray')
plt.subplot(1,4,2)
plt.imshow(gaus,cmap='gray')
plt.subplot(1,4,3)
plt.imshow(conv2(arr,gaus),cmap='gray',vmin=0,vmax=255)
plt.subplot(1,4,4)
plt.imshow(arr-conv2(arr,gaus),cmap='gray',vmin=0,vmax=255)
你可以在右边看到两幅高斯模糊不规则的图像。注意:它适用于更高的stdev(sigma)值,例如10。
答案 0 :(得分:2)
看起来像8位integer overflow的问题。您可以处理浮动图像,并避免此类问题:arr = np.array(im, dtype=np.float32)
。
scipy.signal.convolve2d
?
比转换一些MATLAB代码要安全得多(我看到它会给你的函数带来不同的结果)。
您的完整代码应如下所示:
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
from scipy.signal import convolve2d
def Gaussian_filter(gamma, N):
Amp = 1 / (2*np.pi*gamma**2)
x = np.arange(-N,N,0.5)
y = np.arange(-N,N,0.5)
[x,y] = np.meshgrid(x,y)
g = Amp * np.exp(-(x**2 + y **2)/(2*gamma**2))
return g
if __name__ == "__main__":
im = Image.open(r"C:\Users\eladj\Desktop\lena.jpg")
arr = np.array(im, dtype=np.float32)
sigma = 1
N = 5
gaus = Gaussian_filter(sigma,5)
im_blurred = convolve2d(arr, gaus, mode='same')
im_DoG = arr - im_blurred
plt.figure(1)
plt.subplot(1,4,1)
plt.imshow(arr, cmap='gray')
plt.colorbar(fraction=0.046)
plt.xticks([]), plt.yticks([])
plt.subplot(1,4,2)
plt.imshow(gaus, cmap='gray')
plt.colorbar(fraction=0.046)
plt.xticks([]), plt.yticks([])
plt.subplot(1,4,3)
plt.imshow(im_blurred, cmap='gray')
plt.colorbar(fraction=0.046)
plt.xticks([]), plt.yticks([])
plt.subplot(1,4,4)
plt.imshow(im_DoG, cmap='gray')
plt.colorbar(fraction=0.046)
plt.xticks([]), plt.yticks([])
注意每张图像的灰度值。