有无朋友能用python实现这个:使用平滑函数𝒉(𝒙)=exp√(x^𝟐+𝒚^𝟐 )/𝟏𝟐𝟎与DIP图卷积产生模糊,然后用逆滤波实现对有模糊图像的恢复。
我感觉我在matlab和python中写了一样的代码,但是只有matlab能够得到正确的结果。
import cv2
import matplotlib.pyplot as plt
import math
import numpy as np
from numpy import fft
import scipy.ndimage
def invfilter(kerf,d0):
M=fft.fftshift(1/kerf)
[m,n]=M.shape
for i in range(0,m):
for j in range(0,n):
d=math.sqrt((i-m/2)**2+(j-n/2)**2)
if (d>d0):
M[i,j]=1
M=fft.ifftshift(M)
return M
image = cv2.imread("D:/dasanxia/digital_picture_process/DIP.bmp")
image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
image=image/255
shape=image.shape
k=np.tile(np.arange(-3,4)**2,(7,1))
m=k.T
kernel = np.exp(np.sqrt(k+m)/120)
kernel=kernel/sum(sum(kernel))
img=scipy.ndimage.filters.convolve(image, kernel, mode='nearest')
#img=cv2.filter2D(image,-1,kernel=kernel)
plt.subplot(131),plt.imshow(image,cmap='gray')
plt.subplot(132),plt.imshow(img,cmap='gray')
imgf=fft.fft2(img)
kerf=fft.fft2(kernel,shape)
kerff=invfilter(kerf,125)
out=kerff*imgf
out = fft.ifft2(out)
plt.subplot(133)
plt.imshow(np.abs(out),cmap='gray')
plt.show()
imag = im2double(imread('D:/dasanxia/digital_picture_process/DIP.bmp'));
imag=rgb2gray(imag);
[m,n,~] = size(imag);
%平滑
h = exp(sqrt(repmat((-3:3).^2,7,1) + repmat((-3:3)'.^2,1,7))/120);
h = h./(sum(sum(h)));%归一化
%对图像进行平滑
imag_h = imfilter(imag, h,'conv','circular');
%逆滤波
H = fft2(h,m,n);
imag_H = fft2(imag_h);
M = invfilter(H,125);
out = M.*imag_H;
out = ifft2(out);
%绘图
figure
subplot(1,3,1);imshow(imag);title('原图');
subplot(1,3,2);imshow(imag_h);title('平滑滤波');
subplot(1,3,3);imshow(abs(out));title('逆滤波');
function M = invfilter(h,d0)
M = fftshift(1./(h+eps));
%M = 1./(fftshift(h)+eps);
[m,n] = size(M);
for i = 1:m
for j = 1:n
d = sqrt((i-m/2)^2+(j-n/2)^2);
if(d>d0)
M(i,j) = 1;
end
end
end
M = ifftshift(M);
end
根据您提供的代码,似乎缺少对图像和卷积核进行傅里叶变换的步骤。以下是一个修改过的代码,您可以尝试使用这个代码并检查结果是否正确: