找回密码
 注册
关于网站域名变更的通知
查看: 1880|回复: 1
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-1-15 09:32 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x

! n2 {, M" c. c8 ?) O* z* g1.二值化图像
- ]& ?8 _! g% x% l% t: r0 ?​ 用于处理的图像,一般都是为二值图像。这里也不例外,因为要调用那些图像处理函数,传入的图像都是二值化后的图像。
8 w7 e  f0 |- q- v2 C4 x+ h+ V  y/ M3 z6 d) [  u! {+ `3 c
二值化操作代码:: J& D% y7 W, w: W9 [1 I! i

% r# y  p  U) Q4 ?! Y8 _/ ]
  • 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);. w' v  A9 X; n; x8 Z* @; F/ W

$ s7 f: m+ m8 M1 f; {3 Q/ W' ~* V运行结果:
- A( r) X9 X" o4 U+ k0 i6 A1 F( ]- D' n0 x$ b- ~, S

$ n. T# }. q4 O2 t; i" T( @2 Y& V. m
8 F5 D: ?4 [) c4 D9 L
2.统计标注连通域) t( a6 M/ ?8 `: Z( I( b$ S9 H7 d
# N1 ~" C% ]- J/ k2 d- G
参考网址:
, ?' j  i+ h1 D$ e" @/ A1 T2 O* t/ l+ ~8 l$ c. I7 _
Matlab中bwlabel函数的使用9 c0 c7 Z; Q7 o
( D5 V, `1 b9 h9 E+ }/ d* u% O
matlab的Regionprops详解
1 L( G9 |2 `8 e# X. Z& e5 l
% t& e3 r9 O( H9 ^  v& M8 ^: u9 `8 `/ B7 ^  u/ Z' _4 E  e
bwlabel函数
; [, c5 n: g6 V( m6 j2 A
8 R8 G- H! E5 a+ M% F) a2 R+ J8 A& U
L = bwlabel(BW,n)
9 O( H7 v6 ], w) ?返回一个和BW大小相同的L矩阵,包含了标记了BW中每个连通区域的类别标签,这些标签的值为1、2、num(连通区域的个数)。n的值为4或8,表示是按4连通寻找区域,还是8连通寻找,默认为8。. I. s+ ?4 [4 }7 O! E+ h. t
4连通或8连通是图像处理里的基本感念:而8连通,是说一个像素,如果和其他像素在上、下、左、右、左上角、左下角、右上角或右下角连接着,则认为他们是联通的;4连通是指,如果像素的位置在其他像素相邻的上、下、左或右,则认为他们是连接着的,连通的,在左上角、左下角、右上角或右下角连接,则不认为他们连通。请注意“或”字的含义,就是满足其中一个条件就认为是连通的。% i9 P: P* |/ Q, i
[L,num] = bwlabel(BW,n)这里num返回的就是BW中连通区域的个数。& k7 ^5 P. a: _- a) O9 A8 |
通俗的说,这个函数的作用是用来找这个二值图像中的连通区域的,对于不同的符合条件的连通区域(4连通,8连通)分别用不同的标号加以区别,结果保存在L这个矩阵里,而num里保存的是输入图像中连通区域的总数。7 S- p' R- t. o& W" x) r1 g

4 N4 @- u$ H7 D0 s# x
- P! b! x6 U: b2 \Regionprops函数& n4 z$ z* e; w( d8 U
% f* y- c1 B* X8 t

5 E) b- q& ]( d. s6 D  Q' ARegionprops:用途是get the properties of region,即用来度量图像区域属性的函数。$ L% Z# ^% ^8 F0 @- e2 {! a3 x6 Y
* X* F  d- P( ~1 c) T6 b3 ]# F
语法:STATS = regionprops(image,properties)' V$ y  O6 E) \5 P' ?" _

4 J6 Q& h6 s* ~4 K$ W% T' u7 [image是为传入的是bwlabel函数传出的,经过标记后的图像数据。
, [) ~% y( ^( R7 u% e3 J5 R; Y
0 w9 _7 a/ n# `. L7 Dproperties:这个则是你需要传入的参数。: l- o' |; B8 |
) ]1 d1 t2 \7 t" k4 A
比如我们需要求面积,则传入Area参数。
( M/ t6 s$ A4 e: Z
7 @+ i7 @% ~; C! Y$ x5 M& A, H# Z求周长,则传入Perimeter参数。/ S) R6 N4 x/ ]# W# ]5 I
' x# r5 i2 e* q& s4 w- q6 z. S
求离心率,则传入Eccentricity参数。. D6 F# M8 E$ H: `2 G5 R1 T
! @! Y% B: V$ Z6 y3 q
regionprops 函数具体有哪些参数可以参考Matlab官方文档。
+ l% [, N2 W. p2 `/ {+ V0 U
4 q$ r/ _) e% L' R  o5 D2 ?在Matlab右上角查询regionprops函数,点开,则会有最官方的使用方法和参数含义。: [6 @/ G* o2 u( b4 {6 M1 R9 X* _

# _+ H9 q! V& {, |0 {- T  t 9 [, k3 Y8 Z* [% r4 Q
9 [+ Z9 Q4 q- f; k
这个函数非常强大,不止这个教程中的三个功能。
, t: S, W8 l' h- w0 v6 }
/ |9 n" ^  [" C) b. N
/ V& S5 ~# B3 y! n
% V* j0 i$ {0 G5 y
; ?" |+ e/ G2 \% {9 n3 @8 K统计连通域代码:. F4 K; b% ]! G0 j- n$ n

* ?2 Q4 K" v* m$ Q1 R8 }
  • %先闭运算 再开运算
  • 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');7 ?. d& P) p9 V; O1 M
  
! `+ u2 r; P1 B# z( F6 k
( a# N" h, Q( T/ j* p标记图像各个图形,进行图形编号代码6 o2 e3 u: C. n

( H" W) K! x/ j% ?1 a
  • 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; ^) F$ s: e* W2 L4 {. z; P
/ o/ g2 `5 O' J3 S' M) |" v
运行结果图像:  x. S" N* s) V, j. }. X
; @' k( K7 A4 }

: I' S# @% j9 {2 h2 s
+ p8 o0 v9 @: J
0 v9 [* D2 L9 l' l" `; `$ C- X6 i3.计算周长,面积与离心率8 D. r( E+ N; W! _

# j' S/ i* s# Z2 d/ o+ s
, k+ q  [* n9 E9 V" h2 A+ w接上一次的题目:计算出图像左上角绿色方块的面积和周长,计算出右下角红色椭圆的离心率
5 x! H- D2 a; z/ Y; f; X; H
( D5 ]) T8 h* _6 _1 J! z: w​ 要计算出左上角和右下角图像的值,首先,你要先识别出那个图形,你才能对其进行计算。这里就需要使用到前面bwlabel函数标记的矩阵。
7 H4 U* }2 q& Y$ `9 p
, `/ ^6 i; e6 m: l& V # s6 o* V$ b, A$ R3 m
* e) D7 K; L" F* G  R
代码即:: c2 E8 f# q. k% z

) v: {- P% Y) d. o3 n. ^, F
  • image_part3 = (copy_mark_image == 3);. E8 _2 j" t& K) B/ D1 |
# I* S) [$ D* N
! M1 P4 \' K# D# ]2 l8 W1 k
根据标记的数值,来判断是不是那个区域,然后将那个标记的区域取出,并显示出来。; o2 G3 z2 ?9 Y" v0 Z

& u! F( q) D- B3 z$ v, U效果图:注意,使用regionprops函数计算周长和面积,计算的是白色区域的周长和面积。黑白颜色颠倒,那个计算出来的数值则不正确。
$ t9 |# J, d' B+ z
! D# E; V: B) @9 f  b; P2 a ' y+ C. V3 Y3 W5 c+ O

5 \$ d; Y8 {& k/ S' R! E  X; b/ S/ p3 D3 z1 @1 A) R( F
计算代码:. k: F: C$ k5 B6 e7 R6 O3 a' t

0 K9 j; t- o) Z1 b- A( p! o
  • 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);  V9 }' V4 L5 ]0 ~& G
   
+ x6 t1 ]7 V. n: @$ R/ [% a( z7 Q2 P" f3 j* ?) G8 I
计算结果将在matlab的命令行窗口打印出来:; P3 a+ L* k1 i3 Q8 V
$ `7 A, n& p' B/ l
round_area = 7044.000000   —— 周长
/ N: ]" H5 }$ g% D* ?s.Perimeter = 320.200000     ——面积% D1 |' X- ~; w/ D) j
oval.Eccentricity = 0.915874  ——离心率" c( p: x2 K6 x% i; l2 c

9 ?& l9 r& E: X2 e 3 E9 R, V) {# |  _. l" I2 a

  Q/ C1 [# v3 y! L7 j
: p( d" {' U$ g; }/ N. N' x

该用户从未签到

2#
发表于 2020-1-15 17:56 | 只看该作者
集Matlab的形状识别与计算图形周长、面积、圆周率
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

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

GMT+8, 2025-8-11 19:07 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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