Matlab - извлечь значение RGB пикселя из нескольких изображений одновременно

У меня есть около 2300 изображений, для которых я хотел бы извлечь значение пикселя каждого из них в точке 0,0. Затем я хотел бы взять эти значения пикселей и создать с ними цветовой спектр в порядке от самого светлого к самому темному (или наоборот). Там, где есть несколько пикселей с одним и тем же значением RGB, полоса должна быть толще (я хочу, чтобы каждый из них учитывался отдельно, чтобы показать его распространенность). Каждое изображение одинакового размера.

Я очень новичок в Matlab, если бы вы могли предоставить пошаговые инструкции, это было бы здорово!


person kelly06    schedule 03.03.2015    source источник
comment
где твой вопрос?   -  person Sébastien Dawans    schedule 03.03.2015
comment
Вы должны создать цикл for, который перебирает все изображения. Для этого вам нужно использовать функцию dir для вывода списка всех изображений. Чтобы читать изображения, вы должны использовать функцию imread. Чтобы получить первый пиксель, вам, вероятно, придется прочитать страницы документации об индексации матриц и операторе colon. Если у вас возникли проблемы с реализацией этого, опишите их подробно.   -  person Daniel    schedule 03.03.2015


Ответы (1)


Вы можете начать с чего-то вроде этого:

IMAGES_DIR = '.'; % path to your images
IMAGES_EXT = '.jpg';

files = dir(IMAGE_DIR);
image_count = 0;
for i = 1:length(files)
    [~,~,ext] = fileparts(files(i).name);
    if(strcmp(ext,IMAGES_EXT)) 
        image_count = image_count + 1;
        im = imread(fullfile(IMAGE_DIR, files(i).name));
        pixels(image_count) = rgb2gray(im(1,1,:));
    end
end
hist(pixels, 0:255)
  • dir(path) возвращает список структур с информацией о файлах в каталоге. .name читает свойство name структуры.
  • fullfile позволяет восстановить путь к самому файлу путем объединения каталога и файла.
  • image_count — это отдельный счетчик (я не использую i), потому что изображений будет меньше, чем отсканированных файлов (даже если все изображения подходят, у вас все равно будут . и .. в выводе dir()).
  • imread загружает изображение RGB. R, G, B хранятся в третьем измерении, поэтому im имеет размер [h,w,3].
  • pixels — это массив, в котором мы храним только первое изображение каждого изображения, а im заменяется на каждой итерации для экономии памяти.
  • rgb2gray вычисляет яркость, применяя стандартную формулу 0.2989*R + 0.5870*G + 0.1140*B. Ожидается, что последнее измерение входных данных будет иметь размер 3. Здесь мы передаем элемент 1x1x3 (RGB первого пикселя).
  • MATLAB предупредит вас, что pixels изменяется в каждом цикле и что было бы эффективнее предварительно выделить. В этом случае мне все равно, так как imread уже займет гораздо больше времени, чем накладные расходы на изменение размера pixels.
  • Если вы хотите построить график появления каждого значения, вы можете сделать гистограмму с hist.

Я сделал предположение о том, что вы подразумеваете под яркостью, здесь я предполагаю, что вы имеете в виду яркость. Ваша яркость — это значение от 0 до 255, поэтому ваши ячейки гистограммы могут быть принудительно установлены на 0: 255, что является одним из способов указания ячеек гистограммы.

Примечание: как вы могли заметить, MATLAB индексирует на основе 1, а не 0

person Sébastien Dawans    schedule 03.03.2015