【问题标题】:Matlab - extract pixel RGB value from multiple images at onceMatlab - 一次从多个图像中提取像素RGB值
【发布时间】:2015-03-03 20:00:48
【问题描述】:

我有大约 2300 张图像,我想在 0,0 位置提取每个图像的像素值。然后我想获取这些像素值并用它们创建一个色谱,从最亮到最暗(反之亦然)。如果有多个具有相同 RGB 值的像素,则条带应该更厚(我希望它们每个都单独计数以显示其普遍性)。每张图片大小相同。

我是 Matlab 的新手,如果你能提供一步一步的说明,那就太好了!

【问题讨论】:

  • 你的问题在哪里?
  • 您必须创建一个遍历所有图像的 for 循环。为此,您必须使用dir 函数列出所有图像。要读取图像,您必须使用imread 函数。要获得第一个像素,您可能必须阅读有关矩阵索引和 colon 运算符的文档页面。如果您在实施时遇到问题,请详细描述。

标签: image matlab rgb pixel spectrum


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    相关资源
    最近更新 更多