【问题标题】:Finding the area and colours of an object in an image查找图像中对象的区域和颜色
【发布时间】:2017-08-13 19:42:35
【问题描述】:

我有一张像这样的图片:

我想弄清楚几件事:

  1. 纹身的主要颜色是什么?
  2. 皮肤的主要颜色是什么?
  3. 纹身的面积(以像素为单位)是多少?具体来说就是上面的纹身?

我是图像处理的新手,但我的攻击计划是这样的:

  1. 运行边缘检测
  2. 填充轮廓
  3. 获取该图像的 Alpha 以获得纹身的 Alpha
  4. width * height * % of white in alpha = area of tattoo ink
  5. 将 alpha 应用于原始图像并获取颜色分布,以某种方式给出“这个纹身里面有黑色和红色”这样的答案
  6. 反转 Alpha 并将其应用于原始图像,以获取肤色并找到平均色调

这似乎是获得最终结果的明智方法吗?作为新手,我可能不知道有什么更简单/更可靠的东西吗?

我使用skimage 对其运行了一些边缘分析代码,得到了这样的轮廓:

但我无法从这里用颜色填充轮廓以创建 Alpha。问题是我只想知道墨水的区域,而不是整个纹身的区域,所以这似乎更难填充轮廓

【问题讨论】:

    标签: opencv image-processing scikit-image


    【解决方案1】:

    我建议使用以下方法,而不是使用边缘检测和轮廓-

    1) 将图像从 RGB 转换为灰度。

    2) 使用自适应阈值将其转换为二进制图像(我在查看您上传的图像后建议这样做)。

    3) 现在只需计算像素数,就可以得到纹身和皮肤的面积。

    4) 要计算主要颜色(我在这里只看到两种),您可以只计算二进制图像中与纹身和皮肤对应的所有像素的平均值,也可以计算颜色直方图。

    【讨论】:

    • 强烈 +1 这种方法。但是,对于步骤 (3),我建议在标签/二值化/阈值图像上使用 skimage.measure.regionprops(即在步骤 (2) 的输出上)。
    【解决方案2】:

    另一种方法是通过 k-means 聚类执行颜色量化。提供的示例中显示的纹身只有一种颜色,因此量化后的图像应该有两种颜色,即墨水和皮肤。

    import numpy as np
    from skimage import io
    from sklearn.cluster import KMeans
    
    img = io.imread('https://i.stack.imgur.com/Upcb0.png')
    n_colors = 2
    
    X = img.reshape((-1, 3))
    kmeans = KMeans(n_clusters=n_colors, random_state=0).fit(X)
    labels = kmeans.labels_
    centers = kmeans.cluster_centers_
    quantized = centers[labels].reshape(img.shape).astype('uint8')
    
    io.imshow(quantized)
    

    主要颜色的 RGB 坐标是:

    In [69]: centers
    Out[69]: 
    array([[ 226.44193236,  193.24337359,  175.1311746 ],
           [  40.0549615 ,   36.64523871,   40.75754915]])
    

    假设墨水比皮肤深(即墨水颜色的欧几里得范数小于皮肤的颜色),纹身覆盖的图像像素比例可以这样计算:

    In [70]: darkest = np.argmin(np.sqrt(np.sum(centers**2, axis=1)))
    
    In [71]: np.true_divide(np.sum(labels == darkest), labels.size)
    Out[71]: 0.24738437499999999
    

    【讨论】:

      猜你喜欢
      • 2017-04-25
      • 2021-05-03
      • 1970-01-01
      • 2020-08-01
      • 2012-02-22
      • 2013-10-07
      • 1970-01-01
      • 2011-12-16
      • 1970-01-01
      相关资源
      最近更新 更多