图像处理之Matlab特征提取和表达

转自:https://blog.csdn.net/ling_xiobai/article/details/76854220

今天,刚学了一些规则图形的特征提取,发现了几个好用的函数。请见下文: 

我想对下面的图片进行图像内容提取 
这里写图片描述 
一.载入图像,图像分割 
因为是一张彩色图像,所以先进行图像分割,最简单的就是阈值化了,可以直接使用im2bw(),图像分割的其他方法先不展开,下回分析,在这里使用im2bw()函数已经够用
img = imread('图形.jpg');
figure,imshow(img);
img = im2bw(img);%(图像分割)转化为二值图
img = not(img);%把图像想表达的内容变成1
figure,imshow(img);
  • 1
  • 2
  • 3
  • 4
  • 5

效果如下: 
这里写图片描述 
这里写图片描述 
最上面那个转化成二值图,变成一个不规则的图形了,应在继续对这个区域做处理,但这不影响我们这篇文章的主题,所以先忽视。

二.使用bwboundaries函数显示图像中目标的边界 
bwboundaries函数可以追踪目标的外边界,以及这些目标中孔的边界。它返回: 
1.一个元胞数组(B)(补充:元胞数组不同于普通数组,普通数组存放的元素都是一样的数据结构,但元胞数组存储的可以是不同的数据类型,所以元素间不相关) 
2.返回一个标号矩阵L,其中每个目标赋予一个标号(下面有示例) 
3.返回总目标数N等

[B,L] = bwboundaries(img);
figure,imshow(img);
hold on;
for k = 1:length(B)
    boundary = B{k};
    plot(boundary(:,2),boundary(:,1),'g','LineWidth',2);
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

效果如下: 
这里写图片描述

三.标记区域 
使用bwlabel标记测试图像中的连续区域(目标),伪彩色化他们,并结合他们的数字标记依次显示他们

[L,N] = bwlabel(img);
img_rgb = label2rgb(L,'hsv',[.5 .5 .5],'shuffle');
figure,imshow(img_rgb);hold on
for k =1:length(B)
    boundary = B{k};
    plot(boundary(:,2),boundary(:,1),'w','LineWidth',2);
    text(boundary(1,2)-11,boundary(1,1)+11,num2str(k),'Color','y','Fontsize',14,'FontWeight','bold');
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

效果图如下: 
这里写图片描述

到这里,特征提取基本完成,接下来 
四.特征表达 
使用regionprops函数对图像中的每个目标提取下面的二值特征 
这个函数实在是好用,直接使用它可以统计很多信息,在workspace可以查看。

stats = regionprops(L,'all');%统计的数保留在stats内
temp = zeros(1,N);
for k = 1:N
    %计算thinness ratio(细度比例)
    temp(k) = 4 * pi * stats(k,1).Area / (stats(k,1).Perimeter)^2;
    stats(k,1).ThinnessRatio = temp(k);
    %计算aspect ratio
    temp(k) = (stats(k,1).BoundingBox(3))/(stats(k,1).BoundingBox(4));
    stats(k,1).AspectRatio = temp(k);
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

查看效果: 
这里写图片描述
从这里可以查看很多数据,比如Area(面积),Centroid(重心),Eccentricity(偏心率),Perimeter(周长)等等,也可以像我一样,定义thinness ratio(细度比例)等等。

其实做到这里,差不多了,接下来就是分析数据,查看各个图行差距比较大的特征,然后定义阈值来制作分类器。 
也可以更清晰地表达画出特征矢量图。以面积和细度比例为例

areas = zeros(1,N);
for k = 1:N
    areas(k) = stats(k).Area;
end
TR = zeros(1,N);

for k = 1: N
    TR(k) = stats(k).ThinnessRatio;
end
cmap = colormap(lines(21));
figure
for k = 1:N
    scatter(areas(k),TR(k),[],cmap(k,:),'filled');
    ylabel('Thinness Ratio'),xlabel('Area');
    hold on
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

效果如下: 
这里写图片描述

OK,这次学习就到这里,希望大家多多交流,一起学习,分享知识是一种美德,谢谢观看。 
附: 
参考书籍:《实用MATLAB图像和视频处理》

猜你喜欢

转载自blog.csdn.net/hxg2006/article/details/80407784