参考链接:图像处理之Matlab特征提取和表达_提取目标的二值化图-CSDN博客
主要分为以下四步:
-
step1:载入图像,图像分割
-
%steps:显示图像边界
-
%Step3;标记区域
-
%step4:特征表达
% step1:载入图像,图像分割 img=imread("1.png"); figure,imshow(img); img=im2bw(img);%(图像分割)转化为二值图 img=not(img);%对img进行取反操作,即将图像中的黑色和白色像素颜色进行互换 figure,imshow(img); %steps:显示图像边界 [B,L]=bwboundaries(img);%用于寻找二值图像 img 中的所有对象的边界,它返回一个单元格数组 B,其L 是一个标签矩阵,用于指示每个像素属于哪个对象。 figure,imshow(img); hold on;%保持图形窗口的当前图形,并允许在同一图形窗口中绘制多个图形 for k=1:length(B)%循环遍历每个对象的边界。 boundary=B{k};%从单元格数组 B 中获取第 k 个对象的边界坐标点 plot(boundary(:,2),boundary(:,1),"g","linewidth",2);% end %Step3;标记区域 [L,N]=bwlabel(img); %标记二值图像 img 中的连通区域,并返回标签矩阵 L 和区域数量 N。L 中的每个非零元素表示一个像素所属的区域编号。 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 %step4:特征表达 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 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)); % 创建一个包含21种颜色的调色板 figure for k = 1:N scatter(areas(k),TR(k),[],cmap(k,:),'filled'); ylabel('Thinness Ratio'),xlabel('Area'); hold on end
计算结果: