今天也是到处找代码的一天呢~ 2023-05-13 20:09 采纳率: 0%
浏览 6

python做逆滤波

有无朋友能用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
  • 写回答

1条回答 默认 最新

  • qq_41738858 2023-05-14 05:38
    关注

    根据您提供的代码,似乎缺少对图像和卷积核进行傅里叶变换的步骤。以下是一个修改过的代码,您可以尝试使用这个代码并检查结果是否正确:

    评论

报告相同问题?

问题事件

  • 创建了问题 5月13日

悬赏问题

  • ¥60 怎样隐藏win7系统进程?
  • ¥15 CBF预处理数据归一化的时候报错了如下图
  • ¥15 qt 转 msvc 后 Opencv 始终打不开视频!
  • ¥15 yolo v5中labelimg的作用
  • ¥15 国赛c题2021,没有理解这一串代码的意思,这样报错该怎么解决(语言-matlab)
  • ¥15 一、执行完中断程序后如何继续运行,二、中断结束后如何跳过中断触发前的点位(LOW点不要继续运行,可以运行UP点)(关键词-程序运行)
  • ¥15 if为什么跳过if 直接执行else 中文
  • ¥200 解决登录微信老版本限制封号问题
  • ¥15 mysql中时间处理问题
  • ¥20 讲解此音频放大电路原理及关键部分