代码之家  ›  专栏  ›  技术社区  ›  Ryan

检查图像主要是黑白还是彩色

  •  0
  • Ryan  · 技术社区  · 6 年前

    enter image description here 我试着分类一幅图像是否主要包含黑白或彩色,准确地说,它是一张影印照片(想想施乐),其中大部分是黑白的。这幅图像不是单通道图像,而是三通道图像。

    我只想知道是否有任何明显的方法来解决这个我错过的问题。

    目前,我试图绘制直方图,可能会做像素计数,但这看起来不是很有希望,任何建议,这将是真正有帮助的。

    提前谢谢。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Anthony Letizia    6 年前

    我不确定确切的用例,但是在经历过类似的问题之后,我使用了这篇相当有用的文章。

    https://www.alanzucconi.com/2015/05/24/how-to-find-the-main-colours-in-an-image/

    包含完整代码的github可以在这里找到: https://gist.github.com/jayapal/077f63f3163abbfb3c50c7d209524cc6

    如果这是为了你自己的视觉直方图应该是足够的,但如果你试图自动化,它可能有助于舍入颜色值向上或向下,这将提供信息,如果图像是黑暗或轻于某个值。

    从更大的角度看,您将此代码用于什么?也许这会有助于提供更充分的信息

    编辑:上面的代码还提供了定义图像区域的能力,希望这将使您的选择更加准确

    直接添加代码

    from sklearn.cluster import KMeans
    from sklearn import metrics
    import cv2
    import numpy as np
    import cv2
    image = cv2.imread("red.png")
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    
    # Resize it
    h, w, _ = image.shape
    w_new = int(100 * w / max(w, h) )
    h_new = int(100 * h / max(w, h) )
    
    image = cv2.resize(image, (w_new, h_new));
    
    
    # Reshape the image to be a list of pixels
    image_array = image.reshape((image.shape[0] * image.shape[1], 3))
    print image_array
    # Clusters the pixels
    clt = KMeans(n_clusters = 3)
    clt.fit(image_array)
    
    def centroid_histogram(clt):
        # grab the number of different clusters and create a histogram
        # based on the number of pixels assigned to each cluster
        numLabels = np.arange(0, len(np.unique(clt.labels_)) + 1)
        (hist, _) = np.histogram(clt.labels_, bins = numLabels)
    
        # normalize the histogram, such that it sums to one
        hist = hist.astype("float")
        hist /= hist.sum()
    
        # return the histogram
        return hist
    
    
    # Finds how many pixels are in each cluster
    hist = centroid_histogram(clt)
    
    # Sort the clusters according to how many pixel they have
    zipped = zip (hist, clt.cluster_centers_)
    zipped.sort(reverse=True, key=lambda x : x[0])
    hist, clt.cluster_centers = zip(*zipped)
    
    # By Adrian Rosebrock
    import numpy as np
    import cv2
    
    
    
    bestSilhouette = -1
    bestClusters = 0;
    
    for clusters in range(2, 10):
        # Cluster colours
        clt = KMeans(n_clusters = clusters)
        clt.fit(image_array)
    
        # Validate clustering result
        silhouette = metrics.silhouette_score(image_array, clt.labels_, 
        metric='euclidean')
    
        # Find the best one
        if silhouette > bestSilhouette:
            bestSilhouette = silhouette;
            bestClusters = clusters;
    
    print bestSilhouette
    print bestClusters