【问题标题】:How to separate a picture to color groups?如何将图片分成颜色组?
【发布时间】:2017-04-02 18:32:46
【问题描述】:

假设我有一个像this one 这样的球图像:

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

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

【问题讨论】:

  • 基于颜色的图像分割方法有很多,example可以使用kmeans。谷歌搜索更多。
  • 你想把你的图片分成几组?总是 2?
  • 查看相关的 QA:RGB value base color name 以方便破解,但本质上您想做基于颜色的分割。它类似于洪水填充,但是当任何一种颜色与起点颜色或基于 2 个阈值(绝对和相对)的相邻颜色距离太远时,您会停止。如果你想要 ROI,那么你可以直接填充/标记它,保留原始图像。

标签: algorithm matlab image-processing


【解决方案1】:

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

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

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

快速搜索产生了这些作品,它们可以让您开始构思:

Image segmentation with matlab

Using EM for image segmentation

【讨论】:

    【解决方案2】:

    虽然图像分割是处理颜色分离的正确方法,但如果您的图像很简单,您可以尝试蛮力进行。

    在这里,转换为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);
    

    对于棕色部分:

    % 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-17
      • 2020-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-28
      • 1970-01-01
      • 2021-01-07
      相关资源
      最近更新 更多