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

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

enter image description here

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

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

  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 Ответ

0 голосов
/ 05 марта 2019

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

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

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

...