<p>您可以使用<a href="https://en.wikipedia.org/wiki/Cluster_analysis" rel="nofollow noreferrer">K-Means Clustering</a>来确定带有<a href="https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html" rel="nofollow noreferrer">^{<cd1>}</a>的图像中的主色调。我不确定是否有办法确定原色的“K”数,因为这通常是用户定义的值。此方法提供主色调和百分比分布</p>
<hr/>
<p><strong>输入图像</strong></p>
<p><a href="https://i.stack.imgur.com/vy5c7.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/vy5c7.png" alt="enter image description here"/></a></p>
<p><strong>结果</strong></p>
<p>对于<code>n_clusters=4</code>,以下是最主要的颜色和百分比分布</p>
<pre><code>[ 28.59165576 114.71245821 197.21921791] 4.30%
[ 25.54783639 197.94045711 147.22737091] 17.94%
[197.75739373 25.78053504 143.31173478] 19.04%
[254.75762607 254.77925368 254.85116121] 58.72%
</code></pre>
<p>每个颜色簇的可视化(白色不可见)</p>
<p><a href="https://i.stack.imgur.com/M2IBn.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/M2IBn.png" alt="enter image description here"/></a></p>
<pre><code>import cv2, numpy as np
from sklearn.cluster import KMeans
def visualize_colors(cluster, centroids):
# Get the number of different clusters, create histogram, and normalize
labels = np.arange(0, len(np.unique(cluster.labels_)) + 1)
(hist, _) = np.histogram(cluster.labels_, bins = labels)
hist = hist.astype("float")
hist /= hist.sum()
# Create frequency rect and iterate through each cluster's color and percentage
rect = np.zeros((50, 300, 3), dtype=np.uint8)
colors = sorted([(percent, color) for (percent, color) in zip(hist, centroids)])
start = 0
for (percent, color) in colors:
print(color, "{:0.2f}%".format(percent * 100))
end = start + (percent * 300)
cv2.rectangle(rect, (int(start), 0), (int(end), 50), \
color.astype("uint8").tolist(), -1)
start = end
return rect
# Load image and convert to a list of pixels
image = cv2.imread('1.png')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
reshape = image.reshape((image.shape[0] * image.shape[1], 3))
# Find and display most dominant colors
cluster = KMeans(n_clusters=4).fit(reshape)
visualize = visualize_colors(cluster, cluster.cluster_centers_)
visualize = cv2.cvtColor(visualize, cv2.COLOR_RGB2BGR)
cv2.imshow('visualize', visualize)
cv2.waitKey()
</code></pre>