|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
2 u M! z! S" r+ C1 k* D! G
1.二值化图像+ p" m$ l# F1 [$ [8 S
用于处理的图像,一般都是为二值图像。这里也不例外,因为要调用那些图像处理函数,传入的图像都是二值化后的图像。
! ^, [- L0 F; D o8 p, H1 |1 W, C5 `9 H* x& M
二值化操作代码:& W( Y/ G1 s$ {! J) ]! c. Y0 w
/ m! ]( y7 R* J1 {+ ^# o% Z% |/ p3 L3 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);" F' @; L( `7 T
" }' e8 J3 a$ R! n; {运行结果:
. d. _* `. E) x7 g' \
) @, c9 M0 \0 y& n( n
/ T2 w, {8 _8 |, ?; q E( s- U/ p- a
. g! f6 e. ^9 A
2.统计标注连通域
9 R2 p3 G) A0 U) v( R9 b3 ~, I- m$ S# h) D
参考网址:
5 Y. C& A8 h0 J! ]3 `! y% z5 X: ?2 v+ ~. T- R! V2 Y! H; K
Matlab中bwlabel函数的使用: | Z! S; r- }; R3 s) Y* _
; S9 } q+ G! j3 t) }7 ~0 lmatlab的Regionprops详解 Y* [( i$ m" }& T6 V( N! m
) K$ b2 z9 R# K& W
, Z. Z9 C; p/ r! S7 Sbwlabel函数
: C6 B: {* o) L. R \5 I8 w& V. a& r
- O/ m) t3 E. l8 R1 K9 TL = bwlabel(BW,n)
+ [, f. z: Y7 H/ A( d& n* z返回一个和BW大小相同的L矩阵,包含了标记了BW中每个连通区域的类别标签,这些标签的值为1、2、num(连通区域的个数)。n的值为4或8,表示是按4连通寻找区域,还是8连通寻找,默认为8。
3 T3 x) D$ D- D9 `* a. ?# ?# [4连通或8连通是图像处理里的基本感念:而8连通,是说一个像素,如果和其他像素在上、下、左、右、左上角、左下角、右上角或右下角连接着,则认为他们是联通的;4连通是指,如果像素的位置在其他像素相邻的上、下、左或右,则认为他们是连接着的,连通的,在左上角、左下角、右上角或右下角连接,则不认为他们连通。请注意“或”字的含义,就是满足其中一个条件就认为是连通的。3 a" E" A; [5 [6 B) E
[L,num] = bwlabel(BW,n)这里num返回的就是BW中连通区域的个数。% A/ b5 q+ H, ^7 f9 z5 u. {
通俗的说,这个函数的作用是用来找这个二值图像中的连通区域的,对于不同的符合条件的连通区域(4连通,8连通)分别用不同的标号加以区别,结果保存在L这个矩阵里,而num里保存的是输入图像中连通区域的总数。
0 B9 ?" B( z1 \3 t' w" \* f4 X- c0 t' y
7 ^; m/ S' g {$ Q
Regionprops函数
# d" L8 A- x+ }. l; i# m, z M. t/ D$ c/ R
: t2 }3 h% J1 k3 K0 ~9 N0 D* d; J
Regionprops:用途是get the properties of region,即用来度量图像区域属性的函数。& s- d2 O% J. P8 r2 K9 [) t
; ?' @% N9 g5 Z; C% K
语法:STATS = regionprops(image,properties)3 u4 x& n0 j) {. }( Q
- c3 D5 I2 p4 s6 n8 I: J4 `! I
image是为传入的是bwlabel函数传出的,经过标记后的图像数据。
+ K7 [" E4 _. h# w4 b( s
6 C; R8 h0 ]; C/ jproperties:这个则是你需要传入的参数。
; M9 Q9 {" p7 X: x6 J" X( ^, V3 |
( Y( n8 k# i0 l( E$ k, ^& Z比如我们需要求面积,则传入Area参数。/ P5 Y) Y* l& Y$ _8 S
* a" ^" ]5 k: W# n: R* @/ E) \0 J' i
求周长,则传入Perimeter参数。' z1 T# p! f& v* D5 d+ W8 ^5 t
/ y9 N0 J0 x6 q( U7 d _
求离心率,则传入Eccentricity参数。: x& Z: l; |6 } c' i8 v) U
% M1 Q% L2 r* ]/ sregionprops 函数具体有哪些参数可以参考Matlab官方文档。- N* w- ?6 T" G; w0 L! o/ X- I5 N0 A
8 V6 E& ? Z( H) H4 D+ f
在Matlab右上角查询regionprops函数,点开,则会有最官方的使用方法和参数含义。
& U5 A' [+ C d9 w# Q- }3 K/ e. a S2 c X0 O
2 n) ]9 r* L( J( ?
7 Q% x4 S' f" h这个函数非常强大,不止这个教程中的三个功能。3 r$ c# K& r4 _% M5 w
# g" U$ G2 [ p K. L6 l* \! @
e, v% O" G: L/ J3 W& R: s. i B
6 W. w! N6 f% D
4 q3 w4 m3 J5 }2 q, E. S# w# r统计连通域代码:
, c# i, A$ v: X3 ~ i0 ^/ I& \# ^* i0 n- 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');; \/ t2 p2 f: ^3 f5 g7 x4 z' @
6 Y; T" A3 Q$ t0 g. b
3 l. P% B0 a2 I7 O% J标记图像各个图形,进行图形编号代码( [2 A/ e) D( L
2 g" p* u% n) h- 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. B- J/ ?4 @' I% L2 T, r
& Z: d( O+ _' o! N运行结果图像:
* O* @; Y( I0 ~: U% k0 f2 Z2 ~2 L& v, A; ]! ~
" D' M& A* v. p1 W% B6 _
1 y2 H" a; D- i; l
( x5 T! u3 z+ W8 {- J3.计算周长,面积与离心率
$ } Y! o; s% v4 I# S" ^' h# e. Z# g/ P. t
+ i1 L! h6 f. U; {
接上一次的题目:计算出图像左上角绿色方块的面积和周长,计算出右下角红色椭圆的离心率' X! I% B% A3 R+ f3 F
# D1 J& ]. ?7 p, G8 W
要计算出左上角和右下角图像的值,首先,你要先识别出那个图形,你才能对其进行计算。这里就需要使用到前面bwlabel函数标记的矩阵。
4 D- `4 }* _4 k- s
& B7 U2 N: ]; c' W5 w
1 j: g7 l8 S/ M
0 |' I+ r) u: K! ~9 W- v2 ^$ ]代码即:5 a8 W6 t; _) V( S" X+ u
4 c8 P* ~- }, ~2 w& ]- image_part3 = (copy_mark_image == 3);
2 g; `% u' `- X- o( F$ y
5 u% ?2 d7 C- z; f% q) @3 j7 U
/ E$ V& _) q3 k9 Y( H1 c根据标记的数值,来判断是不是那个区域,然后将那个标记的区域取出,并显示出来。
* F, E1 v) H7 E& R) H
% o9 I) R2 p! C4 B3 ~& I2 K效果图:注意,使用regionprops函数计算周长和面积,计算的是白色区域的周长和面积。黑白颜色颠倒,那个计算出来的数值则不正确。
7 v+ ^$ e/ }+ A% z9 c
" _" ] \' }, n5 @4 P0 U4 ?1 W
2 q1 Z& ]6 ]; ~. f: ?, H# E
2 {* \. M5 _& ~3 ^+ Y
4 m% j m. X6 Z! C" B
计算代码:
' Z8 d! y* T. x3 ~& u) p& u/ Z/ G8 m5 j! B# B* B1 z% {
- 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 I% v" X1 y9 L, | c
- `# a/ |' a: C! N. i5 [% q9 o* }1 I' n* f
计算结果将在matlab的命令行窗口打印出来:3 s3 N+ T: \1 l- y r
1 O* ?5 X% A8 R8 ~. f3 [6 }
round_area = 7044.000000 —— 周长# r: m a" a0 ^
s.Perimeter = 320.200000 ——面积! }0 ?) O9 g7 t. R5 G1 T/ h
oval.Eccentricity = 0.915874 ——离心率
9 D& q( D4 }5 r3 r$ A+ ?& e7 J4 x9 s6 C
* ^$ D ^: l& W- h) y- T! Q
" X/ c: } G( N* L* K
& Z6 ]7 F( p/ \ |
|