【计算机视觉基础】最大核聚类,采用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)==0
            jlyuan{m,1}=A;
            m=m+1;
        end
    end
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+函数名。可以得到更加详细的用法介绍),如有其他疑问欢迎留言提问或者私信博主。

 别忘了给博主点个赞哦!

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

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

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

猜你喜欢

转载自blog.csdn.net/qq_59049513/article/details/122557631