找回密码
 注册

扫一扫,访问微社区

查看: 20|回复: 1

这是一篇关于集Matlab的形状识别与计算图形周长、面积、圆周率的文章

[复制链接]

该用户从未签到

发表于 2020-1-15 09:32 | 显示全部楼层 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

5 o! z- N. p' \, ]  @  H3 n1.二值化图像
8 d- k! D8 l2 E9 z0 K: J; e​ 用于处理的图像,一般都是为二值图像。这里也不例外,因为要调用那些图像处理函数,传入的图像都是二值化后的图像。( K$ a, e. p: y& e) \
% w1 {# i: C, C; O/ r
二值化操作代码:5 u; U6 J" y: s% z( Y: c2 _
- _6 p- x) L* K, j, s
  • 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)<T1)
  •             BWimg(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);
    / m2 `8 f0 U9 g" J& o
; C) R8 I! ~4 @0 N
运行结果:
/ B* x2 u! a  E  v' ^* {! V( J
6 ?, o  G$ C$ ~& i2 g 这是一篇关于集Matlab的形状识别-7.png
* X3 M0 V6 I  h$ @
7 Y: r0 U6 U/ \1 E, q
8 K8 y- j9 w- W* ?% ^' U. R2.统计标注连通域' U8 R+ [2 @. N% P3 T! k$ p% H4 p
0 w0 l  ~; }" V- W
参考网址:) G* ?/ M7 H; k& w6 h2 ~
+ v  t) ?# N! \" `( |
Matlab中bwlabel函数的使用% G! J/ ^' f9 s- L" d1 w; V, @

5 `0 N! K; s% Q) a: Kmatlab的Regionprops详解6 j+ s9 G; W" C3 t% R
; c" ?7 i+ n0 g3 z: S0 ]
4 g9 O! N% F+ x$ W
bwlabel函数
- P8 N. Q" D- x, Z) Q  L0 \. ^$ C  ]  [' n& i- m
) Q% h0 D* \: V3 k- y) M- c, F4 M
L = bwlabel(BW,n)
- _3 S1 R+ p; V$ W: k! B返回一个和BW大小相同的L矩阵,包含了标记了BW中每个连通区域的类别标签,这些标签的值为1、2、num(连通区域的个数)。n的值为4或8,表示是按4连通寻找区域,还是8连通寻找,默认为8。4 H/ m( f8 t- v( _( V
4连通或8连通是图像处理里的基本感念:而8连通,是说一个像素,如果和其他像素在上、下、左、右、左上角、左下角、右上角或右下角连接着,则认为他们是联通的;4连通是指,如果像素的位置在其他像素相邻的上、下、左或右,则认为他们是连接着的,连通的,在左上角、左下角、右上角或右下角连接,则不认为他们连通。请注意“或”字的含义,就是满足其中一个条件就认为是连通的。* z" S5 E4 h+ N: k9 S( J6 i. y
[L,num] = bwlabel(BW,n)这里num返回的就是BW中连通区域的个数。
7 L, Q3 {: ]+ g% q6 g$ X通俗的说,这个函数的作用是用来找这个二值图像中的连通区域的,对于不同的符合条件的连通区域(4连通,8连通)分别用不同的标号加以区别,结果保存在L这个矩阵里,而num里保存的是输入图像中连通区域的总数。
$ t6 w, D! u$ y/ D( p
2 ]6 |) _5 q& F! i! Z. E  ^8 k9 g
" q+ m9 @. H0 RRegionprops函数, H4 j; `. e- G6 ?% c8 K3 Q

' |" k$ x2 k/ B# h
4 c6 B) m2 y$ z1 U2 Q/ m' ]) ~9 l: CRegionprops:用途是get the properties of region,即用来度量图像区域属性的函数。  n. b. E  E( g- l* a* r! T

. _- K2 V/ n" t/ j. d语法:STATS = regionprops(image,properties)
& _" S% N; U! }+ j  |+ K  }; q6 ]+ \5 ], j- E
image是为传入的是bwlabel函数传出的,经过标记后的图像数据。
+ B) _/ v* _, h+ P0 \; `0 P  {- n( N& C5 J0 F% S, T
properties:这个则是你需要传入的参数。- K4 x! U" u9 G- O, _
# [* K0 b, p' x3 q0 h) O& P# G
比如我们需要求面积,则传入Area参数。. y! Y9 ~6 s* K4 n3 E, y
  x! e* n  Z  e/ x
求周长,则传入Perimeter参数。
) l" y; I: t- u' ?
) U, s/ J% i4 A: A+ I4 T* R求离心率,则传入Eccentricity参数。
: n- G6 }: d$ C) M) `5 l
6 Y" a! V8 j! K, Tregionprops 函数具体有哪些参数可以参考Matlab官方文档。
& E1 k+ q* ^1 g
+ P( |, J: ?5 V; x3 N在Matlab右上角查询regionprops函数,点开,则会有最官方的使用方法和参数含义。' T3 j/ f- {* C! ^

' Y$ C) ~: T& s  B- C 这是一篇关于集Matlab的形状识别-6.png
$ C0 s! t% T- u! |8 p0 k$ ~+ X" s" U3 z9 ~2 `! M# T" I1 W2 Q3 j: g
这个函数非常强大,不止这个教程中的三个功能。
% Y9 v5 b; v$ z; S* Z) q8 [) Q  y
+ A! F/ o/ T$ R- v. z( M6 R9 z: T 这是一篇关于集Matlab的形状识别-5.png % p# j- ?# v- }+ D& R- }: y

+ ?+ [: D! X. W% T2 z/ m- L; T
, M0 m$ h0 J: F; d/ g: H8 S统计连通域代码:! m2 e8 @6 `' b
  G  h+ b; X2 i+ Y
  • %先闭运算 再开运算
  • 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');! @' H8 `7 P$ i6 d) |. E4 c
  ; a9 i+ u2 t7 p. D

% V" N: A4 q- j% ]2 \8 B$ {. j标记图像各个图形,进行图形编号代码
! }& p  f$ W8 v$ l7 h: `7 ~* D( |0 r: n3 r. ?) o# O
  • 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
    / p: U% [% u7 ^! L- |: p8 N
( o: j# s, q, \! L2 i+ t
运行结果图像:0 v5 m& i. g. W- l
. _; V2 U( z+ x9 c) S
这是一篇关于集Matlab的形状识别-4.png * _$ u, ~. c& ^, z5 B3 }

1 E( G9 @" l2 M- O* U. X. x$ p" W4 C' T$ r
3.计算周长,面积与离心率
1 I9 T; n7 ~1 f% r! W8 h2 i- _+ h7 ?
3 V( }" w$ L3 [3 P
接上一次的题目:计算出图像左上角绿色方块的面积和周长,计算出右下角红色椭圆的离心率8 }, \( T' U+ c/ @
4 J" b  n4 G* x6 q! E
​ 要计算出左上角和右下角图像的值,首先,你要先识别出那个图形,你才能对其进行计算。这里就需要使用到前面bwlabel函数标记的矩阵。
5 }2 N7 O2 ~% D2 j4 \) z' _6 a% ~" v
这是一篇关于集Matlab的形状识别-3.png 4 s. _0 o/ @) }7 s9 k/ ?( _0 A0 D

- X) Q5 L) D, z" P6 K7 W# ]8 V代码即:* a! S* c  N$ F4 S) J# g: h6 d4 N

- G" S4 ~/ H) J. Q' T+ ?
  • image_part3 = (copy_mark_image == 3);
    6 N. o7 y7 S* P) k) c( j# l- ~4 }& |
- n0 \2 M- Y1 E

/ }% }( a6 F( L" O根据标记的数值,来判断是不是那个区域,然后将那个标记的区域取出,并显示出来。
5 r. ?+ }6 U& E6 K0 d* V5 v8 L# t) N  A
效果图:注意,使用regionprops函数计算周长和面积,计算的是白色区域的周长和面积。黑白颜色颠倒,那个计算出来的数值则不正确。
: C4 d- I) |( v5 |8 r
4 i8 i$ B+ r9 j! Z8 O) k 这是一篇关于集Matlab的形状识别-2.png
* D6 A# l$ I3 r6 F4 A3 O  w9 V0 h6 p* o

" ~7 H. K7 M! e7 v! t计算代码:7 ^8 X: K( m) ^3 j6 i9 }  h

2 ~( ?5 V1 U8 X- q2 N
  • 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);9 X6 m; Q- G7 Q
    4 f9 K2 U) b6 j6 c
/ E2 I9 X, c" f# z
计算结果将在matlab的命令行窗口打印出来:
& z; \  b! S9 I
& f' Y2 k3 }% g. w/ rround_area = 7044.000000   —— 周长+ ?, y, V- U4 ]6 Q& H
s.Perimeter = 320.200000     ——面积/ ~7 ?6 `( L) R+ X6 K
oval.Eccentricity = 0.915874  ——离心率
' d* T: {+ l( @8 p& E7 x- N4 I% B. a* T+ }# \1 r/ r
这是一篇关于集Matlab的形状识别-1.png
, y& c4 J+ l/ ?6 {5 r* s
( n$ i9 @8 w7 w1 v8 N! t2 E- I: J
0 g7 V  P5 D7 }+ t

该用户从未签到

发表于 2020-1-15 17:56 | 显示全部楼层
集Matlab的形状识别与计算图形周长、面积、圆周率
您需要登录后才可以回帖 登录 | 注册

本版积分规则

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号 )

GMT+8, 2020-1-24 15:24 , Processed in 0.156250 second(s), 22 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19925233282

快速回复 返回顶部 返回列表