目录
今天,刚学了一些规则图形的特征提取,发现了几个好用的函数。请见下文:
我想对下面的图片进行图像内容提取
一.载入图像,图像分割
因为是一张彩色图像,所以先进行图像分割,最简单的就是阈值化了,可以直接使用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图像和视频处理》