python-2.7 - 如何使用 python 或 OpenCV 根据局部特征或全局自动将我的数据集图像聚类到不同的组中?

标签 python-2.7 opencv cluster-analysis median

我有一个图像数据集,我想根据内容将我的图像分组到不同的组中。到目前为止,我一直在尝试找到图像的中值,并考虑根据中值将它们分组到不同的集群中,我该怎么做?这是我到目前为止所尝试的。我怎样才能将我的图像聚类成组?我在谷歌上做了很多关于聚类的事情,但它显示的是基于颜色的聚类结果,而不是将图像聚类成组。任何人都可以为我提供信息丰富的答案吗?我可以根据中值或其他技术自动将我的数据集聚类成组吗?

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

最佳答案

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。垃圾箱。

假设一个名为帧的灰度输入图像向量。

    //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();
}

希望对你有帮助。

关于python-2.7 - 如何使用 python 或 OpenCV 根据局部特征或全局自动将我的数据集图像聚类到不同的组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24118700/

相关文章:

python - DBSCAN eps 和 min_samples

java - Weka 总是为不同的数据生成相同的集群

python - os.listdir 和 os.path.isdir 混淆,isdir 是随机的吗?

python - 我如何用 Python 编写这个等式?

Python 每小时计数日志文件

c++ - 使用ffmpeg构建opencv出错

c++ - cvFindContours 是如何工作的?

python - 使用 Python 2 运行的 Pylint 检查 Python 3 源代码

python - 使用opencv python为图像添加阴影以实现增强现实

cluster-analysis - 结合不同的相似性来构建一个最终的相似性