精华内容
下载资源
问答
  • K-means均值聚类算法寻找质心,Python

    千次阅读 2020-06-10 23:11:08
    import numpy as np ...# 为给定数据集构建一个包含K个随机质心的集合 def randCent(dataSet,k): m,n = dataSet.shape centroids = np.zeros((k,n)) for i in range(k): index = int(np.random..
    import numpy as np
    
    # 欧氏距离计算
    def distEclud(x,y):
        return np.sqrt(np.sum((x-y)**2))  # 计算欧氏距离
    
    # 为给定数据集构建一个包含K个随机质心的集合
    def randCent(dataSet,k):
        m,n = dataSet.shape
        centroids = np.zeros((k,n))
        for i in range(k):
            index = int(np.random.uniform(0,m)) 
            centroids[i,:] = dataSet[index,:]
        return centroids
     
    # k均值聚类
    def kmeans_open(dataSet,k):
        m = np.shape(dataSet)[0]  #行的数目
        # 第一列存样本属于哪一簇
        # 第二列存样本的到簇的中心点的误差
        clusterAssment = np.mat(np.zeros((m,2)))
        clusterChange = True
     
        # 第1步 初始化centroids
        centroids = randCent(dataSet,k)
        while clusterChange:
            clusterChange = False
     
            # 遍历所有的样本(行数)
            for i in range(m):
                minDist = 100000.0
                minIndex = -1
     
                # 遍历所有的质心
                #第2步 找出最近的质心
                for j in range(k):
                    # 计算该样本到质心的欧式距离
                    distance = distEclud(centroids[j,:],dataSet[i,:])
                    if distance < minDist:
                        minDist = distance
                        minIndex = j
                # 第 3 步:更新每一行样本所属的簇
                if clusterAssment[i,0] != minIndex:
                    clusterChange = True
                    clusterAssment[i,:] = minIndex,minDist**2
            #第 4 步:更新质心
            for j in range(k):
                pointsInCluster = dataSet[np.nonzero(clusterAssment[:,0].A == j)[0]]  # 获取簇类所有的点
                centroids[j,:] = np.mean(pointsInCluster,axis=0)   # 对矩阵的行求均值
     
        return clusterAssment.A[:,0], centroids

     

    展开全文
  • 1.测试图片如下 2.测试结果如下 3.代码如下 #include <opencv2/core/utility.hpp> #include "opencv2/imgproc.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui....int main(int argc,c

    1.测试图片如下

    2.测试结果如下

    3.代码如下

    #include <opencv2/core/utility.hpp>
    #include "opencv2/imgproc.hpp"
    #include "opencv2/imgcodecs.hpp"
    #include "opencv2/highgui.hpp"
    #include <stdio.h>
    using namespace std;
    using namespace cv;
    
    int main(int argc,char *argv[])
    {
        float maxValue=0;  //定义距离变换矩阵中的最大值
        Point Pt(0,0);
        Mat image=imread("d:/6.png");
        Mat imageGray;
        cvtColor(image,imageGray,COLOR_RGB2GRAY);
        imageGray=~imageGray;  //取反
        GaussianBlur(imageGray,imageGray,Size(5,5),2); //滤波
        threshold(imageGray,imageGray,20,200,cv::THRESH_BINARY); //阈值化
        Mat imageThin(imageGray.size(),CV_32FC1); //定义保存距离变换结果的Mat矩阵
        distanceTransform(imageGray,imageThin, cv::DIST_L2,3);  //距离变换
        Mat distShow;
        distShow = Mat::zeros(imageGray.size(),CV_8UC1);
        imageThin.convertTo(distShow,CV_8UC1);
        //寻找质心(最大值)
        double minVal, maxVal;
        int    minIdx[2] = {}, maxIdx[2] = {};	// minnimum Index, maximum Index
    
        minMaxIdx(imageThin, &minVal, &maxVal, minIdx, maxIdx);
    
        normalize(distShow,distShow,0,255,NORM_MINMAX); //为了显示清晰,做了0~255归一化
        circle(image,Point(maxIdx[1],maxIdx[0]),maxVal,Scalar(0,0,255),3); //显示最大圆
        circle(image,Point(maxIdx[1],maxIdx[0]),3,Scalar(0,255,0),3); //显示质心
        imshow("Source Image",image);
        imshow("Thin Image CV_32FC1",imageThin);
        imshow("Thin Image2 CV_8UC1",distShow);
        waitKey();
        return 0;
    }

    4.关于distanceTransform 的说明

    距离变换函数 cv2.distanceTransform()计算二值图像内任意点到最近背景点的距离。一般情况下,该函数计算的是图像内非零值像素点到最近的零值像素点的距离,即计算二值图像中所有像素点距离其最近的值为 0 的像素点的距离。当然,如果像素点本身的值为 0,则这个距离也为 0。
    距离变换函数 cv2.distanceTransform()的计算结果反映了各个像素与背景(值为 0 的像素点)的距离关系。通常情况下:
    如果前景对象的中心(质心)距离值为 0 的像素点距离较远,会得到一个较大的值。
    如果前景对象的边缘距离值为 0 的像素点较近,会得到一个较小的值。
    如果对上述计算结果进行阈值化,就可以得到图像内子图的中心、骨架等信息。距离变换函数 cv2.distanceTransform()可以用于计算对象的中心,还能细化轮廓、获取图像前景等,有多种功能。


    推荐一个课程(【网易云课堂】)


     

    展开全文
  • 使用OpenCV寻找平面图形的质心 https://blog.csdn.net/LuohenYJ/article/details/88599334
  • 对给定的一副图像含有 不同目标 确定每一个目标的质心 坐标 及其最远点中心距
  • 寻找连通域的质心

    2020-05-30 15:55:16
    5、对每个连通域,计算x坐标和,y坐标和,分别除以面积则为质心坐标 clear;clc;close all; I=imread('1.png');%读取原图像 figure(1);imshow(I);%显示原图像 I_gray=rgb2gray(I);%原图像变为灰度图像 level=...

    MATLAB
    1、灰度化
    2、二值化
    3、取反
    4、连通域标记
    连通域标记
    5、对每个连通域,计算x坐标和,y坐标和,分别除以面积则为质心坐标

    clear;clc;close all;
    I=imread('1.png');%读取原图像
    figure(1);imshow(I);%显示原图像
    
    I_gray=rgb2gray(I);%原图像变为灰度图像
    level=graythresh(I_gray);%计算图像I_gray的全局阈值,level为标准化灰度值,其范围为[0 1]
    [height,width]=size(I_gray);%计算灰度图像的长宽
    I_bw=im2bw(I_gray,level);%im2bw使用阈值level将灰度图像转换为二值图像.
    figure(2);imshow(I_bw);%显示二值图像(背景为白色)
    
    for i=1:height %%循环中进行反色
        for j=1:width   
            if I_bw(i,j)==1      
                I_bw(i,j)=0;  
            else I_bw(i,j)=1; 
            end
        end
    end
    figure(3);imshow(I_bw);%显示取反后的二值图像(背景为黑色)
    
    [L,num]=bwlabel(I_bw,8);%bwlabel标注二值图像I_bw中的目标物体,返回标识矩阵L和I_bw中目标物体的数量num,8表示连通数.
    plot_x=zeros(1,num);%%zeros(m,n)产生m×n的全0矩阵.用于记录质心位置的横坐标
    plot_y=zeros(1,num);%zeros(m,n)产生m×n的全0矩阵.用于记录质心位置的纵坐标
    
    for k=1:num  %%num个区域依次统计质心位置    
        sum_x=0;    sum_y=0;    area=0; %初始化
        for i=1:height   
            for j=1:width 
                if L(i,j)==k     
                    sum_x=sum_x+i;  %计算第K区域的横坐标总和
                    sum_y=sum_y+j;  %计算第K区域的纵坐标总和 
                    area=area+1;    %计算第K区域的由多少个坐标点表示
                end
            end
        end
        plot_x(k)=fix(sum_x/area);  %计算第K区域的质心横坐标
        plot_y(k)=fix(sum_y/area);%计算第K区域的质心纵坐标
    end
    
    figure(4);imshow(I_bw);%显示取反后的二值图像(背景为黑色),并在图上标注质心点位置
    for i=1:num
        hold  on
        plot(plot_y(i) ,plot_x(i), '*')
    end
    
    

    在这里插入图片描述
    C++
    1、灰度化
    2、高斯滤波
    3、canny算子边缘检测
    4、寻找轮廓
    5、寻找轮廓的矩,计算质心
    5、画出轮廓,画出外接矩形以及质心

    
    #include <iostream>
    #include <opencv2/core/core.hpp>
    #include <opencv/cv.hpp>
    #include <opencv2/highgui/highgui.hpp>
    
    using namespace cv;
    using namespace std;
    Mat src;
    Mat src_gray;
    int thresh = 30;
    int max_thresh = 255;
    
    int main()
    {
    	src = imread("E:\\Exercise\\VS\\project\\运动检测\\混合高斯模型\\1.png", CV_LOAD_IMAGE_COLOR); 	//注意路径得换成自己的
    	cvtColor(src, src_gray, CV_BGR2GRAY);//灰度化 	
    	GaussianBlur(src, src, Size(3, 3), 0.1, 0, BORDER_DEFAULT);
    	blur(src_gray, src_gray, Size(3, 3)); //滤波 	
    	namedWindow("image", CV_WINDOW_AUTOSIZE);
    	imshow("image", src);
    	moveWindow("image", 20, 20);
    	//定义Canny边缘检测图像 	
    	Mat canny_output;
    	vector<vector<Point> > contours;
    	vector<Vec4i> hierarchy;
    	//利用canny算法检测边缘 	
    	Canny(src_gray, canny_output, thresh, thresh * 3, 3);
    	namedWindow("canny", CV_WINDOW_AUTOSIZE);
    	imshow("canny", canny_output);
    	moveWindow("canny", 550, 20);
    	//查找轮廓 	
    	findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
    	//计算轮廓矩 	
    	vector<Moments> mu(contours.size());
    	for (int i = 0; i < contours.size(); i++)
    	{
    		mu[i] = moments(contours[i], false);
    	}
    	//计算轮廓的质心 	
    	vector<Point2f> mc(contours.size());
    	for (int i = 0; i < contours.size(); i++)
    	{
    		mc[i] = Point2d(mu[i].m10 / mu[i].m00, mu[i].m01 / mu[i].m00);
    	}
    	//画轮廓及其质心并显示 	
    	Mat drawing = Mat::zeros(canny_output.size(), CV_8UC3);
    	for (int i = 0; i < contours.size(); i++)
    	{
    		Scalar color = Scalar(255, 0, 0);
    		drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point());
    		circle(drawing, mc[i], 5, Scalar(0, 0, 255), -1, 8, 0);
    		rectangle(drawing, boundingRect(contours.at(i)), cvScalar(0, 255, 0));
    		char tam[100];
    		//printf(tam, "(%0.0f,%0.0f)", mc[i].x, mc[i].y);
    		putText(drawing, tam, Point(mc[i].x, mc[i].y), FONT_HERSHEY_SIMPLEX, 0.4, cvScalar(255, 0, 255), 1);
    	}
    	namedWindow("Contours", CV_WINDOW_AUTOSIZE);
    	imshow("Contours", drawing);
    	moveWindow("Contours", 1100, 20);
    	waitKey(0);
    	src.release();
    	src_gray.release();
    	return 0;
    }
    
    #coding=utf-8
    import cv2
    import numpy as np
     
     
    img = cv2.imread('./image/multiple.png')
     
    # convert the image to grayscale
    gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # convert the grayscale image to binary image
    ret,thresh = cv2.threshold(gray_image,127,255,0)
     
    # find contour in the binary image
    contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    # find contour in the binary image(opencv4)
    #binary, contours, opt  = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    for c in contours:
    	# calculate moments for each contour
    	M = cv2.moments(c)
    	cX = int(M["m10"] / M["m00"])
    	cY = int(M["m01"] / M["m00"])
    	
    	
        # calculate x,y coordinate of center
    	cv2.circle(img, (cX, cY), 5, (255, 255, 255), -1)
    	cv2.putText(img, "centroid", (cX - 25, cY - 25),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)
     
     
    # 3.4.1 im2, contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
    # 3.2.0 im2, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 	
     
    # display the image
    cv2.imshow("Image", img)
    cv2.waitKey(0)
    
    展开全文
  • from scipy import ndimage import numpy as np a= np.array([ [0, 0, 0, 0], [0, 1, 0, 0], [0, 2, 0, 0], [1, 0, 0, 0], [1, 1, 0, 1], [1, 2, 0, 1], [2, 0, 0, 0], [2, 1, 0, 0], ...b =.
    from scipy import ndimage
    import numpy as np
    
    a= np.array([
        [0,  0,  0,  0],
        [0,  1,  0,  0],
        [0,  2,  0,  0],
        [1,  0,  0,  0],
        [1,  1,  0,  1],
        [1,  2,  0,  1],
        [2,  0,  0,  0],
        [2,  1,  0,  0],
        [2,  2,  0,  0]
    ])
    
    b = np.mean(a,axis=0)
    
    print(b)
    
    '''
    [1.         1.         0.         0.22222222]
    '''

    展开全文
  • 寻找彩色图片目标物体的质心,里面有图片,是圆形区域,并且把所有圆进行编号。
  • (一)单个blob的质心寻找 #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/opencv.hpp> #include <...
  • 距离变换distanceTransform应用——寻找图像的质心OpenCV中distanceTransform方法用于计算图像中每一个非零点距离离自己最近的零点的距离,distanceTransform的第二个Mat矩阵参数dst保存了每一个点与最近的零点的...
  • 目录 1 名词解释 2 在OpenCV中查找Blob质心的步骤 ...质心是针对实物体而言的,而几何中心是针对抽象几何体而言的,对于密度均匀标准形状的物体,质心和几何中心重合。 但是当要找到任意形状的质...
  • opencv提取光斑质心

    2018-05-08 09:46:04
    使用opencv提取图片中光斑的质心达到了亚像素级别
  • 多边形的质心计算

    千次阅读 2019-09-27 11:41:42
    多边形实体的质心计算 难度指数:★★☆☆☆ 前情回顾 OK,第7篇运用了多边形三角剖分+向量叉积的方式计算多边形面积。初步见到了三角形剖分化繁为简的能力,这一篇算是此种算法思想的延伸——质心计算。 质心坐标...
  • 图像的质心

    千次阅读 2019-02-18 14:50:33
    不同之处是图像是2维的,解决的方法是在x方向和y方向上分别独立地找出质心。即对于x方向的质心,图像在质心左右两边像素和相等;对于y方向的质心,图像在质心上下两边像素和相等。 记图像中每一像素在x方向上坐标为...
  • 重心、形心以及质心

    千次阅读 2020-07-29 09:29:53
    质心与形心以及重心
  • KMeans秘籍之如何选取初始质心

    千次阅读 2018-07-10 22:07:58
    这种策略简单,但是效果可能不好,这取决于数据集和寻找的簇的个数。 取一个样本,并使用层次聚类技术对它聚类。 从层次聚类中提取k个簇,并用这些簇的质心作为初始质心。 该方法通常很有效,但仅对...
  • MATLAB找出二值化图像的质心,特征点坐标提取,黑色背景上提取白色点坐标
  • 图像处理之计算二值连通区域的质心

    万次阅读 多人点赞 2013-12-27 00:15:14
    计算二值图像连通区域的中心点/质心, 演示Image Moments算法与连通组件标记算法运用 二值图像区域中心点寻找在图像分析与模式识别中有着重要的地位。
  • 高斯曲面拟合方法是使用较为广泛的目标质心提取算法之一, 通过理论分析和实验表明传统高斯曲面拟合方法对运动卫星的定位存在较大误差。为此, 提出了各向异性的高斯曲面拟合模型, 该模型通过使用两个不同的高斯模糊...
  • 【matlab】 matlab求图像质心算法

    千次阅读 2019-04-19 15:34:28
    【matlab】 matlab求图像质心算法
  • 图像质心寻找,包括圆心,矩形的中心,另外还有图像的模板匹配算法
  • opencv 获取轮廓的 质心 python实现。

    千次阅读 2020-08-28 09:11:09
    opencv 获取轮廓的 质心 python实现。 使用findContours 找到 图像轮扣后,我们需要得到轮廓的 质心,那么应该怎么做呢? 如果想根据多边形的轮廓信息得到多边形的多阶矩,可以使用类moments,这个类可以得到...
  • 利用OpenCV识别RGB图像中的草莓轮廓,并计算其质心,获取生长方向
  • //画轮廓及其质心并显示 Mat drawing = Mat::zeros( canny_output.size(), CV_8UC3 ); for( int i = 0; i(); i++ ) { Scalar color = Scalar( 255, 0, 0); drawContours( drawing, contours, i...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,203
精华内容 1,681
关键字:

寻找质心的方法