#matlab #computer-vision
#matlab #компьютерное зрение
Вопрос:
У меня есть объект, который выглядит следующим образом:
На этом изображении я хотел бы иметь возможность сказать, идя сверху вниз, я хотел бы иметь возможность выводить «фиолетовый, красный, purple, red, purple, red, purple».
Теперь, вот общие симптомы, с которыми я сталкиваюсь (поскольку приведенное выше изображение является всего лишь примером):
- Главный объект не всегда ориентирован по четкой оси. Это может быть вертикальное, горизонтальное изображение, где угодно посередине.
- Фиолетовый цвет всегда будет основным фоном
- Красным будет наложение
- Наложение не будет таким четким, как полосы резисторов на резисторе. Это будет более шумным, как в этом примере.
Единственный подход, который я могу придумать, — это провести линию через хромосому и определить, какой цвет получается в этой линии, вроде как сканер штрих-кода. Однако я хотел бы сделать это совершенно неконтролируемым образом.
Как мне это сделать? Я пытаюсь сделать это в 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, а затем поворот изображения в противоположном направлении. Затем вы можете просто спуститься прямо вниз!