www.gusucode.com > images 案例代码 matlab源码程序 > images/DeblurImagesUsingBlindDeconvolutionExample.m

    %% Deblur images using blind deconvolution
%%
% This example shows how to deblur an image using blind deconvolution. The
% example illustrates the iterative nature of this operation, making two
% passes at deblurring the image using optional parameters.
%%
% Read an image into the workspace and display it.

% Copyright 2015 The MathWorks, Inc.

I = imread('cameraman.tif');
figure
imshow(I)
title('Original Image')
%%
% Create a point spread function (PSF).  A PSF describes the degree to
% which an optical system blurs (spreads) a point of light.
PSF = fspecial('motion',13,45);
figure
imshow(PSF,[],'InitialMagnification','fit')
title('Original PSF')
%%
% Create a simulated blur in the image, using the PSF, and display the
% blurred image.
Blurred = imfilter(I,PSF,'circ','conv');
figure
imshow(Blurred)
title('Blurred Image')
%%
% Deblur the image using the |deconvblind| function. You must make an
% initial guess at the PSF. To determine the size of the PSF, examine the
% blurred image and measure the width of a blur (in pixels) around an
% obviously sharp object. Because the size of the PSF is
% more important than the values it contains, you can typically specify an
% array of 1's as the initial PSF. 
% 
% In this initial restoration, |deconvblind| was able to deblur the image
% to a great extent. Note, however, the ringing around the sharp intensity
% contrast areas in the restored image. (The example
% eliminated edge-related ringing by using the 'circular' option with
% |imfilter| when creating the simulated blurred image.) To achieve a more
% satisfactory result, rerun the operation, experimenting with PSFs of
% different sizes. The restored PSF returned by each deconvolution can also
% provide valuable hints at the optimal PSF size.
INITPSF = ones(size(PSF));
[J P] = deconvblind(Blurred,INITPSF,30);
figure
imshow(J)
title('Restored Image')
figure
imshow(P,[],'InitialMagnification','fit')
title('Restored PSF')
%%
% One way to improve the result is to create a weight array to exclude
% areas of high contrast from the deblurring operation. This can reduce
% contrast-related ringing in the result. 
%
% To create a weight array, create an array the same size as the image, and
% assign the value 0 to the pixels in the array that correspond to pixels
% in the original image that you want to exclude from processing. The
% example uses a combination of edge detection and morphological processing
% to detect high-contrast areas in the image. Because the blur in the image
% is linear, the example dilates the image twice. To exclude the image
% boundary pixels (a high-contrast area) from processing, the example uses
% |padarray| to assign the value 0 to all border pixels.
WEIGHT = edge(I,'sobel',.28);
se1 = strel('disk',1);
se2 = strel('line',13,45);
WEIGHT = ~imdilate(WEIGHT,[se1 se2]);
WEIGHT = padarray(WEIGHT(2:end-1,2:end-1),[1 1]);
figure
imshow(WEIGHT)
title('Weight Array')
%%
% Refine the guess at the PSF.  The reconstructed PSF returned by the first
% pass at deconvolution, |P| , shows a clear linearity. For this second
% pass, the example uses a new PSF which is the same as the returned PSF
% but with the small amplitude pixels set to 0.
P1 = P;
P1(find(P1 < 0.01))= 0;
%%
% Run the deconvolution again, this time specifying the weight array and
% the modified PSF. Note how the restored image has much less ringing
% around the sharp intensity areas than the result of the first pass.
[J2 P2] = deconvblind(Blurred,P1,50,[],double(WEIGHT));
figure, imshow(J2)
title('Newly Deblurred Image');
figure, imshow(P2,[],'InitialMagnification','fit')
title('Newly Reconstructed PSF')