2017-04-02 75 views
0

比方说,我有一个球的形象像this one如何将图片分为颜色组?

ball

我想球的颜色分离的颜色组。在这种情况下,我应该有2个主要颜色组 - “棕色”和“白色”。 “棕色”组将具有所有棕色像素,“白色”组将具有全部白色像素。 我正在使用matlab来完成这项任务。我想要做的方式是:

  1. 看看RGB通道。我用scatter来看看我是否可以清楚地看到一些组,但是我没有。
  2. 来看看拜尔价值。但是也看不到任何群体。
  3. 运行边缘检测器。然后,在每个封闭的区域,我会找到像素的平均值。将具有相似平均值(在特定阈值内)的区域将属于同一组。它似乎有点工作,但在许多情况下,它没有
  4. 任何其他的想法?
+0

有许多基于颜色的图像分割方法,你可以使用kmeans [示例](https://www.mathworks.c OM /帮助/图像/示例/色基分割-使用-k均值-clustering.html)。搜索谷歌更多。 – user2999345

+0

要多少组要分开您的照片?总是2? –

+0

查看相关的QA:[RGB值基本颜色名称](http://stackoverflow.com/a/37476754/2521214),以便轻松入侵,但基本上您想要执行基于颜色的分割。它与洪水填充类似,但当基于2个阈值(绝对和相对)的任何一种颜色离开始点颜色或其邻居太远时停止。由于您需要投资回报率,因此您可以直接填写/标注原始图片。 – Spektre

回答

0

这个任务被称为分段,在你的情况下,每种颜色都是一个段,段并不总是连续的。

搜索Matlab的分割示例应该会产生很多代码示例和定理。

请注意,有一件事情,没有地面真相的解决方案,你不能说每个图像有多少段,因为这是主观问题。在一般情况下,您可以对颜色值运行聚类算法,这会将图像分解为颜色分段,还有一些算法会自动查找分组的数量 - 这对于图像中颜色组的数量是一个很好的开端。

快速搜索得到这些作品,它们可以让你开始的想法:

Image segmentation with matlab

Using EM for image segmentation

0

虽然图像分割将是正确的方式来对待分色,如果你的形象是简单,你可以尝试去做它的蛮力。

在这里,转换为HSV将更容易处理图像。

对于图像的白色部分:

I=imread('ball.jpg'); 
H=rgb2hsv(I); 
% separate dimensions 
h=H(:,:,1); 
s=H(:,:,2); 
v=H(:,:,3); 

% color conditions 
v(v<0.8 | s>0.7 | h>0.7)=NaN; 
h(isnan(v))=NaN; 
s(isnan(v))=NaN; 

% convert image back 
W=cat(3,h,s,v); 
White_image=hsv2rgb(W); 
figure; imagesc(White_image); 

enter image description here

而对于棕色部分:

% separate dimensions 
h=H(:,:,1); 
s=H(:,:,2); 
v=H(:,:,3); 

% color conditions 
v(s<0.6 | v>0.8)=NaN; 
h(isnan(v))=NaN; 
s(isnan(v))=NaN; 

% convert image back 
B=cat(3,h,s,v); 
Brown_image=hsv2rgb(B); 
figure; imagesc(Brown_image); axis off 

enter image description here