Matlab: обнаружение чередующихся цветов в объектах правильной формы

#matlab #computer-vision

#matlab #компьютерное зрение

Вопрос:

У меня есть объект, который выглядит следующим образом:

введите описание изображения здесь

На этом изображении я хотел бы иметь возможность сказать, идя сверху вниз, я хотел бы иметь возможность выводить «фиолетовый, красный, purple, red, purple, red, purple».

Теперь, вот общие симптомы, с которыми я сталкиваюсь (поскольку приведенное выше изображение является всего лишь примером):

  1. Главный объект не всегда ориентирован по четкой оси. Это может быть вертикальное, горизонтальное изображение, где угодно посередине.
  2. Фиолетовый цвет всегда будет основным фоном
  3. Красным будет наложение
  4. Наложение не будет таким четким, как полосы резисторов на резисторе. Это будет более шумным, как в этом примере.

Единственный подход, который я могу придумать, — это провести линию через хромосому и определить, какой цвет получается в этой линии, вроде как сканер штрих-кода. Однако я хотел бы сделать это совершенно неконтролируемым образом.

Как мне это сделать? Я пытаюсь сделать это в Matlab.

Вот мой текущий код, чтобы попытаться сделать это, используя PCA в качестве одного из предложенных ответов:

 rgbImage = label2rgb(temp);
[rows, columns, numberOfColorBands] = size(rgbImage);

redChannel = rgbImage(:, :, 1);
greenChannel = rgbImage(:, :, 2);
blueChannel = rgbImage(:, :, 3);
listOfRGBValues = double(reshape(rgbImage, rows * columns, 3));
coeff = pca(listOfRGBValues);
transformedImagePixelList = listOfRGBValues * coeff;
pca1Image = reshape(transformedImagePixelList(:,1), rows, columns);
pca2Image = reshape(transformedImagePixelList(:,2), rows, columns);
pca3Image = reshape(transformedImagePixelList(:,3), rows, columns);
  

Однако этот код, вдохновленный этим файлом, не позволяет мне «пройти по длине главной оси», чтобы прочитать цвета.

Ответ №1:

Интересный вопрос. Сначала вы можете использовать PCA для нахождения главной оси большого двоичного объекта. Затем вы можете пройтись по главной оси и измерить изменение цвета. Я бы предложил использовать цветовое пространство типа HSV или HSL вместо RGB, потому что эти пространства вносят изменения в яркость, но не в цвет в другом измерении, тогда как RGB объединяет яркость и цвет. Тогда вы получите график, подобный этому:

 red:                      x xx          xx xx
between red and purple:    x    xx   x    x
purple:                           xxx xx
  

Медианная фильтрация может помочь устранить отклонения в пределах красных или фиолетовых сегментов при сохранении областей перехода. Затем вы можете выполнить кластеризацию K-средних, чтобы найти 2 значения для красного и фиолетового. Тем не менее, я бы отбросил выбросы перед кластеризацией; вам также может потребоваться более 2 кластеров.

Комментарии:

1. Я сделал то, что вы сказали, но я не могу пройти по длине главной оси.

2. Ах, это, вероятно, фрагмент кода, для кодирования и отладки которого потребуется некоторое время. Другой альтернативой является нахождение главной оси и вычисление ее угла относительно оси y, а затем поворот изображения в противоположном направлении. Затем вы можете просто спуститься прямо вниз!