Matlab: Проверить все изображения в каталоге на оттенки серого? - PullRequest
3 голосов
/ 15 июля 2011

Я хочу проверить все jpg-изображения в текущем каталоге, если они в оттенках серого или содержат цветные пиксели ... Я попытался:

figdirectory = pwd;
fullpath = sprintf('%s/*.jpg', figdirectory);
d = dir(fullpath);

% Loop
pages = [];
for i = 1:length(d)
    f = d(i).name;
    fname_input = sprintf('%s/%s', figdirectory, f);

    A = imread(fname_input); 
    B = rgb2gray(A);

    if(A-B == 0)
        hascolor = 0;
    else
        hascolor = 1;
    end
    pages = [pages; hascolor];        
end 

, но это дает мне ошибку о размерах матрицы Aи B. Почему А имеет третье измерение?Спасибо!

Ответы [ 4 ]

4 голосов
/ 15 июля 2011

Для этого:

0) Предполагая, что ваш ввод - это просто «изображение», а не «громкость».

1) [r c d] = размер (im);

2) если d больше 1, то это цветное изображение

3) Иначе говоря, это должно быть серое изображение.

редактирует: Вы можете добавить еще одно условие, чтобы четко отличать шкалу серого img от цветных. Предполагая, что ваши цветные изображения имеют 3 канала,

если d равно 3, проверьте, равны ли все 3 канала

im (:,:, 1) == im (:,:, 2) && im (:,:, 1) == im (:,:, 3) Тогда у вас есть изображение в градациях серого, в противном случае цвет img

2 голосов
/ 15 июля 2011

Вот одно простое решение, основанное на IMFINFO:

%# some test images shipped with the Image Processing Toolbox
fNames = {
    'circles.png'   %# binary
    'shadow.tif'    %# indexed color
    'coins.png'     %# gray
    'peppers.png'   %# RGB
};

isGrayscale = false(size(fNames));
for i=1:numel(fNames)
    imgInfo = imfinfo(fNames{i});
    if strcmp(imgInfo.ColorType,'truecolor')
        isGrayscale(i) = false;
    elseif strcmp(imgInfo.ColorType,'grayscale')
        isGrayscale(i) = true;
    elseif strcmp(imgInfo.ColorType,'indexed')
            %# indexed images colormap (the three channels should be all same)
        isGrayscale(i) = all(all( diff(imgInfo.Colormap,[],2)==0 ,2),1);
    end
end

Первая часть в вашем случае может быть:

dirName = 'C:\path\to\myimages';
files = dir( fullfile(dirName,'*.jpg') );
fNames = {files.name}';

EDIT:

@ Адриан: Что касается изображения, которое вы поставили, то, насколько сохранен формат изображения, это цветное изображение. Теперь тот факт, что все каналы R / G / B одинаковы, является просто частным случаем ...

В любом случае, если вы хотите иметь возможность обнаруживать такие случаи, измените часть 'truecolor' приведенного выше кода на:

#% ...
if strcmp(imgInfo.ColorType,'truecolor')
    img = imread(fNames{i});
    isGrayscale(i) = isequal(img(:,:,1),img(:,:,2),img(:,:,3));
elseif strcmp(imgInfo.ColorType,'grayscale')
#% ...
2 голосов
/ 15 июля 2011

Вы можете использовать IMFINFO для этой задачи, чтобы вам не пришлось загружать изображение в память.

figdirectory = pwd;
fullpath = sprintf('%s/*.jpg', figdirectory);
d = dir(fullpath);

nImages = length(d);

%# imageType is a cell array with either 'grayscale', 'truecolor', or 'indexed', 
%# depending on the kind of image you have. 

imageType = cell(nImages,1);

for iImg = 1:nImages
info = imfinfo(d(iImg).name);
imageType{iImg} = info.ColorType;
end

%# isGrayscale is true for grayscale images, false otherwise 
%# (though note that there might be mapped images that map to a grayscale colormap).
isGrayscale = cellfun(@(x)strcmp(x,'grayscale'),imageType);

EDIT

%# the indexed images have to be loaded in order for you to check 
%# for grayscale maps

indexedIdx = find(cellfun(@(x)strcmp(x,'indexed'),imageType));

for iImg = indexedIdx(:)'

   [~,map] = imread(fullfile(figDirectory,d(iImg).name));

   %# It's a grayscale image if rgb map values are all equal
   isGrayscale(iImg) = all(all(bsxfun(@eq,map,map(:,1)),2),1);
end

%# finally, it is possible that the images are *stored* as truecolor
%# but containing, in fact, a grayscale image

truecolorIdx = find(cellfun(@(x)strcmp(x,'truecolor'),imageType));

for iImg = truecolorIdx(:)'

   img = imread(fullfile(figDirectory,d(iImg).name));

   %# It's a grayscale image if rgb map values are all equal
   isGrayscale(iImg) = all(all(all(bsxfun(@eq,img(:,:,1),img),1),2),3);
end
2 голосов
/ 15 июля 2011

Из руководства по imread http://www.mathworks.co.uk/help/techdoc/ref/imread.html

Если файл содержит изображение в градациях серого, A - это массив M-by-N. Если файл содержит изображение в истинном цвете, A - это массив M-by-N-by-3.

Таким образом, у А будет третье измерение для цветных изображений.

Если вы хотите проверить на оттенки серого, вы можете преобразовать изображение в hsv.

B = rgb2hsv(A)

из руководства, http://www.mathworks.co.uk/help/techdoc/ref/hsv2rgb.html

Когда B (:, 2) равно 0, цвета являются ненасыщенными (то есть оттенками серого).

В случае истинно цветного изображения, такого как опубликованное, оно будет, если уникальный (B (:,:, 2)) равен нулю, следовательно

A = imread(fname_input);        
B = rgb2hsv(A);

%# if saturation levels are zero then it's a greyscale image
if(unique(B(:,:,2)) == 0)
    hascolor = 0;
else         
    hascolor = 1; 
end 
...