Matlab - отображение фонового изображения - PullRequest
1 голос
/ 31 октября 2011

Я пытаюсь найти медианные значения для каналов R, G & B каждого пикселя для каждого 10-го изображения в наборе 100, чтобы найти фоновое изображение.Все мои значения кажутся правильными, но когда я пытаюсь отобразить фон в конце моего кода, он всегда белый, пожалуйста, помогите

%// 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)

спасибо

Ответы [ 3 ]

3 голосов
/ 31 октября 2011

Первый шаг - это векторизация вашего кода. Вместо следующего блока кода:

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]. Изображения в Matlab обычно относятся к классу double или single со значениями от 0 до 1 или к классу uint8 или uint16 со значениями между 0, 255 или 0, 65535 соответственно. Если ваши значения находятся в диапазоне от 0 до 255, но class (subimages) возвращает double или single, перед использованием imshow () сделайте следующее:

subimages = uint8(subimages);
0 голосов
/ 07 ноября 2011

Вы можете переписать свой код как:

%# 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)
0 голосов
/ 31 октября 2011

Попробуйте

imshow(background,[])

При использовании imshow MATLAB необходимо установить диапазон отображения.Для одиночных или двойных изображений в градациях серого диапазон отображения по умолчанию составляет [0 1].Это означает, что любое значение больше 1 будет представлено белым цветом.Вы можете исправить это, установив свой собственный диапазон отображения вручную, скажем

imshow(background,[0 100],

, или вы можете позволить MATLAB рассчитать новый диапазон отображения, выполнив

imshow(background,[])

, что аналогично

imshow(background,[min(background(:)) max(background(:))])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...