【计算机视觉基础】最大核聚类,采用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解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

最新版IDEA配置 Tomcat的详细过程

《最新版IDEA配置Tomcat的详细过程》本文介绍如何在IDEA中配置Tomcat服务器,并创建Web项目,首先检查Tomcat是否安装完成,然后在IDEA中创建Web项目并添加Web结构,接着,... 目录配置tomcat第一步,先给项目添加Web结构查看端口号配置tomcat    先检查自己的to

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

SpringBoot集成SOL链的详细过程

《SpringBoot集成SOL链的详细过程》Solanaj是一个用于与Solana区块链交互的Java库,它为Java开发者提供了一套功能丰富的API,使得在Java环境中可以轻松构建与Solana... 目录一、什么是solanaj?二、Pom依赖三、主要类3.1 RpcClient3.2 Public

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

Spring Boot 中整合 MyBatis-Plus详细步骤(最新推荐)

《SpringBoot中整合MyBatis-Plus详细步骤(最新推荐)》本文详细介绍了如何在SpringBoot项目中整合MyBatis-Plus,包括整合步骤、基本CRUD操作、分页查询、批... 目录一、整合步骤1. 创建 Spring Boot 项目2. 配置项目依赖3. 配置数据源4. 创建实体类