我有一个类似于以下内容的对象:
在此图像中,我想说的是,从上到下,我希望能够输出“紫色,红色,紫色,红色,紫色,红色,紫色”。
现在,这是我引起的一般症状(如上图所示):
我能想到的唯一方法是在染色体上划一条线,然后拾取那条线发出的颜色,就像条形码扫描仪一样。但是,我想以一种完全不受监督的方式进行操作。
我该怎么做?我正在尝试在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);
但是,此代码受this file的启发,不允许我“沿主轴长度移动”以读取颜色。
答案 0 :(得分:1)
有趣的问题。首先,您可以使用PCA查找斑点的主轴。然后,您可以沿主轴移动并测量颜色的变化。我建议使用诸如HSV或HSL之类的颜色空间而不是RGB,因为这些空间会改变亮度,但不会改变其他维度的颜色,而RGB会使亮度和颜色变幻。然后,您将获得如下图:
red: x xx xx xx
between red and purple: x xx x x
purple: xxx xx
中值过滤可以帮助保留红色或紫色段中的离群值,同时保留过渡区域。然后,您可以进行K均值聚类,找到红色和紫色的2个值。但是,在聚类之前,我会抛弃异常值。您可能还需要两个以上的群集。