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

目录

一.载入图像,图像分割

二.使用bwboundaries函数显示图像中目标的边界

三.标记区域

四.特征表达

参考文献:


今天,刚学了一些规则图形的特征提取,发现了几个好用的函数。请见下文:
我想对下面的图片进行图像内容提取
这里写图片描述
 

一.载入图像,图像分割


因为是一张彩色图像,所以先进行图像分割,最简单的就是阈值化了,可以直接使用im2bw(),图像分割的其他方法先不展开,下回分析,在这里使用im2bw()函数已经够用

img = imread('图形.jpg');
figure,imshow(img);
img = im2bw(img);%(图像分割)转化为二值图
img = not(img);%把图像想表达的内容变成1
figure,imshow(img);

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

 

二.使用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

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

 

三.标记区域


使用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

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

到这里,特征提取基本完成,接下来


四.特征表达


使用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

查看效果:
这里写图片描述
从这里可以查看很多数据,比如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

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

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

参考文献:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值