[英]De-blur an image in matlab - Error in image dimensions
我正在嘗試在Matlab中對圖像進行去模糊處理。 這是我的代碼
im = im2double(imread('C:\Users\adhil\Desktop\matlab pics\test.JPG'));
figure, imshow (G1);
% FFT for B1
G_1 = fftshift(G1);
G_1 = fft2(G_1);
G_1 = ifftshift(G_1);
h_1 = fspecial( 'gaussian', [130 221] , 1.0 );
% Fourier Transform of 2D Gaussian
H_1 = fftshift(h_1);
H_1 = fft2(H_1);
H_1 = ifftshift(H_1);
% Apply the filter for Image G_1
display(size(G_1));
display(size(H_1));
F_1a = G_1 ./ H_1;
F_1a = ifftshift (F_1a);
F_1a = ifft2 (F_1a);
F_1a = fftshift (F_1a);
figure, imshow (F_1a);
但是我收到以下錯誤
使用./時出錯
矩陣尺寸必須一致。去模糊錯誤(第18行)
F_1a = G_1 ./ H_1;
我注意到我圖像的陣列尺寸是
display(size(G_1));
ans = 130 221 3
display(size(H_1));
ans = 130 221
然而,
h_1 = fspecial( 'gaussian', [130 221 3] , 1.0 );
不包含3維數組,請告知
您基本上是在嘗試對彩色圖像進行去模糊處理,但是您所說的過程(去卷積)假定為灰度圖像。 由於執行./
假定要與之相除的矩陣是相同的維,因此您將得到一個維不匹配,因為這是一個逐元素運算符。
順便說一句,對於多通道圖像使用fftshift / ifftshift / fft2
起始代碼對彩色圖像有未定義的行為。 具體來說,對於fftshift/ifftshift
,象限的交換在所有維度上進行,這將提供彩色圖像所不希望的行為。 具體來說,您可能想分別對每個顏色平面執行此操作,因此您想單獨對每個顏色平面應用fftshift/ifftshift
。
因此,同時解決您的問題並擺脫這種不確定行為的一種方法是分別對每個通道進行模糊處理,然后合並結果。 因此,將所有這些包裝在一個for
循環中,並定義一個空的輸出圖像,以將每個通道的結果放置在它們各自的位置。 另外,您的代碼目前無法運行。 您將輸入圖像定義為im
,但使用的變量G1
...未定義。 我將假定此im
實際上是G1
。 我對您的代碼所做的更改將%// Change
注釋分散在以下內容中:
G1 = im2double(imread('C:\Users\adhil\Desktop\matlab pics\test.JPG')); %// Change
figure, imshow (G1);
h_1 = fspecial( 'gaussian', [130 221] , 1.0 ); %// Change - leave outside loop - never changes
% Fourier Transform of 2D Gaussian
H_1 = fftshift(h_1);
H_1 = fft2(H_1);
H_1 = ifftshift(H_1);
%// Change
F_1a = zeros(size(G1));
for idx = 1 : size(G1, 3) %// Change
% FFT for B1
G_1 = fftshift(G1(:,:,idx)); %// Change
G_1 = fft2(G_1);
G_1 = ifftshift(G_1);
% Apply the filter for Image G_1
%// Change
tmp = G_1 ./ H_1;
tmp = ifftshift(tmp);
tmp = ifft2(tmp);
tmp = fftshift(tmp);
F_1a(:,:,idx) = tmp;
end
figure, imshow (F_1a);
請注意,我正在應用for
循環並將去模糊分別應用於每個通道。 我也將高斯模糊應用於循環之外,因為您只需要進行一次傅立葉變換。 完成后,我將顯示結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.