Matlab - 一次从多个图像中提取像素RGB值

时间:2015-03-03 20:00:49

标签: image matlab rgb pixel spectrum

我有大约2300张图像,我想在0,0位置提取每个图像的像素值。然后我想拍摄这些像素值,并按照从最亮到最暗的顺序创建一个色谱(反之亦然)。在存在相同RGB值的多个像素的情况下,带应该更厚(我希望它们各自单独计数以显示其普遍性)。每张图片大小相同。

我对Matlab很新,如果你能提供一步一步的指示,那就太好了!

1 个答案:

答案 0 :(得分: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