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
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)); figure for k = 1:N scatter(areas(k),TR(k),[],cmap(k,:),'filled'); ylabel('Thinness Ratio'),xlabel('Area'); hold on end
欢迎关注我的公众号【CV之道】,一起学习交流~~
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210768.html原文链接:https://javaforall.net
