2011-10-31 250 views
1

我試圖找到每100像素中每個第10個圖像的每個像素的R,G & B通道的中值,以找到背景圖像。我的價值似乎都正確的,但是當我嘗試顯示在我的代碼末端的背景,總是白色的,請大家幫忙Matlab - 顯示背景圖像

%// list all the files in some folder 
folder = '~/V&R/1/'; 
filelist = dir(folder); 
images = zeros(480,640,3,100); 
% images = []; 
%// the first two in filelist are . and .. 

count = 1; 
for i=3:size(filelist,1) 

    if filelist(i).isdir ~= true 
     fname = filelist(i).name; 
     %// if file extension is jpg 
     if strcmp(fname(size(fname,2)-3:size(fname,2)) ,'.jpg' ) == 1 
      tmp = imread([folder fname]); 
      images(:,:,:,count) = tmp; 
      count = count +1; 

     end 
    end 
end 


background = zeros(480,640,3); 
for j=1:480 
    for i=1:640 
     tmpR = zeros(1,10); 
     tmpG = zeros(1,10); 
     tmpB = zeros(1,10); 
     for k=1:10 
      tmpR(k) = images(j,i,1,k*10); 
      tmpG(k) = images(j,i,2,k*10); 
      tmpB(k) = images(j,i,3,k*10); 

     end 
     background(j,i,1) = floor(median(tmpR)); 
     background(j,i,2) = floor(median(tmpG)); 
     background(j,i,3) = floor(median(tmpB)); 
    end 
end 
imshow(background) 

感謝

+0

即興如果您的值是0和255,但類(子圖像)之間返回雙或單,使用imshow()之前,請執行下列操作,我會說試試'imagesc(背景)' – dantswain

回答

3

第一步是矢量化你的代碼。相反,下面的代碼塊:

background = zeros(480,640,3); 
for j=1:480 
    for i=1:640 
    tmpR = zeros(1,10); 
    tmpG = zeros(1,10); 
    tmpB = zeros(1,10); 
    for k=1:10 
     tmpR(k) = images(j,i,1,k*10); 
     tmpG(k) = images(j,i,2,k*10); 
     tmpB(k) = images(j,i,3,k*10); 

    end 
    background(j,i,1) = floor(median(tmpR)); 
    background(j,i,2) = floor(median(tmpG)); 
    background(j,i,3) = floor(median(tmpB)); 
    end 
end 

寫:

subimages = images(:, :, :, 1:10:end); 
background = median(subimages, 4); 

現在爲之前所說,使用imshow與[]選項,以顯示您的圖片:

imshow(background, []); 

,如果你仍然看到一個白色的圖像,那麼你有可能處理的是一個不在[0,1]之間的double值矩陣。 Matlab中的圖像通常是類別爲double或single的值,分別介於0和1之間,或者分類爲uint8或uint16,值分別爲0,255或0,65535。

subimages = uint8(subimages); 
+0

這相當於下面這行代碼;如果你的min(背景(:))和max(背景(:))都爲零,那麼你的原始圖像(背景(:),最大(背景(:)); 4D矩陣有一個問題 – Bee

+0

我得到了3和210的最小值和最大值,但仍然得到一個白色的圖像 – ECH

+1

然後,你可能有一個圖像,只有一些低值像素和圖像的其餘部分都是(210,210 ,210),使用imshow(...,[]),所有這些值都會轉換爲白色,並且您可能無法檢測到較暗的散射像素。使用imtool(subimages,[])並使用閾值工具看看你是否能找到任何這樣的零散點 – Bee

0

嘗試

imshow(background,[]) 

當使用imshow,MATLAB需要設置顯示範圍。對於單張或雙張灰度圖像,默認顯示範圍爲[0 1]。這意味着任何大於1的值都將表示爲白色。您可以通過手動設置自己的顯示範圍解決這個問題,說

imshow(background,[0 100], 

,或者你可以讓MATLAB計算新的顯示範圍做

imshow(background,[]) 

這是一樣的

imshow(background,[min(background(:)) max(background(:))]) 
+0

嗨,我試着用第一個選項,並得到這個錯誤消息: '???錯誤使用==> checkDisplayRange在22 HIGH必須大於LOW。 錯誤==> imageDisplayValidateParams at 57 common_args.DisplayRange = checkDisplayRange(common_args.DisplayRange,mfilename); 錯誤==> imageDisplayParseInputs at 79 common_args = imageDisplayValidateParams(common_args); A1在44 imshow 錯誤==> imshow在199 [common_args,specific_args] = ... 錯誤==>(背景,[])' ,然後試圖其他兩個但直到得到相同的白色圖像結果 – ECH

+0

背景的最小值和最大值是多少? – Ghaul

+0

最小值爲0,最大值爲255 – ECH

0

您可以重寫代碼爲:

%# get filenames of all JPG images in some folder 
folder = '~/V&R/1/'; 
filelist = dir(fullfile(folder,'*.jpg')); 
filelist = strcat(folder, filesep, {filelist.name}); 

%# read files, and store as 'double' images in a 4D matrix 
images = zeros(480,640,3, numel(filelist), 'double'); 
for i=1:numel(filelist) 
    images(:,:,:,i) = im2double(imread(filelist{i})); 
end 

%# estimate background using median 
subimages = images(:,:,:,1:10:end); 
background = median(subimages, 4); 
imshow(background)