Matlab对图像进行鼠标取点操作及K值聚类分析
这篇文章将以良乡大学城某大学附近的共享单车图进行鼠标取点操作以及对相关图像的处理,将共享单车以数据点的形式呈现,并且对数据点进行K值聚类找到最佳的中心点。
PART 1 导入图片并对图片进行取点操作
下面是对tif型的正方形图片进行取点操作(其他形状或者格式的图片可以,即将ylim注释掉),将所要进行操作的图片拖入工作区执行下面的代码:
%% 建立主函数
function BTBU_mouse_track() %BTBU_mouse_track() 运行时只要运行函数名即可
in = imread('照片名称.tif'); %imread函数为读取图像的函数
figure,imshow(in);
%% 显示坐标系,以及画平行于x轴与y轴的水平线,将图片分为四个区域
axis on; % 打开(显示)坐标系
hold on; plot([550,550],[0,1100],'r-'); %ylim 用于绘制y轴的取值范围
hold on; plot([0,1100],[550,550],'r-'); %m-- 用于描述线型,粉色,虚线
BTBUbikedata = zeros(0,2); %保存所取得点,并且以mat形式储存
save BTBUbikedata BTBUbikedata;
set(gcf,'WindowButtonDownFcn',@BTBU_ButttonDownFcn);%% 回调函数
function [x,y]=BTBU_ButttonDownFcn(src,event)
load('BTBUbikedata.mat');
pt = get(gca,'CurrentPoint');
x = pt(1,1);
y = pt(1,2);
BTBUbikedata(end+1,1)=round(y); %每次新产生的坐标加到BTBUbikedata中,注意figure中的x,y坐标跟实际的是反过来的
BTBUbikedata(end,2)=round(x); %由于图像放大会产生非整数坐标,这里取整
[len,~] = size(BTBUbikedata);
fprintf('单车编号=%d,x=%f,y=%f\n',len,y,x);
save BTBUbikedata BTBUbikedata;
PART 2 对数据进行K值聚类
接着在先导入需要在上面展示数据点的底图,执行下列代码,可以得到图1-2所示的展示图
load('BTBUbikedata.mat'); %% 导入数据
x=BTBUbikedata(:,2); y=BTBUbikedata(:,1);
in = imread('图片底层.tif');%% 导入需要在图片上显示点的底图
figure,imshow(in); axis on;
hold on; plot([550,550],[0,1100],'r-'); %ylim 用于绘制y轴的取值范围
hold on; plot([0,1100],[550,550],'r-'); %m-- 用于描述线型,粉色,虚线
hold on; plot(x,y,'ro'); xlim([0,1100]); ylim([0,1100]);%对X轴和Y轴设定显示范围
title('研究样本散点分布图')
执行下列代码可以得到图1-3 二类聚类的轮廓图,由轮库图可以知道第一类数据大部分在0.8以下,而第二类的数据则比较集中,随后采用分层聚类进一步验证,根据分层聚类的方法得出的树状图可以看出,有两大类具有明显差异性的数据,而第三类则是也具有差异但数目极少的数据,因此可以分成明显的两类。
[cidx2,cmeans2,sumd2,D2] = kmeans(BTBUbikedata,2,'dist','sqEuclidean'); %二类K值
P2 = figure;clf;
[silh2,h2] = silhouette(BTBUbikedata,cidx2,'sqeuclidean');
eucD = pdist(BTBUbikedata,'euclidean'); %分层聚类
clustTreeEuc = linkage(eucD,'average');
cophenet(clustTreeEuc,eucD);
P3 = figure;clf;
[h,nodes] = dendrogram(clustTreeEuc,20);
set(gca,'TickDir','out','TickLength',[.002 0],'XTickLabel',[]); % 尝试用三类K值聚类分析
[cidx3,cmeans3,sumd3,D3] = kmeans(BTBUbikedata,3,'dist','sqEuclidean');
P4 = figure;clf;
[silh3,h3] = silhouette(BTBUbikedata,cidx3,'sqeuclidean');
PART 3 对数据进行可视化操作
然后将中心化的点再现在更加清晰可见的底图上
A=xlsread('BTBUbikedaily0801.xls'); %读取Excel表格数据
x=A(:,2); y=A(:,1);
x1=A(:,4); y1=A(:,3);
x2=A(:,6); y2=A(:,5);
x3=A(:,8); y3=A(:,7);
in = imread('图片.tif'); figure,imshow(in); axis on;
hold on; p1=plot([550,550],[0,1100],'r-'); %ylim 用于绘制y轴的取值范围
hold on; p2=plot([0,1100],[550,550],'r-'); %m-- 用于描述线型,粉色,虚线
hold on; p3=plot(x,y,'yo','MarkerFaceColor','y'); %绘制x和y的图像
hold on; p4=plot(x1,y1,'ro','MarkerFaceColor','r'); %MarkerFaceColor表示实心点
hold on; p5=plot(x2,y2,'bo','MarkerFaceColor','b');
hold on; p6=plot(x3,y3,'go','MarkerFaceColor','g');
legend([p3,p4,p5,p6],'昨日时间段03','时间段01','时间段02','时间段03','Location','northoutside','Orientation','horizontal'); %图例,注意图例会展示展示出所有前面plot所画的图像,包括所画的直线,因此采用[pi,pn]来限制图例的展示
title(legend,'0801各个时间段'); xlim([0,1100]); ylim([0,1100]); %对X和Y轴设定显示范围
set(gca,'YDir','reverse'); %将x轴方向设置为反向(从上到下递增)。
title('显示同一天的三个时间段样本散点分布图');
其中使用的单车数据BTBUbikedata.xlsx下载可以访问:https://github.com/ChenQihome9/CSDN-Data-Library
Matlab对图像进行鼠标取点操作及K值聚类分析相关推荐
- kmeans k值确定 matlab,kmeans算法原理以及实践操作(多种k值确定以及如何选取初始点方法)...
kmeans一般在数据分析前期使用,选取适当的k,将数据聚类后,然后研究不同聚类下数据的特点. 算法原理: (1) 随机选取k个中心点: (2) 在第j次迭代中,对于每个样本点,选取最近的中心点,归为 ...
- MATLAB图像取点操作
%% 图像取点操作 % 读入图片 y=imread('数据.bmp'); imshow(y)%显示该图 set(gcf,'outerposition',get(0,'screensize'));%使 ...
- matlab 取点画图,matlab绘图小技巧-图像光滑数据取点
原标题:matlab绘图小技巧-图像光滑&数据取点 小助理之前介绍过Matlab,,一款计算机.医学与生物学的软件,今天转载一篇实操,简单易上手~ 用cftool插值绘图得到拟合后的图像,然后 ...
- matlab对图像操作函数的详解(笔记1)
matlab对图像操作函数的详解 一. 读写图像文件 1. imread imread函数用于读入各种图像文件,如:a=imread('e:\w01.tif') 注:计算机E盘上要有w01相应的.ti ...
- matlab中的级数怎默算_matlab绘图小技巧-图像光滑数据取点
小助理之前介绍过Matlab,,一款计算机.医学与生物学的软件,今天分享一篇实操,简单易上手~ 用cftool插值绘图得到拟合后的图像,然后正确获取拟合图像对应的数据. 有时候的实验室数据图像得到的如 ...
- 第四周作业:利用matlab制作图像的二值模板并分别利用模板进行“与模板相与”、“与模板相或”、“与模板异或”操作
文章目录 第四周作业 第一题 第二题 第四周作业 第一题 题目: 利用 MATLAB 编程,打开自己的一张照片,依次完成下列要求: 1) 以照片的自己作为目标,制作二值模板 2) 分别利用模板进行&q ...
- matlab的图像操作——输出图像尺寸大小、坐标轴等各项设置
Matlab作为工程中的数据可视化工具是非常的方便的.但是在具体的生成过程中通常会遇见以下几个比较常见的问题,这里以我最近在写论文中用图遇到的问题作为例子.简要说明输出图像大小位置规范的重要性. 1: ...
- Qt学习day04 资源和图像 目录和定时器 鼠标和键盘操作
一 资源和图像 1 资源编译器(rcc) 1)创建资源脚本(.qrc) vi test.qrc 0.jpg 2)将资源脚本中描述的图片转换为C++的源文件 rcc test.qrc -o qrc_te ...
- matlab将二值图像与原图重叠_[转载]图像处理matlab及图像融合图像镶嵌图像拼接...
在实际的对图像处理过程中,由于我们读出的图像是unit8型,而在MATLAB的矩阵运算中要求所有的运算变量为double型(双精度型).因此读出的图像数据不能直接进行相加求平均,因此必须使用一个函数将 ...
最新文章
- 【转】人脸识别功能的用户体验设计优化
- java static修饰方法_浅析Java中static修饰符
- 川大和西南交大计算机考研难易度,2020考研:百所211院校报考难易度分析
- Linux中设置vim自动在运算符号两边加上空格
- 数据可视化【六】Line Chart Area Chart
- HP-UX的终端TERM要设置成什么,才能输入中文呢?
- .net 中文语音朗读
- 7923 consoleconsumer 怎么关闭_英雄联盟手游怎么设置最好 LOL手游最佳设置攻略_英雄联盟手游...
- PyTorch-GPU版本、Tensorflow-GPU版本配置
- 将DataFrame某列中的空值填充为0
- cdr添加节点快捷键_常用CDR快捷键
- php 事件流转,php46公文流转
- FBEC2020专访 | 贾瑶琪:Substrate可以在Web3.0中找出更多有意思的创新应用
- 九个最佳ICON图标搜索引擎
- R语言使用min函数获得向量数据的最小值
- 2007年5月12日,地坛书市
- 水果电商“异军突起”,资本市场为何竞相追捧?
- boost::log::trivial用法的测试程序
- Ubuntu18.04手动安装Realtek网卡驱动
- CRM:网站证书过期怎么办