我有一个图像数据集,我想根据内容将我的图像分组到不同的组中。我到目前为止所尝试的是找到图像的中值,并考虑根据中值将它们分组到不同的簇中,我该怎么做?这是我到现在为止所尝试过的。如何将我的图像聚类成组?我在谷歌上做了很多关于聚类的事情,但它显示了基于颜色的聚类结果而不是将图像聚类成组。任何人都可以向我提供信息性答案吗?我可以根据中位数或其他技术自动将我的数据集聚类成组吗? / p>
from PIL import Image
import numpy as np
import os
Median=[]
k=[]
def get_imlist(path):
return [os.path.join(path,f) for f in os.listdir(path) if f.endswith('.jpg')]
path='D:/Images/dataset'
imlist= get_imlist(path)
for file in imlist:
head,tail=os.path.split(file)
im=np.array(Image.open(file).convert('L'))
m=np.median(im)
M=[m,tail]
print '.'
Median.append(M)
Results=sorted(Median, key=lambda median: median[0])
print Results
答案 0 :(得分:0)
k-means是一种常见的聚类方法,位于OpenCV http://docs.opencv.org/modules/core/doc/clustering.html中。
在聚类之前,建议您使用尺寸小于完整n * m像素组的表示。这有两个主要原因,即对噪声的鲁棒性,以及聚类过程的计算成本的降低。表示的选择可能对集群的感知质量至关重要,并且在很大程度上取决于您的应用。我目前最喜欢的是GIST描述符(c ++:http://lear.inrialpes.fr/software,matlab:http://people.csail.mit.edu/torralba/code/spatialenvelope/)。然而,这不是在OpenCV中。所以在这里我将使用灰度级直方图,从而将尺寸从m * n减小到b = no。的箱子。
假设灰度级输入图像的矢量名为frames。
//set up histogram
int histSize = 128;
float range[] = { 0, histSize } ;
const float* histRange = { range };
bool uniform = true; bool accumulate = false;
Mat_<float> dataHists;
cv::Mat grayImg;
Mat hist_i;
for(int i=0; i <frames.size(); i++)
{
grayImg =frames[i];
//histogram gray image
calcHist( &grayImg, 1, 0, Mat(), hist_i, 1, &histSize, &histRange, uniform, accumulate );
normalize(hist_i, hist_i, 0, hist_i.rows, NORM_MINMAX, -1, Mat() );
//transpose for feature vector
hist_i = hist_i.t();
//add to feature vectors for k-means
dataHists.push_back(cv::Mat(hist_i));
}
//k-means
int k = 100;
cv::Mat bestLabels;
cv::kmeans(dataHists,k,bestLabels,TermCriteria(),3,KMEANS_PP_CENTERS);
//have a look
vector<cv::Mat> clusterViz(bestLabels.rows);
for(int i=0;i<bestLabels.rows; i++)
{
clusterViz[bestLabels.at<int>(i)].push_back(cv::Mat(frames[bestLabels.at<int>(i)]));
}
namedWindow("clusters", WINDOW_NORMAL );
for(int i=0;i<clusterViz.size(); i++)
{
cv::imshow("clusters",clusterViz[i]);
cv::waitKey();
}
希望这会对你有所帮助。