opencv实现canopy算法

#include "stdafx.h"
using namespace cv;

int main(int argc, char** argv)
{
    Mat img=imread("d:/pic/lena.jpg");
    imshow("src",img);
    CV_Assert(!img.empty());
    vector<Mat> planes;
    split(img,planes);
    int total=img.total();
    Mat p(total,3,CV_32F,Scalar::all(0));
    int i;
    for(i=0;i<total;i++)
    {
        p.at<float>(i,0)=planes[0].data[i];
        p.at<float>(i,1)=planes[1].data[i];
        p.at<float>(i,2)=planes[2].data[i];
    }
    RNG rng(12345);
    int num=0;  //canopy个数
    double t1=200.0,t2=100.0; //两个距离阈值
    vector<Mat> canopy(total); //canopy矩阵组
    while(!p.empty())
    {

        int r=p.rows;  //余下的数据的行数
        Mat temp;
        int k=rng.uniform(0,r);  //在余下的数据中随机抽选一个作为canopy中心
        cout<<"The rest of number of rows:  "<<r<<",    random:"<<k<<endl;
        for(i=0;i<r;i++)
        {
            double d=norm(p.row(k),p.row(i));  //计算选出点和其它点的距离
            if(d<=t1)
                canopy[num].push_back(p.row(i));  //将距离小于t1的所有点放入到一个新的canopy中
            if(d>t2)
                temp.push_back(p.row(i));     //更新数据
        }
        temp.copyTo(p);
        num++;
    }
    cout<<"the total number of canopy:"<<num<<endl; //最终类别数
    for(i=0;i<num;i++)
        cout<<"the number of "<<i+1<<"  class: "<<canopy[i].total()<<endl;
    waitKey(0);
    return 0;
}
时间: 2024-08-06 05:10:36

opencv实现canopy算法的相关文章

Canopy算法计算聚类的簇数

Kmeans算是是聚类中的经典算法.步骤例如以下: 选择K个点作为初始质心 repeat 将每一个点指派到近期的质心,形成K个簇 又一次计算每一个簇的质心 until 簇不发生变化或达到最大迭代次数 算法中的K须要人为的指定.确定K的做法有非常多,比方多次进行试探.计算误差.得出最好的K.这样须要比較长的时间.我们能够依据Canopy算法来粗略确定K值(能够觉得相等).看一下Canopy算法的过程: (1)设样本集合为S.确定两个阈值t1和t2,且t1>t2. (2)任取一个样本点p.作为一个C

OpenCV使用Harris算法实现角点检测

纯粹阅读,请移步OpenCV使用Harris算法实现角点检测 效果图 源码 KqwOpenCVFeaturesDemo 角点是两条边缘的交点或者在局部邻域中有多个显著边缘方向的点.Harris角点检测是一种在角点检测中最常见的技术. Harris角点检测器在图像上使用滑动窗口计算亮度的变化. 封装 这里用到了RxJava.主要是因为图片处理是耗时操作,会阻塞线程,为了防止界面卡顿,这里使用RxJava进行了线程切换. /** * Harris角点检测 * * @param bitmap 要检测的

java 在centos6.5+eclipse环境下调用opencv实现sift算法

java 在centos6.5+eclipse环境下调用opencv实现sift算法,代码如下: import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfKeyPoint; import org.opencv.highgui.Highgui; import org.opencv.features2d.*; public class ExtractSIFT{ public static

mahout之canopy算法简单理解

canopy是聚类算法的一种实现 它是一种快速,简单,但是不太准确的聚类算法 canopy通过两个人为确定的阈值t1,t2来对数据进行计算,可以达到将一堆混乱的数据分类成有一定规则的n个数据堆 由于canopy算法本身的目的只是将混乱的数据划分成大概的几个类别,所以它是不太准确的 但是通过canopy计算出来的n个类别可以用在kmeans算法中的k值的确定(因为人为无法准确的确定k值到底要多少才合适,而有kmeans算法本身随机产生的话结果可能不是很精确.有关kmeans算法的解释请看点击打开链

用OpenCV实现Photoshop算法(三): 曲线调整

http://blog.csdn.net/c80486/article/details/52499919 系列文章: 用OpenCV实现Photoshop算法(一): 图像旋转 用OpenCV实现Photoshop算法(二): 图像剪切 用OpenCV实现Photoshop算法(三): 曲线调整 用OpenCV实现Photoshop算法(四): 色阶调整 用OpenCV实现Photoshop算法(五): 亮度对比度调整 用OpenCV实现Photoshop算法(六): 变为黑白图像 用OpenC

OPENCV下SIFT算法使用方法笔记

这几天继续在看Lowe大神的SIFT神作,看的眼花手脚抽筋.也是醉了!!!!实在看不下去,来点干货.我们知道opencv下自带SIFT特征检测以及MATCH匹配的库,这些库完全可以让我们进行傻瓜似的操作.但实际用起来的时候还不是那么简单.下文将对一个典型的基于OPENCV的SIFT特征点提取以及匹配的例程进行分析,并由此分析详细的对OPENCV中SIFT算法的使用进行一个介绍. OPENCV下SIFT特征点提取与匹配的大致流程如下: 读取图片->特征点检测(位置,角度,层)->特征点描述的提取

用OpenCV实现Otsu算法

一.Otsu算法原理 Otsu算法(大津法或最大类间方差法)使用的是聚类的思想,把图像的灰度数按灰度级分成2个部分,使得两个部分之间的灰度值差异最大,每个部分之间的灰度差异最小,通过方差的计算来寻找一个合适的灰度级别来划分. 所以可以在二值化的时候采用otsu算法来自动选取阈值进行二值化.otsu算法被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响.因此,使类间方差最大的分割意味着错分概率最小. 设t为设定的阈值. w0 分开后前景像素点数占图像的比例 u0 分开后前景

用OpenCV实现Photoshop算法(一): 图像旋转

最近学习了OpenCV,于是想用它实现Photoshop的主要功能,用于照片处理. 对于一张照片,PS的一般处理步骤包括: 1, 旋转图片,校正位置. 2,剪切,调整大小,重新构图. 3,调整色阶.曲线,使图片曝光正确.对比适中. 4,调整对比度.饱和度 5,印章去掉不想要的东西,液化调整形体线条 6,对于人像图片,美肤.美白 7, 用色彩平衡.可选颜色等调整色调,形成照片调性 8,加一些光效 9,锐化 以后的一系列博文将采用OpenCV逐一实现Photoshop的算法和功能, 并用计算机视觉人

opencl+opencv实现sobel算法

这几天在看opencl编程指南.照着书中的样例实现了sobel算法: 1.结合opencv读取图像,保存到缓冲区中. 2.编写和编译内核.并保存显示处理后的结果. 内核: const sampler_t sampler = CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST; kernel void sobel_rgb(read_only image2d_t src,write_only image2d_t dst) { int x = (int)get