Проверьте каждый пиксель для определенного цвета (в пределах определенного порога) - PullRequest
2 голосов
/ 16 марта 2009

У меня есть изображение RGB в MATLAB, и я хочу пройтись по каждому пикселю и проверить, имеет ли он цвет кожи (ish) [Возможно, я сделаю это позже в пространстве HSV, чтобы свести на нет эффекты освещения и т. Д.]

Кто-нибудь знает лучший способ сделать это? Странный синтаксис MATLAB меня немного смущает!

На данный момент у меня есть:

<code>for x = 1:size(I,1)
    for y = 1:size(I,2)
            %Get the value from this x,y coordinate and check the colour.
    end
end

Но я думаю, что это ужасно неправильно.

Как правильно обращаться к различным частям матрицы?

Ответы [ 3 ]

7 голосов
/ 16 марта 2009

Ed

Вам не нужно зацикливаться:

>> a  = magic(5)

a =

    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9


>> vi = (a > 5) & (a < 10)

vi =

     0     0     0     1     0
     0     0     1     0     0
     0     1     0     0     0
     0     0     0     0     0
     0     0     0     0     1

Вы можете видеть, как это утверждение может быть расширено для RGB и тому подобного. Я бы сделал функцию


function out = isFlesh (in)

%% поместите сюда код проверки плоти


Я подозреваю, что вы захотите получить диапазон этих (iscautersburg, isAsian и т. Д.). Проблема будет в том, что существует огромный диапазон телесных цветов, поэтому вы захотите проверить наличие близости соседям подобной цветовой гаммы.

Эта часть проблемы проста, но большая проблема таит в себе опасность.

-Doug

4 голосов
/ 16 марта 2009

Следует иметь в виду, что изображения RGB представляют собой трехмерные матрицы. Первая «страница» (то есть A (:,:, 1) ) - красная, вторая - зеленая, а третья - синяя. Иногда мне проще работать с матрицами RGB, преобразовав их в матрицы размером 3 на 3, где все красные пиксели находятся в столбце 1, зеленый - в столбце 2, а синий - в столбце 3. Вот как это сделать:

A = (a 3-D RGB image);
matSize = size(A);
A = reshape(A,prod(matSize(1:2)),3);
...
% Modify or extract data from reshaped matrix
...
A = reshape(A,matSize);  % Return A to original dimensions

Не уверен, поможет ли это вам конкретно в том, что вы хотите сделать, но я часто нахожу это полезным.

3 голосов
/ 17 марта 2009

Установка пороговых значений для каждого канала - не очень надежный способ определения цвета кожи. Простая таблица поиска работает намного лучше. Таблица поиска будет записывать значение для каждого цвета, насколько вероятно, что это скин. Существуют различные наборы данных цвета кожи, которые можно использовать для получения таких значений. Затем вы можете сравнить цвет пикселя со значением в таблице и принять решение на основе порогового значения.

...