【计算机视觉基础】最大核聚类,采用Canny等边缘滤波方法对图像边缘提取,提取图像的Harris角点特征并进行沃罗诺伊与德劳内网格划分,显示沃罗诺伊划分的最大核聚类,详细的最大核聚类计算算法

本文主要是介绍【计算机视觉基础】最大核聚类,采用Canny等边缘滤波方法对图像边缘提取,提取图像的Harris角点特征并进行沃罗诺伊与德劳内网格划分,显示沃罗诺伊划分的最大核聚类,详细的最大核聚类计算算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 问题描述如下:

  1. 分别采用Sobel、Prewitt、Canny边缘滤波方法对一张彩色进行边缘特征提取,并分别显示对应的边缘图像,
  2. 获取要求1中彩色图像上的Harris角点特征,基于生成的角点特征对要求1生成的Canny边缘图像进行德劳内网格划分与沃罗诺伊网格划分,要求两种划分分别单独显示在边缘检测结果图像上;
  3. 编写代码实现要求2中沃罗诺伊网格划分的最大核聚类:挑选并显示该沃罗诺伊网格划分的最大核取类结果;或指定沃罗诺伊网格划分图像中的某个沃罗诺伊区域为核,生成并显示该核的最大核聚类结果;这里实现最大核聚类的方法采用遍历每一个沃罗诺伊网格,选出最大的沃罗诺伊网格作为核并生成最大核聚类。

实现的程序代码如下: 

clear
clc
%% 1、三种滤波方法提取边缘特征
I=imread('peppers.png');
Igy=rgb2gray(I);
Isob=edge(Igy,'Sobel');
Iprew=edge(Igy,'Prewitt');
Icany=edge(Igy,'Canny');
figure('Name','边缘特征提取','NumberTitle','off')
subplot(221),imshow(I),title('原彩色图像')
subplot(222),imshow(~Isob),title('Sobel滤波器提取边缘')
subplot(223),imshow(~Iprew),title('Prewitt滤波器提取边缘')
subplot(224),imshow(~Icany),title('Canny滤波器提取边缘')
%% 2、德劳内剖分与沃罗诺伊剖分
corns=detectHarrisFeatures(Igy);
corns2=corns.Location;
corns2=double(corns2);
TC=delaunay(corns2(:,1),corns2(:,2));
figure('Name','德劳内与沃罗诺伊','NumberTitle','off')
subplot(121),imshow(~Icany),title('德劳内网格划分'),hold on
triplot(TC,corns2(:,1),corns2(:,2),'b-')
subplot(122),imshow(~Icany),title('沃罗诺伊网格划分'),hold on
voronoi(corns2(:,1),corns2(:,2),'r'),hold on%% 3、最大核聚类
[v,p]=voronoin(corns2);#得到voronoi网格顶点的坐标矩阵和voronoi网格顶点的坐标矩阵中的行索引的单元数组
for i=1:length(p)
chdu(i)=length(p{i,1});
end
chadu=chdu';
[z,wz]=max(chadu);
figure('Name','最大核聚类','NumberTitle','off')
imshow(~Icany),hold on
suoyin=p{wz,1};
julei=v(suoyin,:);
jleix=[julei(:,1)' julei(1,1)];
jleiy=[julei(:,2)' julei(1,2)];
m=1;
for i=1:length(p)#挑选与最大核相连的沃罗诺伊网格A=p{i,1};for k=1:length(suoyin)B=find(A==suoyin(k));if isempty(B)==0jlyuan{m,1}=A;m=m+1;endend
end
for i=1:length(jlyuan)ljieyb=v(jlyuan{i,1},:);patch(ljieyb(:,1),ljieyb(:,2),'y'),hold on
end
plot(jleix,jleiy,'Color','c','LineWidth',3)
patch(jleix,jleiy,'m'),hold on
voronoi(corns2(:,1),corns2(:,2),'r'),hold on
plot(corns2(wz,1),corns2(wz,2),'b'),hold on

程序算法原理如下 :

  1. 我首先使用函数rgb2gray将彩色图像转换为灰度图像,然后使用函数edge对灰度图像进行边缘特征提取,首先将函数edge的参数method设为‘Sobel’,获得图像通过Sobel滤波方法进行边缘特征提取得到的边缘图像,然后分别将此参数设为‘Prewitt’和‘Canny’,分别获得图像通过Prewitt和Canny滤波方法进行边缘特征提取得到的边缘图像,最后使用函数imshow显示获得的各边缘图像的负像,负像看起来更清晰。检测结果的差异性我将在实验总结中进行分析。
  2. 对灰度后图像使用函数detectHarrisFeatures获得使用Harris方法计算的步骤1中彩色图像的图像角点,然后使用函数delaunay创建图像的Harri角点的二维德劳内三角剖分,先使用函数imshow显示步骤1中的Canny边缘图像的负像,并使用命令hold on保持,再使用函数triplot显示德劳内三角剖分,从而获得边缘图像上的德劳内网格划分;再然后使用函数voronoi将Harris角点的沃罗诺伊网格绘制在Canny边缘图像上,获得边缘图像上的沃罗诺伊网格划分。结果分析将在实验总结中说明。
  3. 首先我使用函数voronoin(详细介绍请在matlab命令窗口输入doc+voronoin,函数voronoin与voronoi不同)获得图像Harris角点的voronoi网格顶点的坐标矩阵和保存了所有voronoi元胞的所有voronoi顶点在voronoi网格顶点的坐标矩阵中的行索引的单元数组,一个元胞就是一个沃罗诺伊网格,而以某个元胞为核的聚类的大小可以通过其边的数量确定,而元胞的voronoi顶点的数量同样对应着边的数量,所以我要通过元胞的voronoi顶点的索引的数量,也就是单元数组中保存的行索引数组的长度来判断以某个元胞为核的聚类的大小,进而来寻找最大核聚类的核,所以直接在单元数组中遍历一遍计算每行索引数组的长度,然后使用函数max获得具有最大的长度的行索引数组在单元数组中的位置,利用位置在单元数组中读取这个行索引数组,这个行索引数组就是最大核聚类的核的所有voronoi顶点的行索引数组,然后利用其行索引数组在保存了voronoi网格顶点的坐标矩阵中读取最大核聚类的核的所有voronoi顶点的坐标,至此就在图像的沃罗诺伊网格划分中找到了最大核聚类的核对应的元胞;再利用上述相似的方法,利用元胞的顶点去锁定一个元胞,来寻找出最大核聚类中出了核之外的元胞,因为在最大核聚类中的元胞肯定有一个voronoi顶点与核的voronoi顶点相同,那么就是说在最大核聚类的所有元胞的voronoi顶点的行索引数组中都会有与核的voronoi顶点的行索引数组中的元素,所以遍历保存了voronoi顶点的行索引数组的单元数组,找出所有包含了最大核聚类的核的voronoi顶点的行索引数组元素的行索引数组,通过这些行索引数组就可以在保存了voronoi网格顶点的坐标矩阵中读取最大核聚类的所有voronoi顶点的在图像中的坐标,所以就锁定了整个最大核聚类,最后先使用函数imshow显示Canny边缘图像并保持,再使用函数patch利用获得最大核聚类中所有元胞的voronoi顶点坐标对最大核聚类区域改变颜色,以显示最大核聚类,再使用patch函数利用最大核聚类的核的voronoi顶点对核对应的元胞改变颜色,以显示最大核聚类核。

程序运行结果如下:

1、三种滤波方法提取边缘特征

2、德劳内剖分与沃罗诺伊剖分

 3、沃罗诺伊最大核聚类

 最大核聚类算法比较复杂,在算法原理中的描述比较详细,仔细阅读同时运行程序,利用matlab的帮助窗口,可以找到我在算法原理中的一些属性的描述,也可以通过工作区的变量进行查看,查看这些变量的属性,算法适用于所有图像,可以计算出任意一幅图像的最大核聚类,并在沃罗诺伊划分上显示。(matlab帮助窗口使用:doc+函数名。可以得到更加详细的用法介绍),如有其他疑问欢迎留言提问或者私信博主。

 别忘了给博主点个赞哦!

关注博主,学习更多计算机视觉与图像处理知识!

原创内容,未经允许不得转载!

最大核聚类算法属于博主原创方法。 

这篇关于【计算机视觉基础】最大核聚类,采用Canny等边缘滤波方法对图像边缘提取,提取图像的Harris角点特征并进行沃罗诺伊与德劳内网格划分,显示沃罗诺伊划分的最大核聚类,详细的最大核聚类计算算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/338277

相关文章

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

通过Docker Compose部署MySQL的详细教程

《通过DockerCompose部署MySQL的详细教程》DockerCompose作为Docker官方的容器编排工具,为MySQL数据库部署带来了显著优势,下面小编就来为大家详细介绍一... 目录一、docker Compose 部署 mysql 的优势二、环境准备与基础配置2.1 项目目录结构2.2 基

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Python实现常用文本内容提取

《Python实现常用文本内容提取》在日常工作和学习中,我们经常需要从PDF、Word文档中提取文本,本文将介绍如何使用Python编写一个文本内容提取工具,有需要的小伙伴可以参考下... 目录一、引言二、文本内容提取的原理三、文本内容提取的设计四、文本内容提取的实现五、完整代码示例一、引言在日常工作和学

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

Centos环境下Tomcat虚拟主机配置详细教程

《Centos环境下Tomcat虚拟主机配置详细教程》这篇文章主要讲的是在CentOS系统上,如何一步步配置Tomcat的虚拟主机,内容很简单,从目录准备到配置文件修改,再到重启和测试,手把手带你搞定... 目录1. 准备虚拟主机的目录和内容创建目录添加测试文件2. 修改 Tomcat 的 server.X

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快