[英]Count the number of objects of different colors in an image in Python
Here is a figure from which I want to count the number of objects from each color . 这是一张我要从中计算每种颜色的对象数的 图表 。 What is a simple way of doing this, without using opencv perhaps?
什么是不使用opencv的简单方法?
[Edit 2]: The approach I have tried is the following: (1) Colored objects count [编辑2]:我尝试过的方法如下:(1)有色物体计数
from PIL import Image
im = Image.open('./colored-polka-dots.png').getcolors()
im.sort(key=lambda k: (k[0]), reverse=True)
print('Top 5 colors: {}'.format((im[:5])))
# View non-background colors
color_values = []
for color in im[1:5]:
color_values.append(color[1])
arr = np.asarray(color[1]).reshape(1,1,4).astype(np.uint8)
plt.imshow(arr)
plt.show() # get top 4 frequent colors as green,blue,pink,ornage
# Create a dict of color names and their corressponding rgba values
color_dict = {}
for color_name,color_val in zip(['green','blue','pink','orange'],color_values):
color_dict[color_name] = color_val
# Make use of ndimage.measurement.labels from scipy
# to get the number of distinct connected features that satisfy a given threshold
for color_name,color_val in color_dict.items():
b = ((img[:,:,0] ==color_val[0]) * (img[:,:,1] ==color_val[1]) * (img[:,:,2] ==color_val[2]))*1
labeled_array, num_features = scipy.ndimage.measurements.label(b.astype('Int8'))
print('Color:{} Count:{}'.format(color_name,num_features))
> Output:
>输出:
orange: 288
green: 288
pink: 288
blue: 288
Although this achieves the purpose, I want to know if there is a more efficient and elegant way of solving this problem. 尽管这达到了目的,但我想知道是否有更有效,更优雅的方法来解决此问题。
Here's a simpler solution based on scikit-image
: 这是一个基于
scikit-image
的简单解决方案:
Code : 代码 :
import numpy as np
from skimage import io, morphology, measure
from sklearn.cluster import KMeans
img = io.imread('https://i.stack.imgur.com/du0XZ.png')
rows, cols, bands = img.shape
X = img.reshape(rows*cols, bands)
kmeans = KMeans(n_clusters=5, random_state=0).fit(X)
labels = kmeans.labels_.reshape(rows, cols)
for i in np.unique(labels):
blobs = np.int_(morphology.binary_opening(labels == i))
color = np.around(kmeans.cluster_centers_[i])
count = len(np.unique(measure.label(blobs))) - 1
print('Color: {} >> Objects: {}'.format(color, count))
Output : 输出 :
Color: [ 254. 253. 253. 255.] >> Objects: 1
Color: [ 255. 144. 36. 255.] >> Objects: 288
Color: [ 39. 215. 239. 255.] >> Objects: 288
Color: [ 255. 38. 135. 255.] >> Objects: 288
Color: [ 192. 231. 80. 255.] >> Objects: 288
Remarks : 备注 :
I've clustered colors through KMeans
to make the program robust to slight variations in pixel colors. 我已经通过
KMeans
对颜色进行了KMeans
以使该程序健壮到像素颜色略有变化。
The RGB coordinates of the cluster centers have been rounded through around
just for visualization purposes. 聚类中心的RGB坐标已四舍五入
around
仅用于可视化目的。
I've also performed an opening operation through binary_opening
in order to get rid of isolated pixels. 我还通过
binary_opening
执行了打开操作,以摆脱孤立的像素。
It is necessary to subtract 1
from the number of labels yielded by label
to take into account only those connected regions with the considered color label. 必须将标签产生的
label
数量减去1
,以仅考虑那些带有考虑颜色标签的连接区域。
The first line of the output obviously corresponds to the white background. 输出的第一行显然对应于白色背景。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.