gpt4 book ai didi

python - K-means 颜色聚类 - 使用屏蔽 numpy 数组省略背景像素

转载 作者:太空宇宙 更新时间:2023-11-03 15:43:45 25 4
gpt4 key购买 nike

我正在尝试使用 K 均值聚类找到多个图像的 3 个主色。我面临的问题是 K 均值也会对图像的背景进行聚类。我正在使用 Python 2.7 和 OpenCV 3

所有图像均具有以下 RGB 颜色的相同灰色背景:150,150,150。为了避免 K 均值也会对背景颜色进行聚类,我创建了一个屏蔽数组,该数组屏蔽了原始图像数组中的所有“150”像素值,理论上只留下数组中的非背景像素供 K 均值使用。但是,当我运行脚本时,它仍然返回灰色作为主要颜色之一。

我的问题:屏蔽数组是可行的方法(我做错了什么吗)还是有更好的替代方法以某种方式从 K 均值聚类中排除像素?

请在下面找到我的代码:

from sklearn.cluster import KMeans
from sklearn import metrics
import cv2
import numpy as np

def centroid_histogram(clt):
numLabels = np.arange(0, len(np.unique(clt.labels_)) + 1)
(hist, _) = np.histogram(clt.labels_, bins=numLabels)
hist = hist.astype("float")
hist /= hist.sum()
return hist

image = cv2.imread("test1.jpg")
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

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))

image_array = image.reshape((image.shape[0] * image.shape[1], 3))
image_array = np.ma.masked_values(image_array,150)

clt = KMeans(n_clusters=3)
clt.fit(image_array)

hist = centroid_histogram(clt)
zipped = zip(hist, clt.cluster_centers_)
zipped.sort(reverse=True, key=lambda x: x[0])

hist, clt.cluster_centers = zip(*zipped)
print(clt.cluster_centers_)

最佳答案

如果您想提取背景以外的像素值,可以使用 numpy 索引:

img2=image_array[image_array!=[150,150,150]]
img2=img2.reshape((len(img2)/3,3))

这将产生不 [150,150,150] 的像素列表。
但是,它不会保留图像的结构,只是为您提供像素值列表。我不太记得了,但也许对于 K-means 你需要给出整个图像,即你还需要向它提供像素的位置?但在这种情况下,任何掩蔽都无济于事,因为掩蔽只是用另一个像素替换某些像素的值,而不是一起删除像素。

关于python - K-means 颜色聚类 - 使用屏蔽 numpy 数组省略背景像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41938033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com