我正在尝试取消模糊以下图片的片段。



最初的PSF没有给出,所以我继续分析模糊的部分,看看是否有我可以粗略地找出一个词。我发现我可以在模糊部分中找出“ of”。我在透明部分中裁剪了模糊的“ of”及其对应部分,如下所示。



然后,我在FFT讲座中认为,将模糊(频域)与特定的模糊函数(频域)相除以重新创建原始图像。

我以为如果可以进行Unblurred(频域)\ Blurred(频域),则可以检索原始PSF。请告知我该怎么做。

下面是我的代码:

img = im2double(imread('C:\Users\adhil\Desktop\matlab pics\image1.JPG'));
Blurred = imcrop(img,[205 541 13 12]);
Unblurred = imcrop(img,[39 140 13 12]);

UB = fftshift(Unblurred);
UB = fft2(UB);
UB = ifftshift(UB);

F_1a = zeros(size(B));
for idx = 1 : size(Blurred, 3)
    B = fftshift(Blurred(:,:,idx));
    B = fft2(B);
    B = ifftshift(B);

    UBa = UB(:,:,idx);
    tmp = UBa ./ B;
    tmp = ifftshift(tmp);
    tmp = ifft2(tmp);
    tmp = fftshift(tmp);
    [J, P] = deconvblind(Blurred,tmp);

end

subplot(1,3,1);imshow(Blurred);title('Blurred');
subplot(1,3,2);imshow(Unblurred);title('Original Unblurred');
subplot(1,3,3);imshow(J);title('Attempt at unblurring');


但是,此代码不起作用,并且出现以下错误:

Error using deconvblind
Expected input number 2, INITPSF, to be real.

Error in deconvblind>parse_inputs (line 258)
validateattributes(P{1},{'uint8' 'uint16' 'double' 'int16' 'single'},...

Error in deconvblind (line 122)
[J,P,NUMIT,DAMPAR,READOUT,WEIGHT,sizeI,classI,sizePSF,FunFcn,FunArg] = ...

Error in test2 (line 20)
    [J, P] = deconvblind(Blurred,tmp);


这是重新创建原始PSF的好方法吗?

最佳答案

我不是该领域的专家,但是我已经进行了一些反卷积的工作,并且编写了一个程序来计算给定清晰图像和模糊图像时的点扩散函数。使用此程序获得psf函数后,我通过使用它对模糊图像进行反卷积验证了它的正确性,并且可以正常工作。代码如下。我知道这篇文章非常老,但是希望它对某些人仍然有用。

import numpy as np
import matplotlib.pyplot as plt
import cv2

def deconvolve(normal, blur):
    blur_fft = np.fft.rfft2(blur)
    normal_fft = np.fft.rfft2(normal)
    return np.fft.irfft2(blur_fft/(normal_fft))

img = cv2.imread('Blurred_Image.jpg')
blur = img[:,:,0]
img2 = cv2.imread('Original_Image.jpg')
normal = img2[:,:,0]

psf_real = deconvolve(normal, blur)


fig = plt.figure(figsize=(10,4))
ax1 = plt.subplot(131)
ax1.imshow(blur)
ax2 = plt.subplot(132)
ax2.imshow(normal)
ax3 = plt.subplot(133)
ax3.imshow(psf_real)
plt.gray()
plt.show()

08-24 21:46