找回密码
 注册
8月份电巢直播计划
查看: 249|回复: 1

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

: m4 A# Q- J6 ?" d0 _0 R1 e. S1.二值化图像
& O  @- V% T9 z. Y% ~0 A8 o5 {​ 用于处理的图像,一般都是为二值图像。这里也不例外,因为要调用那些图像处理函数,传入的图像都是二值化后的图像。. K, S: ?0 O6 R. b) B
5 Z; [( e3 p0 L* Y4 v/ R# K
二值化操作代码:8 T/ y; g- _6 Q6 R  G( a. P; G
0 y* j3 P* I% x% Q+ f
  • 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);
      Z$ x( X8 r2 K: `, ^
! {0 S$ k/ `0 `! Y2 j$ F' z
运行结果:
  @" E5 a1 i. H- W7 I# q; I- @6 h: ]
这是一篇关于集Matlab的形状识别-7.png . T" w8 ^6 r$ H/ p2 m! R
0 r6 @+ F0 o& r2 A6 ^3 C7 n

) e+ z& }7 y; r# Q' y/ a4 y1 Z3 y2.统计标注连通域
6 g1 Z9 x7 B8 t* b& G9 _+ ~/ C+ O
" L9 a) d5 j0 b  M/ z3 C0 `4 h. A参考网址:+ @3 S& P, P  p) i$ C

# o3 }5 [. e3 R: E3 {9 d) cMatlab中bwlabel函数的使用
( \$ H6 M0 [. c7 \3 `. b/ t% s4 h' k2 z" m, v" m
matlab的Regionprops详解, t9 e; P' @6 k* Z
  s$ U" D( n0 V4 j
1 [+ _- h  ]6 R  O4 c' h+ b! \* t0 d
bwlabel函数
4 w! |) J8 C9 r4 s! T* N
$ ^/ P* g  R2 @. X& `4 B% k, q1 L' @
L = bwlabel(BW,n): G0 M9 |' M0 R7 v) T8 P/ A& P9 H
返回一个和BW大小相同的L矩阵,包含了标记了BW中每个连通区域的类别标签,这些标签的值为1、2、num(连通区域的个数)。n的值为4或8,表示是按4连通寻找区域,还是8连通寻找,默认为8。
. Z' M- k" o8 C) S! _9 q; K& c4连通或8连通是图像处理里的基本感念:而8连通,是说一个像素,如果和其他像素在上、下、左、右、左上角、左下角、右上角或右下角连接着,则认为他们是联通的;4连通是指,如果像素的位置在其他像素相邻的上、下、左或右,则认为他们是连接着的,连通的,在左上角、左下角、右上角或右下角连接,则不认为他们连通。请注意“或”字的含义,就是满足其中一个条件就认为是连通的。
2 M5 B* E# E/ e2 J[L,num] = bwlabel(BW,n)这里num返回的就是BW中连通区域的个数。) Y, E8 m5 a4 _( G  u
通俗的说,这个函数的作用是用来找这个二值图像中的连通区域的,对于不同的符合条件的连通区域(4连通,8连通)分别用不同的标号加以区别,结果保存在L这个矩阵里,而num里保存的是输入图像中连通区域的总数。
& a: `* S4 h% z9 D* I+ {/ }0 \
5 R1 c; O1 [! I' b( _! _, ^0 `
4 B5 N9 D/ R8 ]* r) a9 jRegionprops函数
2 X; S* g9 @6 M+ ]( F, N
& s' `" @3 M# ^, a3 Y# Q$ c5 u; [  J! ~$ }) Q8 C! J3 ]9 u
Regionprops:用途是get the properties of region,即用来度量图像区域属性的函数。9 Q, V$ p$ B3 W
3 H: O7 l; k! {# R; q1 w: _( n
语法:STATS = regionprops(image,properties)
" v6 M1 G# ?+ s$ F& L9 \1 D
) D$ b( W& a. g; p) Fimage是为传入的是bwlabel函数传出的,经过标记后的图像数据。. r1 j1 ]1 O8 Y8 |' h2 p+ j0 `
) X% u' V) H# V: z
properties:这个则是你需要传入的参数。
2 @/ G1 v+ t5 c3 C( `5 _
& T1 E3 B! k" |比如我们需要求面积,则传入Area参数。9 D' C9 t' Q$ l# z
( |* W* U! E4 p: @3 b, U! C6 X( [
求周长,则传入Perimeter参数。: h, X- a( [/ d; D* y3 m7 C

$ H% l* F3 Y" d) x# S$ g7 n求离心率,则传入Eccentricity参数。
2 k  @* M1 L6 V" q; l+ H" N! w3 I
: p; Q4 I9 @/ `& n1 i) u/ Wregionprops 函数具体有哪些参数可以参考Matlab官方文档。, q) W# l) I$ t  M7 v$ F5 z
( ]3 M& g2 K; `/ o9 ~
在Matlab右上角查询regionprops函数,点开,则会有最官方的使用方法和参数含义。) U1 E& I1 P: y4 L* m! G+ d
4 g1 h, S- c4 k
这是一篇关于集Matlab的形状识别-6.png
; v8 s3 W( v4 l& N( ]% ^/ f" d6 r! P; A* U& X' [  N
这个函数非常强大,不止这个教程中的三个功能。
1 [% k2 B' U' h, g' k, X
; P4 `+ e7 b# j' G5 P' w; u/ i$ F 这是一篇关于集Matlab的形状识别-5.png / b5 A2 _( k+ W/ k1 z* K, D+ t, [

. r# j2 v, {: Y: S9 V6 \; q# |4 ?2 l  `
统计连通域代码:
3 X/ \$ O& ]6 L& E% o* C. \  l, ~7 _; U/ s8 I- @9 a
  • %先闭运算 再开运算
  • 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');' }' a; J9 F7 V$ Q
  - X3 }; d; z# B! h+ N
& _' `/ a0 ^" D8 d. t
标记图像各个图形,进行图形编号代码! F6 V' |3 Y! L- M
7 e" w$ d- l, M' O1 T. Y* S
  • 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+ x! a# h* V+ L2 ~
/ e2 _0 U. S  b+ N0 h- [9 z
运行结果图像:
- e7 S! ?6 V9 G: I7 H! H! I: @( x3 ~* @! B: F. i, c' l
这是一篇关于集Matlab的形状识别-4.png - h; q% U! |$ a* e
5 `, |9 z% e' |

+ m( V0 z: k* b$ S' q8 a- ]3.计算周长,面积与离心率) K, J1 S% W. L
1 K9 j  }1 H/ b7 E/ k5 z. O; |
3 a. N( W: Q5 ~, d0 w# |
接上一次的题目:计算出图像左上角绿色方块的面积和周长,计算出右下角红色椭圆的离心率7 s* z& w- z) }) T7 m6 W  Z

1 P( O" ?, c) g- N* w​ 要计算出左上角和右下角图像的值,首先,你要先识别出那个图形,你才能对其进行计算。这里就需要使用到前面bwlabel函数标记的矩阵。
, L" C# J) Q$ M, h1 T5 b2 P
) Y8 P8 f2 i8 ?( b/ ~* I. | 这是一篇关于集Matlab的形状识别-3.png
( m8 ^7 ]0 L" s: y' W  z! p0 x) e: X. r  u
代码即:
  [  C9 O4 {3 |- d" S
/ ^, E9 x  `+ z8 w$ L
  • image_part3 = (copy_mark_image == 3);
    : k! @! h9 w% z. }0 w/ a/ s

7 w- o5 X$ ~) d9 ~* i% n( @7 B* D4 _% k9 {5 w: Z
根据标记的数值,来判断是不是那个区域,然后将那个标记的区域取出,并显示出来。
5 t3 N8 f0 n. W- W( \" @/ J; ^2 P% t5 v
效果图:注意,使用regionprops函数计算周长和面积,计算的是白色区域的周长和面积。黑白颜色颠倒,那个计算出来的数值则不正确。( ~) ^9 y/ d0 L) c
, O' H' P7 M  }0 A5 V0 r
这是一篇关于集Matlab的形状识别-2.png # F" r5 t/ B9 l5 j' I# ]* d6 I
8 C0 v. M( ^9 Y

, H: c" t' Q6 s+ |) B8 r; _. G3 R计算代码:$ S4 z! C: m. T1 I- R

* \2 X2 a  u# @3 }! R, s$ G- o9 |! Q
  • 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);
    2 |2 ]3 K. W& Q9 P- ]) j/ e
    $ M, [1 l) l6 T# p- v; w; p) ^

# L( d8 Y$ ?) ^$ Y: e+ _计算结果将在matlab的命令行窗口打印出来:
: R  T% C! r6 [: j! s0 k$ X' I
# L) l% o; ^4 Y& Y! |/ e/ E' xround_area = 7044.000000   —— 周长
9 B: l7 J3 i, G9 Ks.Perimeter = 320.200000     ——面积1 Q, i1 I" J  e6 U
oval.Eccentricity = 0.915874  ——离心率6 n* o$ c) u$ D. a
2 @. X2 y7 L- b0 ~
这是一篇关于集Matlab的形状识别-1.png
3 K( e+ Z: B: T9 C6 j/ q/ v
& J* ]0 [8 ?% E# S& X2 h
8 \; P! \4 ^$ B2 I

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2020-8-11 08:06 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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