2012-11-10 164 views
0

我正在試圖計算每個像素的平均值,只是左邊和右邊的鄰居,但在我的處理結束時,我只得到一個白色圖像,我找不到我的錯誤。這裏是我的代碼matlab中的平均濾波器

imageIn = imread('Prueba.jpg'); 
imageIn = rgb2gray(imageIn); 
imageOut = zeros(size(imageIn)); 

ny = size(imageIn, 1); 
nx = size(imageIn, 2); 

imshow(imageIn); 

u = []; 
v = []; 

tic 

for i = 1:ny 
    u = imageIn(i,:); 
    v = zeros(1, ny); 
    for k = 2:ny-1 
     v(k) = (uint32(u(k-1))+uint32(u(k))+uint32(u(k+1)))/3; 
    end 
    %Special cases first and last pixel 
    v(1) = (uint32(u(2))+uint32(u(1))+uint32(u(2)))/3; 
    v(ny) = (uint32(u(ny-1))+uint32(u(ny))+uint32(u(ny-1)))/3; 
    imageOut(i,:) = v; 
end 

toc 
imshow(imageOut); 

任何想法?

+0

你是如何處理邊緣案例?如果一個像素沒有左或右鄰居怎麼辦? – slayton

+0

當它沒有左鄰居時,我使用兩次正確的像素,反之亦然。這就是'特殊情況'下面的行所做的(或應該做的)。 – BRabbit27

+0

它已經很長時間了,我用matlab,但我想你可能會使用整數除法,它將返回一個整數,而不是一個浮點數?如果你省略了;我相信它會在運行時輸出var,所以每次處理完成後可能會輸出v? –

回答

4

將代碼的最後一行更改爲imagesc(imageOut),您將看到圖像實際上不是白色。

你的代碼很好;使用imshow()函數後圖像顯示爲白色的原因是因爲在應用本地平均值之後,像素亮度範圍要小得多,並且imshow()所使用的默認縮放比例不足以顯示圖像的對比度。

閱讀有關差異b/t imshow()imagesc(),你會看到混亂。

+0

謝謝,實際上我只是找到了另一種方式來做到這一點,'imageOut = mat2gray(imageOut)'。我會閱讀其中的差異。非常感謝。 – BRabbit27

0

爲什麼不創建一個第一個克隆的第2個矩陣,將它移過來然後對這兩個矩陣進行平方?

imIn = imread('Prueba.jpg'); 

nx = size(d,1); 
ny = size(d,2); 

% Create temporary matrices padded with nan 
tmp1 = [nan(ny,2), d]; 
tmp2 = [d, nan(ny,2)]; 

imOut = tmp1; 
imOut(:,:,2) = tmp2; 

% use nanmean so the mean is just the value of the 1 column 
imOut = nanmean(imOut,3); 

out = imOut(2:end-1,:); 
+0

是的,我想也是這樣,但我需要做的是用左右鄰居逐行計算每個像素的平均值。所以我感謝你的幫助,但我很樂意讓這些代碼有效。 – BRabbit27

+0

多數民衆贊成代碼這是什麼 – slayton

0

嘗試使用此

imageIn = imread('Prueba.jpg'); 
imageIn = rgb2gray(imageIn); 
imageOut = zeros(size(imageIn)); 

ny = size(imageIn, 1); 
nx = size(imageIn, 2); 

imshow(imageIn); 

u = []; 
v = []; 

tic 

for i = 1:ny 
u = imageIn(i,:); 
v = zeros(1, ny); 
for k = 2:ny-1 
v(k) = (uint32(u(k-1))+uint32(u(k))+uint32(u(k+1)))/3; 
end 
%Special cases first and last pixel 
v(1) = (uint32(u(2))+uint32(u(1))+uint32(u(2)))/3; 
v(ny) = (uint32(u(ny-1))+uint32(u(ny))+uint32(u(ny-1)))/3; 
imageOut(i,:) = v; 
end 

toc 

imshow(imageOut);

+1

這似乎是我把相同的代碼。無論如何,我嘗試過,但仍然'imageOut'是白色 – BRabbit27

+0

它肯定看起來像相同的代碼。 Hany Gharib,你改變了什麼? – praseodym