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')