clear all;clc;
%%识别图像形状
% 1、读取图像并转化为二值图像
RGB = imread('ImageSeg.png');
% figure;imshow(RGB);title('原图像');
% 转化为灰度图像
I = rgb2gray(RGB);
% 设置阈值
% threshold = graythresh(I);
% 转化为二值图像
% bw = im2bw(I,threshold);
% figure(3);imshow(bw);
bw = im2bw(I,0.69);;
% 通过领域判断手动去噪
[m,n] = size(bw);
for i = 2:m-1
for j = 2:n-1
%同上下元素判断
if(bw(i,j)~=bw(i+1,j) && bw(i,j)~=bw(i-1,j))
bw(i,j) = 1;
%同左右元素判断
elseif(bw(i,j)~=bw(i,j+1) && bw(i,j)~=bw(i,j-1))
bw(i,j) = 1;
%同斜边元素判断
elseif(bw(i,j)~=bw(i+1,j+1) && bw(i,j)~=bw(i-1,j-1))
bw(i,j) = 1;
%同斜边元素判断
elseif(bw(i,j)~=bw(i-1,j+1) && bw(i,j)~=bw(i+1,j-1))
bw(i,j) = 1;
end
end
end
% 二值化图像取反
for i = 1:m
for j = 1:n
bw(i,j) = ~bw(i,j);
end
end
% figure(3);imshow(bw)
% 去除小目标,因为本图没有小目标,所以可以不需要本条语句
bw = bwareaopen(bw,30);
% 图形学结构元素构建,圆形
se = strel('disk',8);
% 关操作
bw = imclose(bw,se);
% 填充孔洞
bw = imfill(bw,'holes');
% 二值化图像显示
figure(1);imshow(bw);title('二值图像');
[B,L] = bwboundaries(bw,'noholes');
figure(2);imshow(label2rgb(L,@jet,[.5 .5 .5]));
hold on;
for k = 1:length(B)
boundary = B{k};
% 显示白色边界
plot(boundary(:,2),boundary(:,1),'w','LineWidth',2)
end
%%
hold on;
% 确定圆形目标
stats = regionprops(L,'Area','Centroid');
% 设置求面积
threshold = 0.85;
for k = 1:length(B)
boundary = B{k};
delta_sq = diff(boundary).^2;
% 求周长
perimeter = sum(sqrt(sum(delta_sq,2)));
% 求面积
area = stats(k).Area;
metric = 4*pi*area/perimeter^2;
metric_string = sprintf('%2.2f',metric);
% 根据阈值匹配
if metric > threshold
centroid = stats(k).Centroid;
plot(centroid(1),centroid(2),'ko');
text(centroid(1)-2,centroid(2)-2, '这是圆形','Color',...
'k','FontSize',14,'FontWeight','bold');
end
text(boundary(1,2)-10,boundary(1,1)-12, metric_string,'Color',...
'k','FontSize',14,'FontWeight','bold');
end
title('图像形状识别')
%%