matlab实现基于DPCA密度峰值算法的图像分割
matlab代码如下
图像最好小一点,不然因为那个距离矩阵为(mn)(m*n)真的很慢很慢,运算上亿次了,电脑根本跑不动。
clear
close allIy=imread('1.jpg');
figure;imshow(Iy);
I = imresize(Iy,[53 33]);
figure, imshow(I); % 读入分割目标
img_gray=rgb2gray(I);%灰度化% 获取图像的长宽
[m,n]=size(img_gray);A = reshape(I(:, :, 1), m*n, 1); % 将RGB分量各转为kmeans使用的数据格式m*n行,一行一样本
B = reshape(I(:, :, 2), m*n, 1);
C = reshape(I(:, :, 3), m*n, 1);
data = [A B C];
dat=mat2gray(data);%归一化distance_all=[];
z=1;
pn=m*n;for i =1: pnfor j = 1:pny=(dat(i,1)-dat(j,1))^2+(dat(i,2)-dat(j,2))^2+(dat(i,3)-dat(j,3))^2;y=double(y);dist(i,j)=sqrt(y);%把距离放入了矩阵 distance_all(z)= sqrt(y);%把距离放入一个长的地方进行排序z=z+1;end
end%% 确定 dc
percent=2.0;
position=round(length(distance_all)*percent/100); %% round 是一个四舍五入函数
sda=sort(distance_all); %% 对所有距离值作升序排列
dc=sda(position);%% 计算局部密度 rho (利用 Gaussian 核)%% 将每个数据点的 rho 值初始化为零
for i=1:pnp(i)=0.;
end
% Gaussian kernel
%for i=1:pn-1
% for j=i+1:pn
% p(i)=p(i)+exp(-(dist(i,j)/dc)*(dist(i,j)/dc));
% p(j)=p(j)+exp(-(dist(i,j)/dc)*(dist(i,j)/dc));
% end
%end
% "Cut off" kernel
%
for i=1:pn-1for j=i+1:pnif (dist(i,j)<dc)p(i)=p(i)+1.;p(j)=p(j)+1.;endend
end%% 先求矩阵列最大值,再求最大值,最后得到所有距离值中的最大值
maxd=max(max(dist));
%% 将 rho 按降序排列,ordrho 保持序
[rho_sorted,ord]=sort(p,'descend');
%% 处理 rho 值最大的数据点
delta(ord(1))=-1.;
nneigh(ord(1))=0;%% 生成 delta 和 nneigh 数组
for i=2:pndelta(ord(i))=maxd;for j=1:i-1if(dist(ord(i),ord(j))<delta(ord(i)))delta(ord(i))=dist(ord(i),ord(j));nneigh(ord(i))=ord(j);% 记录 rho 值更大的数据点中与 ordrho(ii) 距离最近的点的编号 ordrho(jj)endend
end%% 生成 p 值最大数据点的 delta 值
delta(ord(1))=max(delta(:));%% 决策图fid = fopen('DECISION_GRAPH', 'w');
for i=1:pnfprintf(fid, '%6.2f %6.2f\n', p(i),delta(i));
end%% 选择一个围住类中心的矩形0scrsz = get(0,'ScreenSize');%% 人为指定一个位置
figure('Position',[6 72 scrsz(3)/4. scrsz(4)/1.3]);%% ind 和 gamma 在后面并没有用到
for i=1:pnind(i)=i;gamma(i)=p(i)*delta(i);
end%% 利用 rho 和 delta 画出一个所谓的“决策图”
subplot(1,1,1)
tt=plot(p(:),delta(:),'.','MarkerSize',5,'MarkerFaceColor','k','MarkerEdgeColor','k');
axis([0,max(p),0,max(delta)]);fig=subplot(1,1,1);
rect = getrect(fig);%% getrect 从图中用鼠标截取一个矩形区域, rect 中存放的是
%% 矩形左下角的坐标 (x,y) 以及所截矩形的宽度和高度
rhomin=rect(1);
deltamin=rect(2); %% 作者承认这是个 error,已由 4 改为 2 了!%% 初始化 cluster 个数
ncluster=0;%% cl 为归属标志数组,cl(i)=j 表示第 i 号数据点归属于第 j 个 cluster
%% 先统一将 cl 初始化为 -1
for i=1:pncl(i)=-1;
end%% 在矩形区域内统计数据点(即聚类中心)的个数
for i=1:pnif ( (p(i)>rhomin) && (delta(i)>deltamin))ncluster=ncluster+1;cl(i)=ncluster; %% 第 i 号数据点属于第 NCLUST 个 clustericl(ncluster)=i; %% 逆映射,第 NCLUST 个 cluster 的中心为第 i 号数据点 end
end
fprintf('总共有多少类: %i \n', ncluster);%% 将其他数据点归类 (assignation)
for i=1:pnif (cl(ord(i))==-1)cl(ord(i))=cl(nneigh(ord(i)));end
end
%halo
%% 由于是按照 p值从大到小的顺序遍历,循环结束后, cl 应该都变成正的值了.
for i=1:pnhalo(i)=cl(i);
end
if (ncluster>1)% 初始化数组 bord_rho 为 0,每个 cluster 定义一个 bord_rho 值for i=1:nclusterbord_rho(i)=0.;end% 获取每一个 cluster 中平均密度的一个界 bord_rhofor i=1:pn-1for j=i+1:pn%% 距离足够小但不属于同一个 cluster 的 i 和 jif ((cl(i)~=cl(j))&& (dist(i,j)<=dc))rho_aver=(p(i)+p(j))/2.; %% 取 i,j 两点的平均局部密度if (rho_aver>bord_rho(cl(i))) bord_rho(cl(i))=rho_aver;endif (rho_aver>bord_rho(cl(j))) bord_rho(cl(j))=rho_aver;endendendend%% halo 值为 0 表示为 outlierfor i=1:pnif (p(i)<bord_rho(cl(i)))halo(i)=0;endend
end%% 逐一处理每个 cluster
for i=1:nclusternc=0; %% 用于累计当前 cluster 中数据点的个数nh=0; %% 用于累计当前 cluster 中核心数据点的个数for j=1:pnif (cl(j)==i) nc=nc+1;endif (halo(j)==i) nh=nh+1;endendfprintf('类: %i CENTER: %i 数据点个数: %i 核心点: %i 边界点: %i \n', i,icl(i),nc,nh,nc-nh);
end
cmap=colormap;for i=1:nclusteric=int8((i*64.)/(ncluster*1.));subplot(1,1,1)hold onplot(p(icl(i)),delta(icl(i)),'o','MarkerSize',8,'MarkerFaceColor',cmap(ic,:),'MarkerEdgeColor',cmap(ic,:));axis([0,max(p),0,max(delta)]);
endpixel_labels = reshape(cl,m,n);
rgb_labels = label2rgb(pixel_labels);
figure, imshow(rgb_labels), title('Segmented Image');%for i=1:ND
% if (halo(i)>0)
% ic=int8((halo(i)*64.)/(NCLUST*1.));
% hold on
% plot(Y1(i,1),Y1(i,2),'o','MarkerSize',2,'MarkerFaceColor',cmap(ic,:),'MarkerEdgeColor',cmap(ic,:));
% end
%end
faa = fopen('CLUSTER_ASSIGNATION', 'w');for i=1:pnfprintf(faa, '%i %i %i\n',i,cl(i),halo(i));
endclt=transpose(cl);
eva= evalclusters(dat,clt,'DaviesBouldin');
disp(eva);
matlab实现基于DPCA密度峰值算法的图像分割相关推荐
- DPCA 密度峰值聚类记录
密度峰值算法(Clustering by fast search and find of density peaks),一种基于密度的聚类方法,主要思想是寻找被低密度区域分离的高密度区域. 密度峰值算 ...
- 惯性gps组合导航matlab,Strong-tracking-filter 基于强跟踪滤波算法的惯性加GPS组合导航matlab仿真程序 238万源代码下载- www.pudn.com...
文件名称: Strong-tracking-filter下载 收藏√ [ 5 4 3 2 1 ] 开发工具: matlab 文件大小: 82 KB 上传时间: 2013-09-01 下载次数 ...
- matlab ahe,基于直方图的图像增强算法(HE、CLAHE、Retinex)之(二)
作为图像增强算法系列的第二篇文章,下面我们将要介绍功能强大.用途广泛.影响深远的对比度有限的自适应直方图均衡(CLAHE,Contrast Limited Adaptive Histogram Equ ...
- 基于密度峰值的聚类(DPCA)
1.背景介绍 密度峰值算法(Clustering by fast search and find of density peaks)由Alex Rodriguez和Alessandro Laio于20 ...
- 密度峰值聚类算法(DPC)
目录 前言 一.DPC算法 1.1 DPC算法的两个假设 1.2 DPC算法的两个重要概念 1.3 DPC算法的执行步骤 1.4 DPC算法的优缺点 二.改进的DPC算法及其论文 2.1 局部密度和相 ...
- 峰值云变换matlab代码,一种基于密度峰值的云变换方法与流程
本发明涉及一种基于密度峰值的云变换方法,属于数字图像数据处理技术. 背景技术: 粒计算是基于多层次粒结构研究思维方式.问题求解方法.信息处理模式的理论,早在1997年,Zadeh教授就提出了粒计算是模 ...
- 基于密度聚类算法的改进
基于密度算法的改进 本篇博客来自我的github小项目,如果对您有帮助,希望您前去点星 ! 使用基于密度的聚类算法,进行高维特征的聚类分析,从高维数据中提取出类似的有用信息,从而简化了特征数量,并且去 ...
- matlab girvan newman,基于含权Newman算法的交通控制子区划分
1. 引言 如何根据交通网络的拓扑结构和交通流的网络分布特征,将庞大且复杂的路网划分成若干独立的子区,有效实现子区上的信号控制,使得整个路网系统变得更加高效.可靠和灵活,一直备受研究者关注.自1971 ...
- (转载)基于TDOA声源定位算法仿真–MATLAB仿真
(转载)基于TDOA声源定位算法仿真–MATLAB仿真 转载自:https://blog.xxcxw.cn/archives/28 声源定位算法是利用麦克风阵列进行声音定位,属于宽带信号,传统的MUS ...
最新文章
- C# 各种进制之间相互转换 [ZT]
- 河北传媒学院计算机专业分数线,河北传媒学院2019年各省各专业录取分数
- CentOS6.4下安装TeamViewer8
- python3.7.3安装教程和配置idle_python 3.7.0 安装配置方法图文教程
- mysql存储过程 --游标的使用 取每行记录 (多字段)
- Office在线预览及PDF在线预览的实现方式大集合
- matlab 高阶(二) —— 数值、溢出问题的解决
- 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_7_常用的函数式接口_Supplier接口...
- 远程文件传输工具Filezilla
- Windows10 文件夹按分组排序
- 点击微信内网页a标签直接跳转打开淘宝APP的方法实例
- 联想拯救者y7000电脑开机一直是锁屏界面,点一下就黑屏,无法进入输密码界面
- C# 生成图片缩略图
- gallery3d的源码分析——入口
- 代码战争之友人与敌人
- ZCMU 1600: 卡斯丁狗要吃糖葫芦
- Vue-Quill-Editor 回显 html 图片样式显示不出来
- 实例说明图像的灰度化和二值化的区别
- JanusGraph环境搭建实战
- 迁移学习(一):相关数据集介绍
热门文章
- 计算机安全监察word,全国计算机统考押题计算机安全
- IFB上挂载NETEM
- Oracle 数据库12c 新特性总结
- 使用fetch上传文件失败的解决方案
- Codeforces 480D Parcels(dp)
- [十大排序]有的人图画着画着就疯了(1.5w字详细分析+动图+源码)
- linux卸载phpstudy_centos
- 题目汇总(ACWing)
- 2020 杭电多校5 1007、1008、1011
- 彻底解决安装包过程中的Requirement already satisfied:问题