基于Matlab的形状识别与计算图形周长,面积,圆周率

1.二值化图像

​ 用于处理的图像,一般都是为二值图像。这里也不例外,因为要调用那些图像处理函数,传入的图像都是二值化后的图像。

二值化操作代码:

clc;
close all;
clear all;
img=imread('test.bmp'); %读取原图像
figure;
imshow(img);
grayimg = rgb2gray(img);
BWimg = grayimg;
[width,height]=size(grayimg);
figure;
imshow(grayimg);
%二值化
T1=80;
for i=1:width
    for j=1:height
        if(grayimg(i,j)i,j)= 255;
        else 
            BWimg(i,j)= 0;
        end
    end
end
figure;
imshow(BWimg);

%先闭运算 再开运算
se=strel('disk',5);
BWimg = imclose(BWimg,se);
BWimg = imopen(BWimg,se);
figure;
imshow(BWimg);

运行结果

基于Matlab的形状识别与计算图形周长,面积,圆周率_第1张图片

2.统计标注连通域

参考网址:

Matlab中bwlabel函数的使用

matlab的Regionprops详解

bwlabel函数

L = bwlabel(BW,n)
返回一个和BW大小相同的L矩阵,包含了标记了BW中每个连通区域的类别标签,这些标签的值为1、2、num(连通区域的个数)。n的值为4或8,表示是按4连通寻找区域,还是8连通寻找,默认为8。
4连通或8连通是图像处理里的基本感念:而8连通,是说一个像素,如果和其他像素在上、下、左、右、左上角、左下角、右上角或右下角连接着,则认为他们是联通的;4连通是指,如果像素的位置在其他像素相邻的上、下、左或右,则认为他们是连接着的,连通的,在左上角、左下角、右上角或右下角连接,则不认为他们连通。请注意“或”字的含义,就是满足其中一个条件就认为是连通的。
[L,num] = bwlabel(BW,n)这里num返回的就是BW中连通区域的个数。
通俗的说,这个函数的作用是用来找这个二值图像中的连通区域的,对于不同的符合条件的连通区域(4连通,8连通)分别用不同的标号加以区别,结果保存在L这个矩阵里,而num里保存的是输入图像中连通区域的总数。

Regionprops函数

Regionprops:用途是get the properties of region,即用来度量图像区域属性的函数。

语法:STATS = regionprops(image,properties)

image是为传入的是bwlabel函数传出的,经过标记后的图像数据。

properties:这个则是你需要传入的参数。

比如我们需要求面积,则传入Area参数。

求周长,则传入Perimeter参数。

求离心率,则传入Eccentricity参数。

regionprops 函数具体有哪些参数可以参考Matlab官方文档。

在Matlab右上角查询regionprops函数,点开,则会有最官方的使用方法和参数含义。

基于Matlab的形状识别与计算图形周长,面积,圆周率_第2张图片

这个函数非常强大,不止这个教程中的三个功能。

基于Matlab的形状识别与计算图形周长,面积,圆周率_第3张图片

统计连通域代码:

%先闭运算 再开运算
se=strel('disk',5);
BWimg = imclose(BWimg,se);
BWimg = imopen(BWimg,se);
% figure;
subplot(2,2,4);imshow(BWimg);title('形态学操作后的图像');
%统计标注连通域
%使用外接矩形框选连通域,并使用形心确定连通域位置
[mark_image,num] = bwlabel(BWimg,4); %参考博客https://blog.csdn.net/wanrenwangxuejing/article/details/25108191
%bwlabel 寻找连通区域,    4连通是指,如果像素的位置在其他像素相邻的上、下、左或右,则认为他们是连接着的
%num 表示连通区域的个数
%l是大小和BWing一样的图像数组,里面存放着对bwing图像的标签值(即判定为连通后,在L矩阵中标记出来)

%regionprops 介绍
%参考 :https://blog.csdn.net/langb2014/article/details/49886787
%返回值STATS是一个长度为max(L(:))的结构数组,结构数组的相应域定义了每一个区域相应属性下的度量
status=regionprops(mark_image,'BoundingBox');

centroid = regionprops(mark_image,'Centroid');

标记图像各个图形,进行图形编号代码

figure;
imshow(mark_image);title('标记后的图像');

for i=1:num
    rectangle('position',status(i).BoundingBox,'edgecolor','r');%参考https://blog.csdn.net/zr459927180/article/details/51152094
    %参数说明:position绘制的为二维图像(他是通过对角的两点确定矩形框)
    %edgecolor 指边缘图像,r表示变换为红色。
    %facecolor 指内部填充颜色。
    text(centroid(i,1).Centroid(1,1)-15,centroid(i,1).Centroid(1,2)-15, num2str(i),'Color', 'r') 
    %这个是为绘制出来的矩形框图标记数字
end

运行结果图像:

基于Matlab的形状识别与计算图形周长,面积,圆周率_第4张图片

3.计算周长,面积与离心率

接上一次的题目:计算出图像左上角绿色方块的面积和周长,计算出右下角红色椭圆的离心率

​ 要计算出左上角和右下角图像的值,首先,你要先识别出那个图形,你才能对其进行计算。这里就需要使用到前面bwlabel函数标记的矩阵。

基于Matlab的形状识别与计算图形周长,面积,圆周率_第5张图片

代码即:

image_part3 = (copy_mark_image == 3);

根据标记的数值,来判断是不是那个区域,然后将那个标记的区域取出,并显示出来。

效果图:注意,使用regionprops函数计算周长和面积,计算的是白色区域的周长和面积。黑白颜色颠倒,那个计算出来的数值则不正确。

基于Matlab的形状识别与计算图形周长,面积,圆周率_第6张图片

计算代码:

copy_mark_image = mark_image;
image_part3 = (copy_mark_image == 3); %%这边进行区域的选择,例如只保留3
% image_part3 = (mark_image ~= 3); 
figure;
imshow(image_part3);

%求面积
% total = bwarea(image_part3);
% fprintf('total = %f\n', total);
round_area = regionprops(image_part3,'Area');
fprintf('round_area = %f\n', round_area.Area);

%求周长
girth = regionprops(image_part3,'Perimeter');
% girth.Perimeter
fprintf('s.Perimeter = %f\n', girth.Perimeter);

%这边进行区域的选择,例如只保留10
image_part10 = (mark_image == 10);    
figure;
imshow(image_part10);

%求红色椭圆的离心率
oval = regionprops(image_part10,'Eccentricity');%离心率 0 < e < 1之间,e越小,越像圆。
% oval.Eccentricity
fprintf('oval.Eccentricity = %f\n', oval.Eccentricity);

计算结果将在matlab的命令行窗口打印出来:

round_area = 7044.000000   —— 周长
s.Perimeter = 320.200000     ——面积
oval.Eccentricity = 0.915874  ——离心率

基于Matlab的形状识别与计算图形周长,面积,圆周率_第7张图片

 

你可能感兴趣的:(matlab)