此示例說明如何使用盲反頻域模糊圖像。 當不知道有關失真(模糊和噪聲)的信息時,使用盲逆頻域算法可能是有效的。 該算法可以同時恢復圖像和點擴散函數(PSF)。 每次迭代都使用加速的 Decay-Lucy 算法。 其他光學系統(如單反)的特性可以作為輸入參數,幫助提高圖像復原的質量。 PSF 約束可以通過用戶指定的函數傳入。
第一步:讀圖
將灰度圖像讀入工作區。 函數可以處理任何維度的字段。
I = imread('cameraman.tif');
figure;imshow(I);title('Original Image');
text(size(I,2),size(I,1)+15, ...
'Image courtesy of Massachusetts Institute of Technology', ...
'FontSize',7,'HorizontalAlignment','right');
第 2 步:模擬模糊
模擬可能模糊的真實圖像(例如,由于 DSLR 運動或缺乏焦點)。 此示例通過將高斯混合器與頻域中的真實圖像相結合來模擬模糊(使用 )。 之后,高斯混合器表示點擴散函數 PSF。
PSF = fspecial('gaussian',7,10);
Blurred = imfilter(I,PSF,'symmetric','conv');
imshow(Blurred)
title('Blurred Image')
第 3 步:使用各種尺寸的 PSF 恢復模糊圖像
為了說明了解真實 PSF 大小的重要性,此示例執行了三個恢復。 每個 PSF 重建都以一個統一字段(鏈表)開始。
第一次恢復 J1 和 P1,使用較小的字段作為 PSF 的初始猜測。 字段的每個維度規范都比真實 PSF 少 4 個像素。
UNDERPSF = ones(size(PSF)-4);
[J1,P1] = deconvblind(Blurred,UNDERPSF);
imshow(J1)
title('Deblurring with Undersized PSF')
第二次恢復 J2 和 P2,對原始 PSF 使用由 1 組成的字段摩擦力的圖像分析,其每個位維度的規格比實際 PSF 長 4 個像素。
OVERPSF = padarray(UNDERPSF,[4 4],'replicate','both');
[J2,P2] = deconvblind(Blurred,OVERPSF);
imshow(J2)
title('Deblurring with Oversized PSF')
第三個恢復 J3 和 P3,使用由 1 組成的字段來形成與實際 PSF 大小完全相同的初始 PSF。
INITPSF = padarray(UNDERPSF,[2 2],'replicate','both');
[J3,P3] = deconvblind(Blurred,INITPSF);
imshow(J3)
title('Deblurring with INITPSF')
第 4 步:剖析恢復的 PSF
所有三個減少也形成 PSF。 右圖顯示了對構造的 PSF 的剖析如何幫助猜測初始 PSF 的正確大小。 在真正的 PSF(高斯混合器)中,最大值位于中心(紅色)并在邊界處減小(藍色)。
figure;
subplot(2,2,1)
imshow(PSF,[],'InitialMagnification','fit')
title('True PSF')
subplot(222)
imshow(P1,[],'InitialMagnification','fit')
title('Reconstructed Undersized PSF')
subplot(2,2,3)
imshow(P2,[],'InitialMagnification','fit')
title('Reconstructed Oversized PSF')
subplot(2,2,4)
imshow(P3,[],'InitialMagnification','fit')
title('Reconstructed true PSF')
在第一次恢復中重組的 PSFP1 似乎不符合約束規范。 邊界處的信號差異很大。 與模糊圖像相比,相應的圖像 J1 沒有顯示出任何改進的清晰度。
在第二個補丁中重建的 PSFP2 具有非常平滑的邊緣。 這意味著恢復可以處理較小格式的 PSF。 相應的圖像 J2 顯示出一些去模糊,但被振鈴嚴重損壞。
最后,在第三個補丁中重構的 PSFP3 位于 P1 和 P2 之間。 陣列 P3 非常類似于真實的 PSF。 對應圖像J3明顯提升; 并且它一直被振鈴效應破壞。
第五步:提高修復效果
恢復圖像J3中的振鈴出現在圖像中硬度對比鮮明的區域和圖像邊界處。 此示例說明如何通過指定加權函數來增加振鈴。 該算法在恢復圖像和 PSF 時根據數組對每個像素進行加權。 在我們的例子中摩擦力的圖像分析,我們首先使用邊緣函數來尋找“清晰”的像素。 通過反復試驗,我們確定理想的閾值水平為 0.08。
WEIGHT = edge(Blurred,'sobel',.08);
為了擴大面積,我們使用并傳入一個結構元素se。
se = strel('disk',2);
WEIGHT = 1-double(imdilate(WEIGHT,se));
靠近邊界的像素也被參數化為 0。
WEIGHT([1:3 end-(0:2)],:) = 0;
WEIGHT(:,[1:3 end-(0:2)]) = 0;
figure
imshow(WEIGHT)
title('Weight Array')
通過使用鏈表調用函數并減少迭代次數 (30) 來恢復圖像。 幾乎所有的振鈴效應都被抑制了。
[J,P] = deconvblind(Blurred,INITPSF,30,[],WEIGHT);
imshow(J)
title('Deblurred Image')
第 6 步:對 PSF 恢復使用附加約束
此示例說明如何在 PSF 上指定其他約束。 下面的函數 FUN 返回更改后的 PSF 字段,用于下一次迭代。
在這種情況下,FUN 刪除 PSF 的每個維度中的 P1 和 P2 個素數,然后用零填充以確保數組保持其原始大小。 這個操作并沒有改變PSF中心的值,有效的減少了PSF的大小2*P1和2*P2像素。
P1 = 2;
P2 = 2;
FUN = @(PSF) padarray(PSF(P1+1:end-P1,P2+1:end-P2),[P1 P2]);
傳入匿名函數 FUN。 有關為函數提供附加參數的信息,請參閱文檔中函數 FUN 的“參數化函數”部分。
在此示例中,初始 PSF 的大小比實際 PSF 大 4 個像素。 在 FUN 上設置 P1=2 和 P2=2 作為參數,使有價值的空間與真正的 PSF 大小相同。 因此,生成的 JF 和 PF 類似于反頻域結果(步驟 4 中的 J 和 P),具有正確的 PSF 大小并且沒有 FUN 調用。
[JF,PF] = deconvblind(Blurred,OVERPSF,30,[],WEIGHT,FUN);
imshow(JF)
title('Deblurred Image')
如果我們使用過大的初始 PSF,但缺少約束函數 FUN,則得到的圖像將類似于步驟 3 中得到的不令人滿意的結果 J2。
請注意,可以省略 FUN 之前的任何未指定參數,例如本例中不必要的占位符 ([])。
注:本文根據官網內容有所改動。
以下免費視頻教程的特點是無PPT,無水,直接編程環境下的實戰課程:
歡迎您進一步了解以下系列文章: