我有大约2300张图像,我想在0,0位置提取每个图像的像素值。然后我想拍摄这些像素值,并按照从最亮到最暗的顺序创建一个色谱(反之亦然)。在存在相同RGB值的多个像素的情况下,带应该更厚(我希望它们各自单独计数以显示其普遍性)。每张图片大小相同。
我对Matlab很新,如果你能提供一步一步的指示,那就太好了!
答案 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)。pixels
在每个循环中都会发生变化,并且预分配会更有效。在这种情况下,我不在乎,imread
已经花费的时间远远超过调整pixels
的费用。hist
进行直方图。我假设亮度是什么意思,这里我假设你的意思是亮度。您的亮度是0到255之间的值,因此您的直方图区间可以强制为0:255,这是指定直方图区间的一种方式。
注意:您可能已经注意到MATLAB是基于1的索引,而不是0