Проверьте каждый пиксель на наличие определенного цвета (в пределах определенного порога).

StackOverflow https://stackoverflow.com/questions/650472

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

Эд,

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

>> 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 и тому подобного.Я бы создал функцию


функция out = isFlesh(входит)

%% поместите здесь код проверки плоти


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

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

-Дуг

Другие советы

Следует иметь в виду, что изображения RGB представляют собой трехмерные матрицы. Первая & Quot; страница & Quot; (т.е. 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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top