From 8c9777b9677d943f335d87cccb12d89e17614b96 Mon Sep 17 00:00:00 2001 From: Vincent Albufera Date: Wed, 21 Mar 2012 14:27:12 +0100 Subject: [PATCH 1/3] Addition of examples in the harris and peak local max function --- doc/examples/plot_harris.py | 19 +++++++-- doc/examples/plot_peak_local_max.py | 55 ++++++++++++++++++++++++ skimage/data/__init__.py | 5 +++ skimage/data/text.png | Bin 0 -> 71884 bytes skimage/feature/harris.py | 22 ++++++++++ skimage/feature/peak.py | 63 ++++++++++++++++++++++++++++ 6 files changed, 161 insertions(+), 3 deletions(-) create mode 100644 doc/examples/plot_peak_local_max.py create mode 100644 skimage/data/text.png diff --git a/doc/examples/plot_harris.py b/doc/examples/plot_harris.py index 0e0222cb..229be6e5 100644 --- a/doc/examples/plot_harris.py +++ b/doc/examples/plot_harris.py @@ -20,15 +20,28 @@ def plot_harris_points(image, filtered_coords): """ plots corners found in image""" plt.plot() - plt.imshow(image) + plt.imshow(image, cmap=plt.cm.gray) plt.plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], - 'b.') + 'r.') plt.axis('off') plt.show() +# display results +plt.figure(figsize=(8, 6)) im = img_as_float(data.lena()) -filtered_coords = harris(im, min_distance=6) +im2 = img_as_float(data.text()) + +filtered_coords = harris(im, min_distance=4) + +plt.subplot(121) plot_harris_points(im, filtered_coords) +filtered_coords = harris(im2, min_distance=4) + +plt.subplot(122) +plot_harris_points(im2, filtered_coords) + +plt.subplots_adjust(wspace=0.02, hspace=0.02, top=0.9, + bottom=0.02, left=0.02, right=0.98) diff --git a/doc/examples/plot_peak_local_max.py b/doc/examples/plot_peak_local_max.py new file mode 100644 index 00000000..0c462303 --- /dev/null +++ b/doc/examples/plot_peak_local_max.py @@ -0,0 +1,55 @@ +""" +=============================================================================== +Peak local maximum +=============================================================================== + +The peak local maximum return coordinates of peaks in a image. The maximum +filter is used for finding the maximum peaks in the image. It dilates the +original image and is used within peak local max function to find the +coordinates of maximum peaks, comparing the dilated image with the original. +Then, the peak local max function returns the coordinates of points where +image = dilated image. + +""" +from scipy import ndimage +import matplotlib.pyplot as plt +import numpy as np +from skimage.feature import peak_local_max +from skimage import data, img_as_float + +im = img_as_float(data.coins()) +image = im.copy() + +# The image_max is the dilation of im with a 20*20 structuring element +# It is used within peak_local_max function +image_max = ndimage.maximum_filter(image, size=20, mode='constant') + +# Comparison between image_max and im to find the coordinates of maximum peaks +coordinates = peak_local_max(im, min_distance = 20) + +# display results +plt.figure(figsize=(8, 3)) +plt.subplot(131) +plt.imshow(im, cmap=plt.cm.gray) +plt.axis('off') +plt.title('Original') + +plt.subplot(132) +plt.imshow(image_max, cmap=plt.cm.gray) +plt.axis('off') +plt.title('Maximum filter') + +plt.subplot(133) +plt.imshow(im, cmap=plt.cm.gray) +a, b = im.shape +plt.plot([p[1] for p in coordinates],[p[0] for p in coordinates],'r.') +plt.xlim(0,b) +plt.ylim(a,0) +plt.axis('off') +plt.title('Peak local max') + +plt.subplots_adjust(wspace=0.02, hspace=0.02, top=0.9, + bottom=0.02, left=0.02, right=0.98) + +plt.show() + diff --git a/skimage/data/__init__.py b/skimage/data/__init__.py index c5159092..bbef4f9b 100644 --- a/skimage/data/__init__.py +++ b/skimage/data/__init__.py @@ -43,6 +43,11 @@ def lena(): """ return load("lena.png") + +def text(): + """ Gray-level "text" image used for corner detection""" + + return load("text.png") def checkerboard(): """Checkerboard image. diff --git a/skimage/data/text.png b/skimage/data/text.png new file mode 100644 index 0000000000000000000000000000000000000000..7135075b05e0f7b435c521f5b96a3455c8f71609 GIT binary patch literal 71884 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

SS|>C5u=Cw+I5o{BgW&Ep zO%WRw2`6Yhd*!{3nW+)9F> zodn9(i|T;T$0~enCF*7{pO;6;k=rH_k<@wpS>JHajy5@O=@o6SElXazYckP+l0qiAU*i*AZZlLN-V`Inkgt6k1x#F%gO z)YW>0FO&?^C@d`Kw#D&;8SiN7qoPqQ`)@WC5#CC6i->8gyr1YHF0gcxg07kl1eP$7 z1;l|aoeb1eA{y@Mr?x}}Zfqc_O;WO#=v$xlKmADwo7vQ(N~nk3$WjwQx4l3ewHJ?9 zNweUaQr@|!q!$WW8nPmvG!j&uNdhQON9zytgmI05Ch!Ufe$hanHX89~^h86BotTcFt5sE|c6Uj12cR!K5xT(Agd+&Xvzr>OOFi&W_e`A>z+$Z()b zLLzHE;^vO$+R;LInY2YXmCa(N-v_oMM;LFK$of=ef5coY{`F>XmO;9s_cR$33eE)-@6Mp?j%$#pW@nomsyOjKdWJYYYo)0nvsLf#AkUMobeou zuAyZK-qLANEaS;qY8rG3waB3wDDh$qT1$GV>^?AI!IYv<&@Fn_lPtNYq|m!KJwq*Q z47H2XGj(BO30S8(zLMK6d`);Qr;^Zf*r>~sUbpa?B6k3)t7Vu!lmwuX;fzjI5{5cCZ0*Js>n;E)oF7tM zpuSltt$BKHz}!@Wsdh_>d*Z=U(7tSDsZpz2%ePoyPf4m+&EvLRwGnT{O}Cu13j}jf zPPkbHJ}M*GNHwi7<{M~G163)*!+Y=0#t60UIC$+mP_yulz}5{P`>7|MJ@V>$@`p_< zu;d}I68ZxoQz~L->VRyVowHG3q}M(!VW6&Co9@JWE;Wr{jX0XPiZo6!OSpidtv$@qr? zoH~Ke=uRQfHwC2XA(K*>B+$6TK!~KNH(vhIqr^>0n?=DZ#556Q;3=O?4Z4I&>J^CW zXC@N@*v6p`wwJT7%CHVKkh#^*T5*yp!dY5}O+(oE3|;|1;V}lwq0W6SKyj5yEH2@< zI)B!%d)3wvZsMV56c5VOHkMjpbhQb+&}n^@>4JW1QV%*=r#opYs$^$2OZM_o$vbTb zronVO0tni45naVnEi||aTZQlv`Y9@hjKCBLtt5~w)nfS-L+?vKS-a!v`tLmH)Q1!( zjqFTQ*irwn1AYabcCxFTNgC{-F;)pjS~0Gk6?L?+mSl3*?Mny@@CE07@NDPf3uJPG;fhjC*+wP-3Rw5#THJvoduId1<0klBz0x4>a3fiYruYz-rU7 z#2>>lQHcI@l6vFa^r4KdHsrZgH;%%ikbs69^iB74SVp5epGcEu_X^KZyfU2;l)z0- z(Lem~!=7~J=V}P$9M}y&yB*319S~Bqy7LPGV+LWU&&6UGs)ES6MBf1V={Zi)YW68Z z8NLSv<|YX_2qWswD@GuQAAPa_sz6xf(NmξuBPL#Jv0e$3E7P#MYaP|gx`MF+*%8(B5_EP3 zp29mS3uil-4G$=-y;|GCdByMii7}EazhOjdzGLMrnjoq$f^cd7$U16og97&TFn$O)%SoWHc@$K zNI^T3kpMmn0{pSk?gG<5jec|f$Y3=`a$xuHp0dEVK-1&_>EY2f8sCLSY`u z)p|~gpe=}l2}7hNu35vMSTx+D)#YKU;dkbOQqA&t_(~AUiJsI8eDDulMFCPTKHop3 z>6kkzrFj(~aUKJ{aPOQm-F1G;qd>4SR%)FuQ$s5=JUu}Z)B@0z1l;o^`m8e?i!Mq1 z)F0zjY)+|?#F7$JteIPrB4y>Ri(! zCX^7PVJeWCL86&{qS9=s#6wqrU9h@ZK{nIOgwshlxJ4?fSYjsYHr2o-07U4SpbXQX zbby;N-HFjsre%{Y><&*w0~S3&GfluZx9&;V%&+;X^$8ygnJGOPl9Gl#V_=QTn+2Y7 z=W2MiOtUzOA4&d8l4ZC%z+G-_H=p-aP^&!bL9F42ir944YV0qy@Z6TS=}SBI*q1!xBc(Pr%jr8CyfLzSoQNJPadPeHK;THd8@ zY=zY0dsqzTY=Te&2%%At6U*%!(P=--yw@QY*>q*^1A5a)vb#$gaC$VtT*Oh!~ z-ZBg5A5WpCl)iC+35t#phF%T}dvDK%ilT5y1M7;!J)pTh{H{Y z$uW1!R)I_eE+t2+~u)db>NcEv@f=g!F zTMdaXm>YfxnP)BTU2|HmFto)D!KKCfEOVjyxrAB`(6E#IJXowPhEYSV3al!ltu;h6 z&4H2~F&%QZyxU28k>O?$dOH<81r>m{Ocwjj9uflDGA)E+B4Tpp)j8PBaaXr@&s6x~ zRI_6@RtbC@_|kjmDNLs5u!Gu_?-E-AptVv}?kdwyX21qInJRZ4&8g0Y393I;ij$xBgaC27}Uow+d?N?0WXcsi0{u83;$2&2JY zw=)JOo7wUmEz?(^=|&!{K2u0qYD8A{DG!b6jPjg)dXj$)CELW$zxqg3k4B|7J?~Mz zlSL}Nc3R1NPjO6&*O2RZb20Zbw1Ry|CE^J>0pjBHxw@uX98LXT5OX$zXHX(;m`0KC zx*^j^P`fUf1#w0hea5R|RIT9qTw%w~Fzr%PZ-5ynrI?MEXp(yWRB~YAbBXv zlp3A+t$U_b0{RrmET29YfC44_S|!y9**e0OfiF6E0WQ^B39#sb2EeWRVL=5(!l^!W zuir>z748KgFHm|YB#TNj(#T;Yo17ABNTQTwERP}r)!feo?1U(gx0sybBR^fk>1g*?2x?%EsqcHl=Q%9|A2AXXOwc#65ctEwn>0gozr^Zt_*al1O zIMRM5-dY(U5(>d1i87S{Zv9btXDTLit!8w%l>Uj7r^FndgnCp1vZ*8+=sdheMIkR^ zfR)KgwW>mAD#HRR-;H$uW36yHU}GV+)pI{S_2SjWDs12cvd$yUOCt_t=wT8tDdRpm zuThq^+u^uW6WyK)oxGLSIbu2hS6sq9mq{fURWsWqkVqxC z@(ym_8EI9=Ltp_)e#L8xZ6u~Yt@(JGt@WSKHs2GHdKzSdnpOZlh$)Qd*eoEPP!)Qn zgk2ReaN+#~pa|pcs>~1>fSPNH2R9SZiKJZxSfnjeG9w~@jtS6`n$1RE&-3t824zy1 zLz!;uE_lMNn%OF`49y|oXP$*HBX~w7*%wF!YfJOK*kxLA7GQ}&4J8qvZl?n$7;3IE z7gfM}d9FjqQ*~uZ+`FpD5sZ#T@#mzFKJDqE)F`*Jx37FnuB)kIt(XI}wEpo+0My2g zh~6ch9~%{V!$gww<1TBA%atRtFdY`x+Iz8lTTQX*_1fZByW*a zy8wN|pn)gxD;C~gl~=z%x>X9P5toK)p1zbYaaP0$_Ce_OU{%MHFzR+{iK{`hZ`0c zq36jk9q`?}1VX$a24+(wm9G-2NN-EYITP@{azU;49a;nNmM3o{Ai(yP%q)%KeLHrw zxjykU9l#&~Akb5W!mv=ZlF<>)^>cRprf@Wg!cET%0IpZ2j7W_V0M_mj;AmjbMmrl- z29vNFxsN#Hfnz9~z|u)Sr<5`-mGSe0PFOkIbaf}OPT@TCRCpDtib()yKLgDcBJy>; za$dj{iAb}3*fpz&R)huOyFNFU;?ijvQ{@SytAgm#JkVybGaTUX!h|`x3kE^hign~~ zl04uzkx@9zHW+~X38pZe@uZ!!oNX{mKk*uHTrmc~656?1w0LewRcGaKXP~T;%%Fjw z{8q%sHqT1gbfC_hoQU?}?PTby z+nq1a5#S3lFqk?i4^L?eHDh!zx2uj)dA9&iz)CYYj4Ob4YNM^FzEWs9C#epM(z!B< z0dHNQ?rW)&AgN*dwo{7e!%jX-kmiBE!6Gb!`sm~t!q+!on(m6bDKsLv$h}*bg!71l zm|b&%f<^J_%pY2;DM(L`dvLn-&5o^A`4UVzoujMUfDg=Z+BH|EdPuhZS2;O!iBgv5 zAsG^dK(7*GdCNnr9rZB%+%lR*@5|d0s2+T1M8|5b4zE!Uoc5C|ZA8t2w;|JnCS_nGN~(28-7Qd(W~$_t zVdF$&J+5*j3}yg2$)gx409{=mB18DX_7uspuJyCoPaiT-pT~_ATF|F~=|dGZE}6z? zakDpr`$CO>KGBdX+$c_$P>bCX3izC;_q$TCAUjm`7+?M2JWS0th(z2Yp}-WLmIk1< z;7#<%X=hZm*(}qH3%W}{0BeJlw1Q#-Q)sSoXNIbTUttrZ!UjIaY&J_x0ov$$CB-OF z7B4ly7Mf6|hB~9IQbx_R_wnLrjsN1)dPwqYrV93}nTd^oLPGVPMx?T$cFSA||H5_E@G%mBHch&CH(Mi+4)GwQ9y{E91Lu z>AnA1)}mF!p`T&B0AU708phRNnW8D57cp&fYiD!ykQSb+Fud#H2;&tjn8L~r=D27e z$Wenlgc00Cin~O`>mh!D?opj?pTS@>CKu6w#V8B~Sd>lmA!8*wj{x$l)0Qf?DhlK1 z4;yQk%}CSXv-63!r!`DXLx$-URzs=!b%{=E2pi(YbjbkM5XGj4xPu82TGdc_0f*qJ z1V+nrve}`o*`fc;)3#5>nG?;wcG9Y@*P`(N>z)m#VtsA4k6TAS+h_L`EA}#2r+dE2 zm=LNnM#etPEQZMQ@s8pE+>_huBuHIIK2k{^fa$PRou*rbWwc_(=>SVNOeiI(L~3Vv6hbT5x+4In&w7;JHsq<1yIbEUWy`V zJjX&nqp!dMUvMLFLvHmh9auC zUa;8D^tb}H>V(*%oK~zlHaEUw-)#BUwYjhOX3P9-3ir8jhdjisGTNZ`ia#A`w! zN{@#QK+y+U?mXiJyMVGjj8K%RA-7a)QQnYUSApHBkSU%;{iXl`NzoG#VQQtM zCv0`ri)GV53O3(hAiBqkFFLER2{JpTgNgECNT>iMg-k8eft+hv>VM}2qgiPWS_tZc ze*fgMz@;Iy;8THIZvfh|PbDLjp)h^cPX@wXv`%x99$pzzz(hkJ`4S<(%FX6t2!X|t z^Of9NVX)F%D@=JLldF50Gxc*P`TNeC zRO3R0u%%M<>$F;KWRBIqUi9^y|ljq^{qU0aaZ}7pBrHl!(&BkOb?k^4J8d4Qqm9{ z?8YjrhQ=Ol#`63(W8di@fBqk!&kpO4p13-s-c0F+A=Bq23S*AAWFg2L7)7Ey0vbD_ zUbky8G)!zWy+@9G;@6j3Q>0jD=32gBJm~D9r2_ekwtGW_8l^u=4SXX4j$@tTadV`+ zkyZ@qndPCC^Z2Hyd_1&b&{hF1lf=qTuR2L+v`G2E6F{lFDMlUiYAR$nC-QcCg}bY& zcmkuKt`ZMtiih~rFKe~^=s&)c`e`M-+0h^HUHz+^IyGgU0Er3t-+#?c(~|8W#swR4Svl6biok@rKm+Vh9aJXbu9EDq{H!+kV{cq; zh3#oJo_x5kg~PQ*p8YgJ^;B4=;SMB1fxCo<5(i_jqTkP2^rn1ffOSS3G5{aV6{>q# zC{ffk02vE-y}pnBo9lkalg$ zaZfT?$M;D${}jOg1;|QE#f)B-&qUiJ_NBXSsZOy4D;ty#amd*KnVu<_V8{D92{L5J zv%3aBFci5H!VAx-4F?H5>3}(^Dq(~^@NoDq76mcsz-IPzgcG|y&ntIh`8k7m!78V6 za}Tt1Yq;|e$u0X0I&-U*HA|jfhZ>je0Q3$(?*Q};K<@zb(NO#U89>1;SRJ1l=^Lv$sVwRg zY?tA;p*7f6+nLar5rKZzmIyabVtXf7;J?cTvmQ#qV$jBt@89M&Iz$ z3RFoe0~WB_p=*`X|B~|`ggWEf2UW`-3X8D6&Y+g+#6YXlGHV^cUq)ND#DQ^GP?IW8 zyye&blg4s!IPVxJMlh#ZJ|9~T?G&LQbyYNgJ8+T_HJj;-W%LNCXK`#d;nCfK$)YM0 zl34V_6eDqrXi;F7^kgK|xRAkyEJK)#u9H-S3^B^_(D6RAJo=do{WKkfPYLTVhD)7F zG(pq4K>?N*ome8MMUjnAfP#si+*ONefL5DFHwrJXX`OF$Nj~xV?se;a*eFpaIvjkO zj61V9PceF}BW!6sw3U`@zvY+W&Vq>o1)KHF7bP)4M0$&dR;@Fpp#EP!s9Z}6VWw)L zX1G}r0h#8?IIm1cnt|Q}&;?E9HNhsE8x7ZDcUiL+YX_s0GU-^J_w2Df^lIqFnxo2R z2iAu|<1Qr#n^YcAwx}OyM&J`%p_aFXO6;LN)VDgB22>T%Z*<&4KeuG2Kc0FK4`yJZ zd!Ts&C~FjlmfXT!2_$u1n6_!7wG2!et~u!{Ej(RUl{4DP2;3MI(6I_;V_{2Ujhb4| zd4TLjK~d^$1-iZNu}`SSoCbVd6_rD-#hALm*z}5-vDI3qRMl^P_A{UPOjjEPy)QLW z&1O)QL$zpC`MP9X&yrsmU9x^xD+3f7NNJe|J?tmPL$^2Mb9)KX+;ucl{4`g+2j)1% znl{BWlg?{eJ+*j-g!P}H4#Al#4X-wnauOmE>kWdRdP2}|chS2JaRyyuAeNz+!te6ZH1kcO|(@?%SR)?gt(gYLN|M#IXU}RQl3Z~VDW5@~r`X-XqL$-&6 zcHsmm8U`%r#EMbDYVW*Rq!aVBl!gxnF$8Cls4tDQ`D4i=>}w&(9(@j{70fN60-Du7 zt+iZ|6hhu`6I`~+8RabBGYxs0?2r+}fXiNHpem>&xqSM4gH$$$@{D-WdBz0)w{d9{i$A@fS?hETPfC)6{|=DV7=hYM(^ z*K|~d#+YQGjF2C{x45mRC<>Z$_t4}@(LWin$XSH?$9D+bq^GXH+nI<@~Q z*hty79kU7p2$l)QIdzhuCx+AcEo9Sq%rwz$6G@blVwiU`jx9pQ(F>!f=2|2%4svDe zPz}3fbZ_PLr!#2_905;I6*!t`vonF8&d+Ru8v?Hw-Z#k%0V%-NN$2FW+tEBiH(<&s zt_fWt@H#n%I=G}uBm=}L7(WUJRALn847${@lq?9a=&Y*^&0tF) zs7u+qCo5uUZPvGM+@?tHiA6};Vrl~>9ScJ|U9Kvk1IK0RJpT>EuK!ey(oiEjYg)x= zg9gTF`i1ahU0n=mqouOac~TRmwoY_=4RPSrnX-D{+;+KtpXsYkq*HvvfMF=;M+8vx zV*i%&d-T1np`!K3W=I+e`yvju4;;+|@@O%k$*986)9^cKlL0}-L3j~;cBv6DEi9wN z6`>&vvP7_iHsB~Tf5TKLO3JD&ib!14i!hTFwMM3xBDEeFhsEHdYMXer=dnR7awp-P zCaOevl(SBn<(e?jG?KqWyO>1Q2&thqqM@IRVTLr5;BWjC)(PB1_Z>aMUt3A9=@Y)S z$Jh#we?ydPfl--(&UA7PfNX(I#h4SVCTdCOK-D`kQM`d-xU_l4da8DTB(bom#sy?e z3JK6aJz+)UIN+vTjtEy3&8(dm<^kHnRl9p(<=FMA4;?E^zQ9SsD^< zcqNQOn&Qbf4?LH5mMYH+`F#ZLW|NZH|u{QN)kc7>b+R9u~h+$kEs#S^t zDr0u>T2ysSpIYOjp!Q?QqrVXC95gzg>#7``--M9CGKAhu>zW=(!h>- zP}f0xGBMb+v}2QH!KcVIOpIOnWQl!?5>-s*2kiT4YY3OD8x?b&Awj4r zR8>j7la+UGRiPe4RMQ$N!_rd09?UE=^g-Ongn3Xk-jc*<6}6j}0^E$B#Gpn$>xpUY z45+1!Y{rsST{`u6Mlxi?AK9vspiOVtRh0{(XGpr*U8dMrI_e%u$fq(1mAKuF#*47b zq6nul-6ab15OD!lZZbC7RCeBwOQ5O>r`t3cICdV~^G}0vA~knroV#@w95k)wohzMJ zNGwJ~dlklQnGg5L@YYq}%gR=gW1H~ht9IZ;u&3}(9VpK>OVuf(yt$}0YoL}*)V~@` z1lv@VHPbRQ5FmnM>Opl4jSiGCiE4v)1VVo#nm?s-l9Egxs9(o9R6lhC1i^|7(09#! zye15_j9viRRGN$0swAgU>PEYQ!At1jqXb2Ryy>rfy0YZE9*;DW>g-_r~UJ%br;7 z4Wd$4{nuIKkv1??yE^buz9Eajy|7fu!+2TVlBEa^$=zKHhU}_jRiUmP8|;=@g3O2^ zxizR15n9zfCP(f1nJP?c=^v;~2>pyTa6iPWat1$joGz-fR=OlZq*FoII)nEUdg{gy z{4ra;{$+3cc}-A3c*okgE0Ra?K;+bb^@0zYFf(9mGtQ~F&I~UqRud5i|717-Ei`HN z8I08{6G0(~6sj&9nSycTgSqn1lY}kKaGaf)0=T-l?k8b#2K7(@7zz=Xz=X-lc1cxi zq4U%X`a7dA&<7c&)e$*0Ox-Z!Tn=5D?<9GvpJo%^@BC(8{pxWqC1lIUjUn)q^M7vH zy+&=)Z^5PW6a$P>Y`WnmebE2u3HcaZLgO2TLd{Xem^pidWBbxR1k*7cn8ks05oDI)u0Z3;I3cU=RmNmFae%NWMS#%Rr@G3zeb^>DtVepW`{UlX`UXEwmjlL-ZwjTm^vxOpa4VUtT@ zBw(UtMh4-?3IjMNl_6(MrwN{xr+6j>p7Jhpx*8&O(l`OsCB3RSt()%7RMLp}02#)9 zE1eihuiz5UfG|+VRf94?6W}IGaF!0BL^;>ItdAKLlH*3%tg*0*w7Ri(OT~P8#Zgv z^=6TAHoTy%Vf4I_7g~Eoz219tt19~>VX(P`Hubs8Ff&?Rs`u$#rg z3--*qX6mOcLF$eex3PeGRXM{GU|3dTd)i`soFh&K;lpE;MVX5ho1vVH8;=Qmp$ZHuKqzHq)swjxp$1Gq4CnGj8_{>@xTw!WHOz){bLdm2-nW^ro72_&rg-3UwJX3Mv| zRvc&soo%MqZ~rtVLW(UmJYN#@PiCUlzLDco&D34HIHuTb0E$lHr^Gu%;wP)4 z7*wldH=jDOPX%afiP_XWipmjEp>!h*_3hDp2?1Lnw90b{>e)O#7MEZ5>pD+|S*bZ4 z10A#tv-D*8VAj@WK+G<%S2g1ql1r?k)(PqyX=Ua`_(IHsB*|^(Ctd)`Pj^(Nlc`4v zmJs?02TiCgrU57+PZKmmXztZv1%{z!XR=jTPrx^eaDJiymxCQ5MNPVwAyddoRu8RH z^U#^X)PGMhaUN(;Rr#E=b<)%$Bnc3$Y>E;Zj)p4iJ6ql@uDlOm;zPuH4dHcB#6bjf zt30Kd{Tp8Wo;I5al9~Z@FGV4s>gf!BWwOm;mDkHWL+Ty~_7GNadMVs2LXU4oHggv( zThu*GaGv!uXp2-fq=3~5X|KCxGaeGmW*}6>ABqMsSZ{ z(t!Q!j0mywcnS;TD(iNWQTGZBqSfB|k3{<)mNja!E0%oxM=;t`JIB^<+Hq6Sr_iR+BMl?Gw8xOjpn zhE|i$y2OY~rAl;c01A;cjTe)TQK;WlGE~F5q-o}c`OdOT!I>uNO70D`>5`8z!x|5e zNz;V62hB}?>K>BFqs%=p3L3(fC_o?pw0e}E^DuA_#@tT+0iakGsGZXV2y{#uO!FD* zzsk)*u;4MK7?|DZl*B);u658{svC&~pPf6TpS(zwUw7fj0{UuTSbpjR_gKl{V;L$4 zw$C}%Z^EKUC0n0?MIB9>>vSMuGrcE}+W+!xo6xXD#4Kb z_Y9_c{eSAtXGj&c*a5H2kXS%HW16@sEjj(#@kB5^3G9_gf_)TjhBlgucm50y9TT|zf1W+Gs5 z=_D`eX>^^hj0`_-im3#z-bsxDbPKyoh2>O6c|ubO&7%?^p3?hCbGQ@FfmUs`4bJG5 zyBG{KN#I5&uLBW>0{LW{uPwiCBe_@i>X-`aUN@2z)y1tSFuOH6F3KzzGSnMzC?=_) zdpTY33K6K~{4vn!IN<|C-Q!?n6yRUYkuq#hep2EKyObsv2!pD?221{Kp%VIRQ0nBH zyK0(X*%_hEP4aLYfT>pl^C9OmjdCKJBI{~HM5;=>NJG??@Ygr$$JR77-7tyHqfq@c z3qqDuBDnBLe1sJDLUpUEhPuUnoe&@RzYIirL8+(y{fMdJ@k-i&X(r<=h^JK`bc<2 zBB*bL)IwO0RBh-37CA2mJx$EwbR@s>bebI+yAhF(DNH`1!ur`=rfufk&qnRPVB&-I zB$Ur#w5pP~@I*oXnXdnY6Qq{UdE^Z1_H?U(7uWaih|`9)j6IqC&QK??SUok= zEmhSK;8q5&=@yrU0ocToXP`hz=v5KWnV}+aCHL|ZRZh=Ab4Qa)fJ|&C zM&+2{x_gf)Eqhm3S}cnTus62!H*q0W>UV^xev z0+Uq;XFB2{Oi!^=mk7BE%?po}1f1{4UAd7TG76p1lX`1|#Ao5s4PUcF%l2C5gp(Bz zX42yb9}VGkMSJt21~BJfoWfX%GXeajWWH;5NP`8);aWghc$FcWq|lpA zvgW~>vk?t~t8%WJd`n4zGfXLc{HkXTN`YyR8Ys6bHTt;_9zLFt$d)fp$IBR`@+_fa zd6UH1(CHF&hg`nAZ3;VDK&U4nd$B|P>;q`+lC^5lgS)+T8jP0lDcQOm4L8$if8q^8 z%Y8Oc#j;=n!xvl|PevVXl$@6tcLA2b^%$Nj@)``$kEU4?z9Tj1;fw*j-f> zZjx|bft#VyxAKj|F^9C}}osOhp0JNi>NwzZ_NnFER6@nW^L_WGf$L6SrtMgSZ z(~+-|>ZgqE@l}nbya_EsH%y-vcbAj;#v3&RK`!7MIJycw2cV#15V^wjb{H~DT;XAk zGFv)Z6EZ^{255}5NUFeEyrmeMJ{SrCEcf~DrN>BpJuhJOb=u09and8|3zGl`9E-`T zjd=iJuPWvHSL&UQrWrnylj|xCTkCud)9pr{ z27*w{CX$DT2(*@6o#stMUZDwzTAmB&^Ccmv|H34?&(kEasB|T1ZEzND{^LLX<0Fqe z5}5Y??4-|r_On^O$U;xNzEZnTb^eU)8QM^FJp`1^XGTaZO)4jC|YnCWdKbc;2>HuVcS(=!LZlNcs zg4f1ap6A#^1Chyr<)6X_qooOOkYtQYAf{Bt-T+qU`4)p>J}|3f>XAx_0X-hqGrI9uk`}qIB6i}f3kX6qeR)d z>ryR5(+|Ce2mo}lGZ+n+7_*DNAZ5m!Ib~Yju5~3aQ}e{Gpua$m@0#2?(@+1o+v-fBD}somdl4cG?btJDxtxZOsVClUM-?;g?iFnA z|K4znH7yz_e}>6`z}$Df0tVPm#Iutv7i@{34yO+piLW*!J^$9C)KeY)^=^XAOB24q znwJ?Nw=~8vJgWbb5)~gEh7KjN^;5S?jU7mx9JVHQJISk%pP)0EtF1b-z-|ApIJHb+ zngu{ZhBa5s2}cjBHU%>UYSW)hioSJza_C0!3KKIfvg%UmXMhm4ya;bDLOzLWY1aoC_fOK=>x*Q>f@XS}MQVMk$~B`=8?!aKLygI!d23rtV+ z9Q|ax9)me=AA%F338iU6Nxpy zz3X$J^?=hbcz#2CaaOGXnrbe2{<-uP_==hX%BWKde5JmJl%+)jQ_UbeaqD;NM&uR8 zVY;TDqSSg#)GGjO%+pBj4uDpe$1`C>(^V^*%|WBB=^TjveH1565cX;~6M89@q+Yan z*vEROTV>{8_(0v8YSybHS+Su*WttTRTtjpnl2%v@-tBhDt2|EXY4BD{d-NhZHMJ$0kxhS%P-R?PuS-URpIW%se->&9 zMR`a8UszXqlC<}}%D(BzwktVn1bOJZ+NeZ*OK!xzo`72OQl6Tf@-cT^r9wJm;FS3k zOZ8wqlSyq^)5PMZgs0r7U#SYQdpZd+79r{LY>Bj?&lvpnBs zvPw{;KGzvv77jqX_U4Jnkn|2f?*R1UcL3^zzdHcE1JHT9FBd=)*$^G~tO`D1q=|>e z@A#R#N-=W$uBFxpW?$R1zWIOJyR#fyZet6>H3LJ21pyc8pdQj#JXC3n{`dJx%Yi&E z7k(~2WN|au1fy9IBr~%*NA|DT{1^3>&;B8B=$_{h3y3{)o^z@en{%+D!bb0!r|s6_ zEbfu_D=(5S&EcEQTt`kUFX8(F#i2Qn*24aqZYlcfK}_wiMJOt=5Jw6&5sB)6P^Jkrs%Y6we27_ zjF}?Vk`U6v*N>3%@sq)Vovv2#rM0bGz`h8y47{>7jTiwYei8u|J(z<(l#>oD{KWsM zs1=?*&1;L5;?Pc6ibG%j)|kc8`fXOe;Lt{ZXV*Im@=pr0vCy*(GOt%U zuJO_pa=WIx^^>_$9Y`G?E3|WG{w1v}pduzNpr_fIs)?bB$QkOaS2b%i3yM|~J|(bs zRQ5Pa#$Sc%@2Q}jZwUSggHobx>xCJBJs>JY39cCoAhxWl1d3I%ymy>N%H|Mt2-I%+Kd{@BPpfYh8n>~*N&T<)b}%p?AlpVCC-;iGnfdrao#p@?<3?6 z!%Cl3?b;VxLefAy#LVkNiAQv;o_LFG^AAQZG_WqJZ(+zu<0_Sl&(xQ*9JbDZ(T&LN zYO)$SF0+1bvW~w>O*y>d6{<`_>}+5xRJG^3C1IxSh{<>J%rxdi2Jnr0iN;mNz5$dU zz(pk6F&*|Fot%f2rdxy2GMGutfE}aIZS+$l3F=+8;FX@)MJ3l=O(^l1^mo^Aj2-`B z!q)QC+g;*YEM)_y3d$*igCH-nl=kQgkxNv*70SFFml8il+o#piaZ;D7w9kuR$Ad z8EwI42M9gM=znB~o0*nKGfqW^IEyNX&g!b3IhnMrnVW_>tYY%3P%s#;>n+8do7EL& z>DeSHim6f{jE1n4zzE_DiNYOV>VGL0cZ9Pj2iZ)Ty)h30sH^HEQH0T_MkipJ2PuFo zIaQe~t8cOsRjrtGx9YHg$g&h1)Pn~wsYq1WolGL$?yorm6G4}$zHm||fLMqmf{Rp7 zZ0sNV6mNFompk+rKs%cSo<2X5JM3=Kw=-pDu#|E~38w|(yG5a=_V7r~`* zW{6&0E`O0f(Gn7*#Vi~~a9HQi<6(^xCZocPhh4!zh854OvrQ?^JOnU#7Xk2j&KFO4n7;UNepI`3Zu+%rPY9n0_jq zhID;@7rp@;Ce}*|kr0X>6w3JS2MB{MVSQv!AHPQ)Ru1hu?k4#b1&t^upKxH^`%*0!GIWB`el zVogWOH)yvi;ejuhl1)THdFT)8%P?|154Fpf1ycvCyh!!;K)Yq57;}M7Cf%&FYLL;R zPW4|&G^D$HVKVgsSkeqAOUbm6$pwwdHotL5(hCQeg$+I0#}o)pw)j6k!m$EJZYbv zWGXGH1l8W+s@qt?Fr}A;b z5aS6j9kQ4dOO8L(qsf9!Y=MkQgnrUI6JWh419z%WThL}XKk%)*4lzF=dcv%fdU&s? zX_9+gRhhbafFZuI&wAs$QEsMYWRA3yR?tZ`V0#iU;K{=JHZZRoFz<%}Y6>UbQkp;Cri|uLu-nj4}&vE|`YT*pC0?6;#m&c*pkx zL3c|Un#)y{3LBAMtQB8qF~7)qqf(ZDWwt!!*OA90|6ae z9UqGfd<`0q7Pba9~$;(had^)!YJ(3LPTZd3#^;fBG}bRjs>L{TmLFMk*BEMyiJV zpDBPNt|HcrEezbORagK~D~Md?jay@T0Y^rajro6;zx?t`PjLsMr9OetNl_;Z?TZz! z6{>hSk|)7gicSpd8Ho*Co(xJn711&enn7cxVf1W{m&tLwG($}yH~A^+?F#xV5MX}u zv}MRF7W-CSfYRod57hg(GVdb6tl>4{{RA1vV8b|oJb0l(nb=ZE`3RV8R8m*n8seJ> z#;V3wp~0H2{>yXD-koTL-Zo2c*%46d^boTLNQ*#oe!kgG7Bys<7%PYa=koWCrDbHSY|ua?(Tr7pZJ4&)r5o1 z)Pfzl=};<`cj%;Y8#wjmOdpHLU1Vf41jB9cEfhdi305vBZgi3Ilvcb$L-+}avdtVC z*JBk3Kr=|)wg8=JvT-l|YdctsV57u*V9FRPAvGCzAs!@F1=tE6H60jh@qbF;2KOrel7Q;fx$}I~PsE%6xo4k;Ro(AOu*gln30@kO= zOtqi5QCsmfj=cahd2}O5*G0nwA4M)c^Bz{VzH1?0YW*Itmf9v`lPv~2ne`$EFvWCo z;+KHM)^`oj&#FaeBPNV0gF;wIQK%iOegLS-R88bEoSM^?87P+lnmU*0G5kVsSKcXM z@nKkGZo>9z=Y!|@qr@`xGbVcShN|P z5f;$ zSff>gNabu&IgOk%rzfy`NJ>&A{$@;uN8kg#!=}Yz6+)8*rvmwY3R)e3bY4nV78I+j8D2cY89DpbgRxf9hWtsn!7 zgax$~LzIuPN#V7GuWI5+W2k%c7kNcWR_e7-Pycv&CM)d-qSyE`(K5w56=tX&41%ZV z1~-NmboiN6;G>KPf=&oGXcbpX8w3>UUx=iUAVxV*qc^wPv<)0DjRs@E0vldM*~Otj zQk#Qb042PLr*=HNR?Znb8deNg^X$s>S+#gUu+PR|D}!MJ<^`1J0N{n_2|7exfEbhG z`QDe!&n1ph3-%rq4gK4WXuU~S@N@8_tGZ3-7#>y8Q#CNe6nQ2IhpVu1AU?aIa1>V( zBXCY``Po>Tow0C$`-E%cJ~XLXqZ=B}33n6er;W&YT=NQj!Y?tqMfx5Nbud^b-RdAt z9GVIAm6l38y;T*8hS!@@(#G#nu$ zh9nq4_cdlZrwMSp7~~dBWr0^;2f^G(Kl$h8$mzi;PrP~o)RRvo4+d6~9wfhxXu_-> zFK??c6pI5zubzkH(C9H7G%p;$5R($H@DS!(3FjYe=n2PrV4$%)SKqcK2iECOq?Y^> zizW*ovRhBi8@Dt-7yq&lsnOXX%g0_)V=5e&ez1%7)3dp5Y!P%kfRz)4)XvT4;RJV$ zTL~{X*`dUs1V`v(y1d@3pkZ-{8TN%-05om@L{C=OJQZL{p1Tk*%7E8UH30Pu7oTp~ z*IW3-Sl9G(oc?J-Fq(B__T#zEZNFLo@t~Uy|3QtZs}hBST|tJ4Pv-^WH!SEb+!QXc zYt9ThG`fJxvS4zgnG{dt1w9ED!cvBTAgobm@MIv?bki32Q;gcGDR{KpF4@);#tl!E z=)~f^n!ZdZz5!MO>d|1zfZK3Gd9$FXvNb%wIAbqTd${Y*uii1`e z_*hC{3jpg>Y|`93T_0#>+nq9nr~a!~DT2U6)O01V83W^N^b~@VoIQ}@tY}aOWoVBI zYXV`RKV_nz3a6=1U=RiuC=y%z?U>JJQb~G z)2`+098SpL3Lr%mg?%z0ni2?l~9aQKW!qzK@Tuh zjb-T#XzE;ky*d6Z#cKafLg#>32x*{xdMyevR;OEVwq(6nN!Pi7!E_}HmNAO+!>IQU zDnsH$`(iz|Em?Unav9tgGxpMLtOcX)g;I_xWwO-qsrFBMf(oHuJwkV=W^-2Ur8%?oS`Gy9@P{bZa) znhhPzS@NHM{`uEme_1CMB6-p~v$vs%At@p|!H3FaMg!I{71mDfv#}~in0`tmo^J8O zH^8Cj95~dTh{0R~5zXKLKHBT7XG>QNIXoZ&VgRVAX##?Q@_oh&fX1RYQ{{rnt>`P% zp*Oz7t+lNy%k2swY)Z%#!D1y4tpp8)?X`_#EZj%FOX*48w_rjfMZ=p^+^eB=x>U%O2<|;IhvG{=fti$+^!Yr#> zwH2reU7HK^Tr?o;12{Oa0HRJ}Q5Nxf6A8005ib@s3`23Mn$=hB+8CiycX1`llt3q8 zT&5Eq5^obCXHj&E%`Dhd-#`=v;`_-m-DUrq7dr=7yF2$FQWKi7?MfyFuS23fTh90BLjPB~6p|K@_6Th|#r^{`_?u2QO7s|!u9rf|Vod)v zubzYN21+5K|3)Qt>j1}&lG(NxoIUU*STWy&KQjYj>L(wApBx)wTP)enR4olFL$So3 ze7;*#J2E0B#xJOhF!B=0m7y?n%=t`-cL%IsYdug2Qv--}#?~Rk+2%kQ&nkIgsSMB@ ziq)i^`5r#oh9ji&Q;=9SvE-06vS|*cH3dg}El_;CCux>9BW4`y#H4~*Ot7XgJ3>|ukKSZPQRglN|^`H>Qii_#3m3tYi z7$h1u;qnt*-$WBt0;u5jx}EWE7`%{;9qK))P%_$P*9PF~5Jt~F#fjPu!Pzq)rZhM1 zsORnu+E}a$2&|JT zCq-Y+3`vVjeR|`^AAjthc69Aqk}}ON5sGSDzT_v)%!r1e z%P?Co%3V#SL&F)Yphr3Tm9~iq7KJ7fi4Tc5RJggVMwkWocI*zqF5baM3vh2SIDw#S z7UR?gfXeI`YD;0agwHkyx<+b06NLQ%>jNEb>(esSSORd+te>vW2o&VuTKTw4#TR;% zw<4ysi4#thu5r>Q9A{MXX^VHtL>Y_4bYlT@21b+WnT8>W4#7S{*B0tg1<+tbG~hz@ zd1K{}SKuS+k=MMTt2z3y(p-|Ihelh=x2U&C8jM=uno(T#|8+|(?OW0J?~hvAw+!zT z$YP=4Xx;(`UI!mW)nbqgjFEs{Q3+66WCuR5uKFx$26oMF1DRAm0okT3gQY6h71j-N zIqjLy7|sn~V^{WU8Nm|(?&`-V`-b6W5qjI`v8dFG8%6G=4&`F9?Yv;lT2+Sw7oa8t zyD$xpB0I#yMvHOZ0l^~YMJ1p2@0O^LkEhjv* z$^c4vcA*o#lU=g~T~&CO)fOn!M#yQ?Q=NDszFR~I9PO5>sRv+J#xANbb{Q}_n8xaA zwk=>3j^A)btOQsiFUoBZs9AZlF5~<|H2NNaLd+R0&>7qaNf<3yWE(WN5+=bo)nsyb zJyUr^I)>AHeQF4fnKTXN|EVKQLhz(WZ$>JEM+}^uZ>)(?*r9!;DziO4k?2~YK{XWH!q)P&f)}s=l7^w_fd7e7A^%iceMW{D zISKNP)R_3nOo+UQxKg4m=#MaPTpEBvI=U?oz6uX9nGA5Lgsd-gUN8lqfClC&5g)+Q zk|qOCAh`Gu8ahf6ybmb(X^2^&3}(u}P^U>=N47bz5S5`-)9cz|Nz+uPAw;|N13)b( zyH%Zj`etKo?aXTRdJa@rLG{^>pCp0l%x{RP6}OgXNsDN8BGu2(M4u>TUDFt$RjVu~!JAf?_cNn*EXqSGY% zp;?8`aL^=?e7CfrGpmB;R?3LJfe(#-%DH6s|scpm~K&pLVjtlshi@KP$Z-<$L=fW_!eioaOtt zNl&wOt49tT-1(nN&ANevTF`S*rv-Ja1FsTz=*wBGH#Hqt9A(HIRWN+L_4fR$v z%WC6N68&#ChBoZ2+6_Gfas9_kSI#3eLPITDokForgBqa+Pf z3H|TxxHMT{1sPSSt11f*dQHF2o@fi3(wJZ%Tx{fvMbegNnP zfd1E7=3rRP2Y`M6=m&uQzW`KNAtIY=5%G7f?SATEV01Cw+eaYN_b!)cD>DqYqAw$B#B~* zHAG&bi2_Wg@V*t_mT19+hh$6D$+?wj_p^T}^!x9>_bzM)P)$VSf&;=0K}4xmTPJ!r zDN3x_@ybfSjHst10>aEO0g+urrm*tH5#o#7tPgQHI4-jlkT8=z2mpm+#ND-t7|~C* z$3^GQz1dar9q#rwdu+DVdRrOAn?7_OLpm=iFmJoFDBjy#3#&zfrhg+)VWwa($lG09 zrKoli%RA`D=WL_>>!#T=ygh&BA1D+Q7Yr8oV53-mu^u%uLF&gwMEYnG*osNZP%WBV zqJ;ENaAyb52}ugmtkWgO9h96t7;9qPh|_0uPK$)(+fUfKYKsh_+~UkcN?TG8B3rX; zm)NfebdjbA(dmj{5dA{Vg^j9}mbr1|LS1Wo!^Iz6#U;_JKvHaLnQyC9#A>S)CD!9Y z-CAufbr_SW=%i51g|W6lZKvwQj6|KbCfG~O-w%aikgjE~PxOGdt*dB$poWTUc zML?{#@e#AIa!x79*}d|yNasksUKs?05uLx6Z|6?RJnFMLRc^m8;OJWY|LP3RA&A~hH8kkI$7 znJB~u5RcCd&8Et;i^yXgsNFId9%ZgR^%MvED-j1E^F~dfx#-p+T|agFW0#oRW)jB?a8{mcD;Ug8|DV?`$z06*=5_ii^s8*HeYO2Vh z32S;4f<8h}+IIhYN6=i7D8-~pD=7w<&qn1!KTRcoGI z`{`f~+}nv4OGXLrM@4{RBX%p4nKOry>_H&lRXq0J(U6Y-v}e}=vD9OpzB5udS=bT; zln*1ycM_5vcIF;Hw7ciqNTtwWkCA46w!NZuT&463k6~~gGfNw<6*jMGR;L+7ys)cs zFWZ^Q7s8uIMT3?R|&7H`aonOb1q__FfSdRX#-Ti+@cgZ`aefqEts-p3kj* z)<`JVqu_s9N}z;Q0zd)_UeoClmlkjRA6Y0L+0c39n1J8Q3VmwSz z09ObC6RRwwz|YeB@op{L2AchZq2+BFMza93LRcxlT!N42hfQz?qAer>zHGLx>afZX zqbv0QxRM>o4JQ;uNoK|H6I>ZPp`NivgUY;GJ;OwS5hOJ=!wEk}5(fa~(f@vkgq64{ z4+>{*RdrVh7MGZMQlvn1JyBVFsbdMFf4UBc2eRDV1W9bna!!wvL<5&t#{A8Yw=~K; zXLW>i2w-MZ5FFRPSD3xj-xD)IAv6p)d^V-eb7b~DLhP&3K*3?LR3Ou*|1!cJS1Qxp zup`j%?;cw%cHL*Il5V8ZX{Qa$-Z>RalrElfJTXBztWr@t{z|r1cx(EWY%w8~ z$~QFGp0x@?dt@~jEg!@*yO!HUra@2O=nVp^>@3`iyuQ7XUnz)-E!FRnU1H2wny1MF zmEvb%$TiTE!46$b()FMr%%Vm>fweH>>KK~* z^v}+5N?uT0wRmc+BtF#xYwQZI5z|$L#*GEACJuTbBv9)W%uu7Hod3Y?dwr#Xk?bwh z$a1=y*+_+!Ak|VdqzE)K!cw1|4tl=(?z{3;$OsGB4CK2crHrk-Z}voUR0*2AFUXws z8cc4od2V=V?IEKx1u1{~_gBF59iadq~ia0oSnuZO6L!osV7uX*JI`T}ezu<&(l zXXPF(3TpzFLa?soYZ78sxw%(4=Hx$oqbqm~ogsB(M6IXRy{*Xm0tJ-QF_t5dtT16d zasawDM+{l>?uI+9(_#8P5T0Y`)8JmT4M3Yz>-Q!lG)~Zwo#=gbAlPk!K7&x`T5l;v zXdCP%>l&7dvJ+^uc_<35LC>VwRbXfd~H~3(YAH;NXss5Xedpvy%EBz^S93Dhx@0rn_*t zX~Hsnl6YMyDX9;R)}e-mvoTr)N9vM&OaQ8y6Lvs}fT5(YY(R`8fg1c7K)nDohEDTH zLhuYsr^NIauR)Ui7it0H%4^n=&f#JD@9QVlvxW+qHt&? zHu`Fy>KNBbzutlgAAbum*-wTMR)!rJJcB7v@^PcoHyqsmU(1lH;2oq=YuijTtIPaa z4Elyh7F+z%`gD4b0}QOiUp4V^bjyln7loOS=eohDg(t4c3_#19cvG`y$_N?87Vk`@ zDHBAkz>UNrPPNmrx>7Cu82mkPV$QZJ+iI(Y~m*lyX|Q%8<~is_nruo5;^ zC*&D4Irm)5#e`e88HpnxpTtgoaUW!JhP^+}A)7mhW=qQ$^)Xxyq&VA*$kb5(I@D zn<$Stl=wfQ^n9qOQ)SGduJpN7t0qsi_v5lrk>)c|NccZK-ESd^4(3v@RT0C&0vyK(r9Tm@^QHlT@v zu#cyr3X&!z;lof2e;Z6I4J|y$pr0E~=LDJd%p~NS&%#WjgIXDVHWQ;%xqRvy0cKRS zTG?H)V8JQx1r>voGWecs&vF7aMo#9 zts^pnDsKr~C-oe8`;b~0NBn{jp^B?blHju5>UjqykQ9JAaYoQt$S?o^7_do1K~#B( zAz=d6u`X&?q1dN#kC*Bvk{k-RPVXW1BC@y?Y7||1grF3F`oG5|n;3bH-u*8g4`p&i z&C$-XaD#!_W@0T-LgGxCGOQ+nvQp+m#}=HjD^|p4lS@9yCp=@VzoLC z!l)}d!hEYkQI0f-0e`Lny5SUGXgyH{sHfX9j(Q+wS9oHk^kF(cjk|(2kf*IjK{qbU z1%hn6`9jil4v49!m3y5)e}_mV%2roon)u!x%pz|!I3++^B3Lr;;2M5St8Lq>HaP0ymfYLg9@QaOx(t?1FAaZ~qHzbNS+pHcvtwHI&J z4|PE*EViTqF(r^B6N;4?<&BHP=rI{~307Ax`5mv*ueJNKJ9WzF??bh#*F! z7Is+V3f|lLu(_GTaHN(C32lquy0)8Kq1RY_wn_?-vwR+CYA_Hi!;l14C9o?@AVJvcii^VAQnW>(?UyobVpbBYM{P7a`VZohSCxs3QPnv&&np+m_@B>VZcNB?#ErVD zq0O}_CpDWbCElIJmMXCnDAB{YM*6Tsd?2r@hGJ5RCpDay)S09sILZ$TprI*HgRZPq zx_*>J-@phqO{2(&;g{6t(ZE4Ms{t0;U=T=hmk{BsC>4x?R{*Ljo94u1 zP;E^Is^SbdhRat;Mx<_mz77$95+N$#id)^qTL@EEU@hjnVIRIPLZRREiHxVU)ugZV zTXzE>94BUSWvFn_&p|d_p(t#_STs*H846K_np3hyZ-zy4t)WWA2n1tpR5seooDy`6 zBcZ@oUwzg4l%=AHti4bx;P5%fZR*$D-eSE$QX1@2Jv-{L_aBi>O)%9@-xe$NdbJ0V zqHRW1CJ9-Bc_zkrtG#Mcu+S@sO!tX4|J}ixh>_%hCk#X$Gv;{8Snpd);v2T$hM1*9 z5i5z#0NXJ)sV4T)^HSv%5)-(jND^lzM5uz5{u1SnfvJ#( zMuepoPls#lcUHsta1SSyu7Ws0)(PAU~vem&QNJFASiT8j0rTs6WChG zVnZ0G8c^HD<&b(R1aowbMZ__vr7BAh)3^pgp77I-^NyQf3ogw|m3i%fQdy=u2vfcU zu(5Bw00nK~;|#!LXs0G33z|eobj$j>p&=0^qm;C&I<=*an%7}Qn60+@cBYZh=6o7u zkuv0kYr4YCwmbjzcWOs30L|I5y^7u~i)cQ8&3NIu>s_X?B9#{o z0EKWTdk(Pj1lhR<0HlYS5{R5vt0Cy*ZWA0w&U0^FVjG7$theSEwH^iYfJcrY8Ht-< z4SrUwKJB`CGPJ@t7 z5BwdR0WV!i!=frHx9KT#Ll5#64$lFAewC|JhE~`mpf+3Sm#;$gA*ngWC=L7h`Xc>8 zHok~UtOiJxhOod66mo{bnR>@K+KF5~O2}YfV?ocZwlZl_omk+cCDjBLhSR)i0aJZ8 zXn|5OQA?`!-Abvuh^Cr0?4w_|z^mSfvx9{%zx)z}cDztj6>CJ}j=$@i8ZA+yVXIg` z=eq)KU@Do5%EF4i)N7d>>Q%XcDo+gIrhls3qOz-(>q}7!2mRMGb|p%(man&EHXKT7 z2!AU_7|(Q_Vl48llbBf)-!7r!paQNiwBV~KGQ2Cmp*;zL;B-YU;DaM!W?+uUSX2{P z_yD9TsbPI;RR+z~r&LDN1HqM{li~aKplCj;aZSrvZOh#nj=K|6iCZl~)&&Q(d6w#cn z7BtnVm7^*Gt#bh6$etqEC)vaQf)9LKI1I`GF$xKkaLdFlTqQ>yVnUw}8P-1k}V_>fBRB~~zjr8$bO5LqA)?1aKXqtJRNyJv zg`vihFb%I7g-p@LL5h+fosaFugcj*Nn$y8rr`55jO+)|FDHUWS44$VUXr9cqL`L!u zWE#>O=TPTX>CEC{8bW!>UprZ!R8g9Kj_s&YnW?ZP5sFoz_|#8pH)llqe=VM4?Zhkq zZL2rv%!LTO$2$BZdSpNrQ@$aaIwK52REEOvJu&S;V4E`!ZK0pS&yr4v9u(5;h|IP< zicf`F-1ul-sk_)4bE2dSH6R7byjWqf6UyPa`jgQt+8lQ`dNAK+2vG{zNWsdWWFbNj z0Pc!!CD3hNlS92=3Yxh_qi;|HDVf}>uTSv0RlGWj|F9G&n*xa|G0^J}2}h^}r(I^g z1&h@-Llr0r15lzSd@~&9U!OInPc6qhqh9h~t)*gD#J3^aiF`+7ZCtceFBOKj!_$KYc5gE(eS#YXW@>`~ zkqBah9iX;C@mD3{9d{+z#5#lvpQ9(wY6(xcQoQ2YS(X*OFa?*4XbB$&oYy-{OQ0#0 z?LsEcH0o+9I%5QgvpbU_O14aJ(qusp!#;DjUdB3J8Jx|TsQ?hQoeIH3_;nQ+o`PLZ zk}9!FfX-2Za@S1(0U~94oee>yRTHre@#~NZl|gXBz4kzXCXlAw^~(%qdlwL?GHJy} zGrUkTh*?x}5eI93zTS9qEC=ZEvO0W{y74qM#s6<1mIcLDg)d89^ z3pD6A`*b)^-pa9(=9?>RYWWN=blM1N`t1dGHyUaZJ@!V3hH+9wqf4M9BJs9c3#QP_ z>Y$7SOqmID7*_Ip3pth3lWsYjq-iwAD!!kNH?gadF}%@z`I}d;tZ8{s1^Zo0jOJ5p zt{P*@5YyChP@u9j1)B~~wpdZankQ5JfGPlL9kZX-&XfE6jXtNqw5v1#rB?>Bf*JbH zR7W9iS{*~1ra-u!w*Z3ju(&)O6Q9;O_xu9TaSAZQ?0FclwM0Kg->i`u@kJ;WtckX0 z2_;*i6SRQj@9gAvm<$`^%AxXr1s(i71>$J?Qhw-5W--hU9_b(*&GLIEFA>qNB( z%d<5(WS|)(PLPmVA;M65DSV*kJg`<)?&}8%Z<@uzx-Fwm>owY65^jJ(Alt+fm2Y8` zyo+KXmZa-s=SaR2yjMc&X8>wCQ9d~~v;c&-Q;T4_o`cACLgGxGCU(WZQa^nk#G^>w zYA@1v^6SW3{}lakWq1oGsS53e`q^Ro6lo7 z+cKgRe0d6kHmfC0n%DF~T0K`mwGu=q4EJb6n$zkbsfjK6X>lVeM3_m9w|>^oW4^1V z@|+6Xq*sIvupm*AvVllypwrzY>@u8grD+jy6TQll0%DYKbyw%hUo^ChFrY85Hz>>* zE7^<&?$EzF9{~CRpdSGG0iYiM`a;bA5kQ60qCd`)x3t9A+FYUVQ=l=|{x zvkO!svMKLFmMy`&p>GSafrKHBah-bE7sFK(L_bz5@45wqm`CnD2i$ z7j^b{Kn$<&{!g^XqbGD=?%K+T58ujqQHG#nfkQorzjReUmO&W1Fr<bOTDmQV|47HWxf&|eeLbi}ZZ8w81iRGS*J zH4`L}X$u9rEBA$>Ej?yq5SgT1 z88f;KRQ)>Fip|u7vZ~O}q|#W;&>nfJ08BFmAMCJ5XCYScEzrD?lIqYl>s*U&B0&jl zK=aUZ+5;t-*7Yu+s`}_GZ{=mFCn+npOdV_9kNrswPCik;^ z)yfceqth<4t}=1c9CJ$Nsiv&u$9sFcXr{JUSJWaVwBnrbeag}UqRp1^w13xz*CiN95-KrE(4=W>aexJ z%PgJ52Y-V_n#|A;Fl<$4?)g%?ZgJRf5PZIz`gH}YGC0;)b?a(Zy`d|AeUaWw+*ZS^ z_*Jxy`t*zf;Sp7+Lc)unfFOC-1Lfl+XQ(rBnaUm4s8h+DNhA$J%?iILU)2P64FPo0 ztps1W1J>qjyU?j|`R!|nXb`UlxLN0{E1DZI6l1zW(qT81MK+wGrXbbkRJ}!#QzJHD zv)?AE{WYe@RH|9XSq3vr3Ri18FG6O{1X6d$^i9w^CnbEV+V;zkM0?l+%B$=-DrVoU znl#yN712~Dda9f#S$MZ>u$qzjx&^gWh{@ZSp9xWMp$*&=Dn@`3gW_}Dj_3VE9%Z9x z&D2kkiykWPuD8M|s*{QeyIbcBl@0*++SWf2m_CI}xInEsTp*h-Q*(}%TY?uQDpWPD z9fyG?KRSKGF4Wc#92*)+^5|7aWN;8MbdOA@A%>%YUdCr}i#%$slZ^`zaGs5L&Z*$T zcChplnDYU&>}6zP2=Irhe6LYUS&hB9(bP2YLl;_>EMC!I&rM zs-siQX#l~SaI>8aYtHHbpSWy+(#56?M6GcaJ&?%H@plWH3Jq$Y!SVD@;mne}nXV=i zD*0h_*P5VzQ=sc20=PNFMOZb(5oYSqDD@Ruf;}FYTEt-@>hqR{Mp7!6euGi}2cl3y z>_GNdhcINAyXm7XIvFq<#wC~{@+CEnZ4w+a^)o#Ion1i{Eo5EnM~TCVO5m)>lzETO zSJwwO6NLJUEOg#aSlJLX)95wd=xEb?Fz0yPGW{rZ+356qlu#|H{LBp{dZ6|?A@11`twsQ9$;k2|o$+ZBPkQ(-EKcfEFzb3t zdyru`odCr3uX7LyfcP^tNtvYl#2+H2`InhMjp9LSOoMtdvrs^9EG95#ISj=C-C_;| zfZ7V_e>Kq$si$LAfQ@C=?b}pb1|5)*641yYbnPjkX-rNN?KA*D&^(3Q=~Q8ou7chM zQYM2|cX2u43Gs$dZ~+{2Ep8GXTHsVoPz);@8owCK!Uy16390ZXW`_)d^b@EF8T2D? z04TAp{BGUH-PtEZ(+a5!V+H_oOSUps0Vbj|GLo)W&fCLk*TN(5fvL}A%tM;Bq1itR zv|<>(BOX;CHBIOmg_NN}i#RTGkViveuR$3nGSn+x0oJ%bzWZJt;;cHv&5(C4wPj1agqPjdm(txe}|NA~_*0t}z& zKK#?HhM2UKxmrhWfi?BG>dKr+VfY2Gf@;2G!eL62N-SZ53Bfhbn$zXDY zDg#7=4o}Dq00EN{4gi+VfpTQiJ=iw@HH1g9%6QhIyJZjnB|)J>JF&j@^Wi|VA?YRM7*D7K1#IVGHeVp!Z2r{E^cB4hi5P>%1Ddj-67-av2)uOJ;u_KatpgrxR5M69A$f&im}P{%%LzmM;F4xE?-n@ELF ze2GEJlP@O2T;8R-(5J$Mbt=zVD)&?DY0(GZ?plv7(PqBAo~u@-YJ<)O!d1F~pA5#h z%%j2uutuc%vy-X`iWiK`0Oo+}$7Ep~9jIqKSB>gYn7X2D6sAU^0cF8z!jL z+6oxy7=@`Ct-yS?LmxEfQ>ha*s8v+W4dWGtH2Q!BnkXkA^b>AB$+r|-`lywE4CUV_ z_|lDce&R!b)iokDkr{uiFz^Zom|;Izx>UJV_@jilM=koP(*U%7j7y7X6m5rK)vQ~C yjv<3c3bxU=W(THpSabdrJzAMXKjT2b%6|alqz+IOjQL;y0000>> square = np.zeros([10,10]) + >>> square[2:8,2:8]=1 + >>> square + array([[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], + [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], + [ 0., 0., 1., 1., 1., 1., 1., 1., 0., 0.], + [ 0., 0., 1., 1., 1., 1., 1., 1., 0., 0.], + [ 0., 0., 1., 1., 1., 1., 1., 1., 0., 0.], + [ 0., 0., 1., 1., 1., 1., 1., 1., 0., 0.], + [ 0., 0., 1., 1., 1., 1., 1., 1., 0., 0.], + [ 0., 0., 1., 1., 1., 1., 1., 1., 0., 0.], + [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], + [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]) + >>> harris(square, min_distance=1) + array([[3, 3], + [3, 6], + [6, 3], + [6, 6]]) """ + harrisim = _compute_harris_response(image, eps=eps, gaussian_deviation=gaussian_deviation) coordinates = peak.peak_local_max(harrisim, min_distance=min_distance, diff --git a/skimage/feature/peak.py b/skimage/feature/peak.py index 225f42cd..5d25935a 100644 --- a/skimage/feature/peak.py +++ b/skimage/feature/peak.py @@ -23,6 +23,69 @@ def peak_local_max(image, min_distance=10, threshold=0.1): ------- coordinates : (N, 2) array (row, column) coordinates of peaks. + + Examples + -------- + >>> square = np.zeros([10,10]) + >>> square[2:8,2:8]=1 + >>> square[3:7,3:7]=0 + >>> square + array([[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], + [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], + [ 0., 0., 1., 1., 1., 1., 1., 1., 0., 0.], + [ 0., 0., 1., 0., 0., 0., 0., 1., 0., 0.], + [ 0., 0., 1., 0., 0., 0., 0., 1., 0., 0.], + [ 0., 0., 1., 0., 0., 0., 0., 1., 0., 0.], + [ 0., 0., 1., 0., 0., 0., 0., 1., 0., 0.], + [ 0., 0., 1., 1., 1., 1., 1., 1., 0., 0.], + [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], + [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]) + + >>> image_max = ndimage.maximum_filter(square, size=3, + mode='constant') + + image_max is computed in peak_local_max function to enable + the calculation of coordinates of peaks. It is the dilation of + square + + >>> image_max + array([[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], + [ 0., 1., 1., 1., 1., 1., 1., 1., 1., 0.], + [ 0., 1., 1., 1., 1., 1., 1., 1., 1., 0.], + [ 0., 1., 1., 1., 1., 1., 1., 1., 1., 0.], + [ 0., 1., 1., 1., 0., 0., 1., 1., 1., 0.], + [ 0., 1., 1., 1., 0., 0., 1., 1., 1., 0.], + [ 0., 1., 1., 1., 1., 1., 1., 1., 1., 0.], + [ 0., 1., 1., 1., 1., 1., 1., 1., 1., 0.], + [ 0., 1., 1., 1., 1., 1., 1., 1., 1., 0.], + [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]) + + After comparison between image_max and square, peak_local_max + function returns the coordinates of peaks where + square = image_max + + >>> peak_local_max(square, min_distance=1) + array([[2, 2], + [2, 3], + [2, 4], + [2, 5], + [2, 6], + [2, 7], + [3, 2], + [3, 7], + [4, 2], + [4, 7], + [5, 2], + [5, 7], + [6, 2], + [6, 7], + [7, 2], + [7, 3], + [7, 4], + [7, 5], + [7, 6], + [7, 7]]) + """ image = image.copy() # Non maximum filter From 2aca8cd791637bf91930365e22ab654e80337078 Mon Sep 17 00:00:00 2001 From: Vincent Albufera Date: Mon, 26 Mar 2012 15:39:59 +0200 Subject: [PATCH 2/3] Addition of examples in the harris and peak local max function --- doc/examples/plot_harris.py | 26 ++++----- doc/examples/plot_peak_local_max.py | 30 +++++----- skimage/data/__init__.py | 11 +++- skimage/feature/harris.py | 5 +- skimage/feature/peak.py | 87 +++++++++-------------------- 5 files changed, 67 insertions(+), 92 deletions(-) diff --git a/doc/examples/plot_harris.py b/doc/examples/plot_harris.py index 229be6e5..7daf6051 100644 --- a/doc/examples/plot_harris.py +++ b/doc/examples/plot_harris.py @@ -20,28 +20,24 @@ def plot_harris_points(image, filtered_coords): """ plots corners found in image""" plt.plot() - plt.imshow(image, cmap=plt.cm.gray) + plt.imshow(image) plt.plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], - 'r.') + 'b.') plt.axis('off') plt.show() # display results +plt.figure(figsize=(9, 3)) +im_lena = img_as_float(data.lena()) +im_text = img_as_float(data.text()) -plt.figure(figsize=(8, 6)) -im = img_as_float(data.lena()) -im2 = img_as_float(data.text()) +filtered_coords = harris(im_lena, min_distance=4) -filtered_coords = harris(im, min_distance=4) +plt.axes([0, 0, 0.3, 0.95]) +plot_harris_points(im_lena, filtered_coords) -plt.subplot(121) -plot_harris_points(im, filtered_coords) +filtered_coords = harris(im_text, min_distance=4) -filtered_coords = harris(im2, min_distance=4) - -plt.subplot(122) -plot_harris_points(im2, filtered_coords) - -plt.subplots_adjust(wspace=0.02, hspace=0.02, top=0.9, - bottom=0.02, left=0.02, right=0.98) +plt.axes([0.2, 0, 0.77, 1]) +plot_harris_points(im_text, filtered_coords) diff --git a/doc/examples/plot_peak_local_max.py b/doc/examples/plot_peak_local_max.py index 0c462303..9891141b 100644 --- a/doc/examples/plot_peak_local_max.py +++ b/doc/examples/plot_peak_local_max.py @@ -1,14 +1,15 @@ """ =============================================================================== -Peak local maximum +Finding local maxima =============================================================================== -The peak local maximum return coordinates of peaks in a image. The maximum -filter is used for finding the maximum peaks in the image. It dilates the -original image and is used within peak local max function to find the -coordinates of maximum peaks, comparing the dilated image with the original. -Then, the peak local max function returns the coordinates of points where -image = dilated image. +The peak local maximum function returns the coordinates of local peaks (maxima) +in a image. A maximum filter is used for finding local maxima. This operation +dilates the original image and merges neighboring local maxima closer than the +size of the dilation. Locations where the original image is equal to the +dilated image are returned as local maxima. + + """ from scipy import ndimage @@ -18,14 +19,13 @@ from skimage.feature import peak_local_max from skimage import data, img_as_float im = img_as_float(data.coins()) -image = im.copy() -# The image_max is the dilation of im with a 20*20 structuring element +# image_max is the dilation of im with a 20*20 structuring element # It is used within peak_local_max function -image_max = ndimage.maximum_filter(image, size=20, mode='constant') +image_max = ndimage.maximum_filter(im, size=20, mode='constant') -# Comparison between image_max and im to find the coordinates of maximum peaks -coordinates = peak_local_max(im, min_distance = 20) +# Comparison between image_max and im to find the coordinates of local maxima +coordinates = peak_local_max(im, min_distance=20) # display results plt.figure(figsize=(8, 3)) @@ -42,9 +42,9 @@ plt.title('Maximum filter') plt.subplot(133) plt.imshow(im, cmap=plt.cm.gray) a, b = im.shape -plt.plot([p[1] for p in coordinates],[p[0] for p in coordinates],'r.') -plt.xlim(0,b) -plt.ylim(a,0) +plt.plot([p[1] for p in coordinates], [p[0] for p in coordinates], 'r.') +plt.xlim(0, b) +plt.ylim(a, 0) plt.axis('off') plt.title('Peak local max') diff --git a/skimage/data/__init__.py b/skimage/data/__init__.py index bbef4f9b..1e5f96bb 100644 --- a/skimage/data/__init__.py +++ b/skimage/data/__init__.py @@ -45,7 +45,16 @@ def lena(): return load("lena.png") def text(): - """ Gray-level "text" image used for corner detection""" + """ Gray-level "text" image used for corner detection. + + Notes + ----- + This image was downloaded from Wikipedia + `__. + + No known copyright restrictions, released into the public domain. + + """ return load("text.png") diff --git a/skimage/feature/harris.py b/skimage/feature/harris.py index aa9f9ec7..6d0da9c0 100644 --- a/skimage/feature/harris.py +++ b/skimage/feature/harris.py @@ -80,7 +80,7 @@ def harris(image, min_distance=10, threshold=0.1, eps=1e-6, Examples ------- >>> square = np.zeros([10,10]) - >>> square[2:8,2:8]=1 + >>> square[2:8,2:8] = 1 >>> square array([[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], @@ -93,6 +93,9 @@ def harris(image, min_distance=10, threshold=0.1, eps=1e-6, [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]) >>> harris(square, min_distance=1) + + Corners of the square + array([[3, 3], [3, 6], [6, 3], diff --git a/skimage/feature/peak.py b/skimage/feature/peak.py index 5d25935a..c55f07a7 100644 --- a/skimage/feature/peak.py +++ b/skimage/feature/peak.py @@ -23,68 +23,35 @@ def peak_local_max(image, min_distance=10, threshold=0.1): ------- coordinates : (N, 2) array (row, column) coordinates of peaks. - + + Notes + ----- + The peak local maximum function returns the coordinates of local peaks (maxima) + in a image. A maximum filter is used for finding local maxima. This operation + dilates the original image. After comparison between dilated and original image, + peak_local_max function returns the coordinates of peaks where + dilated image = original. + Examples -------- - >>> square = np.zeros([10,10]) - >>> square[2:8,2:8]=1 - >>> square[3:7,3:7]=0 - >>> square - array([[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], - [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], - [ 0., 0., 1., 1., 1., 1., 1., 1., 0., 0.], - [ 0., 0., 1., 0., 0., 0., 0., 1., 0., 0.], - [ 0., 0., 1., 0., 0., 0., 0., 1., 0., 0.], - [ 0., 0., 1., 0., 0., 0., 0., 1., 0., 0.], - [ 0., 0., 1., 0., 0., 0., 0., 1., 0., 0.], - [ 0., 0., 1., 1., 1., 1., 1., 1., 0., 0.], - [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], - [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]) - - >>> image_max = ndimage.maximum_filter(square, size=3, - mode='constant') - - image_max is computed in peak_local_max function to enable - the calculation of coordinates of peaks. It is the dilation of - square - - >>> image_max - array([[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], - [ 0., 1., 1., 1., 1., 1., 1., 1., 1., 0.], - [ 0., 1., 1., 1., 1., 1., 1., 1., 1., 0.], - [ 0., 1., 1., 1., 1., 1., 1., 1., 1., 0.], - [ 0., 1., 1., 1., 0., 0., 1., 1., 1., 0.], - [ 0., 1., 1., 1., 0., 0., 1., 1., 1., 0.], - [ 0., 1., 1., 1., 1., 1., 1., 1., 1., 0.], - [ 0., 1., 1., 1., 1., 1., 1., 1., 1., 0.], - [ 0., 1., 1., 1., 1., 1., 1., 1., 1., 0.], - [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]) - - After comparison between image_max and square, peak_local_max - function returns the coordinates of peaks where - square = image_max - - >>> peak_local_max(square, min_distance=1) - array([[2, 2], - [2, 3], - [2, 4], - [2, 5], - [2, 6], - [2, 7], - [3, 2], - [3, 7], - [4, 2], - [4, 7], - [5, 2], - [5, 7], - [6, 2], - [6, 7], - [7, 2], - [7, 3], - [7, 4], - [7, 5], - [7, 6], - [7, 7]]) + >>> im = np.zeros((7, 7)) + >>> im[3, 4] = 1 + >>> im[3, 2] = 1.5 + >>> im + array([[ 0. , 0. , 0. , 0. , 0. , 0. , 0. ], + [ 0. , 0. , 0. , 0. , 0. , 0. , 0. ], + [ 0. , 0. , 0. , 0. , 0. , 0. , 0. ], + [ 0. , 0. , 1.5, 0. , 1. , 0. , 0. ], + [ 0. , 0. , 0. , 0. , 0. , 0. , 0. ], + [ 0. , 0. , 0. , 0. , 0. , 0. , 0. ], + [ 0. , 0. , 0. , 0. , 0. , 0. , 0. ]]) + + >>> peak_local_max(im, min_distance=1) + array([[3, 2], + [3, 4]]) + + >>> peak_local_max(im, min_distance=2) + array([[3, 2]]) """ image = image.copy() From 5491d857059718718bae4273ec3bae1c871ca247 Mon Sep 17 00:00:00 2001 From: Vincent Albufera Date: Fri, 20 Apr 2012 10:54:03 +0200 Subject: [PATCH 3/3] Addition of examples in the harris and peak local max function --- doc/examples/plot_harris.py | 11 +++++------ doc/examples/plot_peak_local_max.py | 4 +--- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/doc/examples/plot_harris.py b/doc/examples/plot_harris.py index 7daf6051..1fe3a3c8 100644 --- a/doc/examples/plot_harris.py +++ b/doc/examples/plot_harris.py @@ -19,14 +19,11 @@ from skimage.feature import harris def plot_harris_points(image, filtered_coords): """ plots corners found in image""" - plt.plot() plt.imshow(image) - plt.plot([p[1] for p in filtered_coords], - [p[0] for p in filtered_coords], - 'b.') + y, x = np.transpose(filtered_coords) + plt.plot(x, y, 'b.') plt.axis('off') - plt.show() - + # display results plt.figure(figsize=(9, 3)) im_lena = img_as_float(data.lena()) @@ -41,3 +38,5 @@ filtered_coords = harris(im_text, min_distance=4) plt.axes([0.2, 0, 0.77, 1]) plot_harris_points(im_text, filtered_coords) + +plt.show() \ No newline at end of file diff --git a/doc/examples/plot_peak_local_max.py b/doc/examples/plot_peak_local_max.py index 9891141b..8a0de3dd 100644 --- a/doc/examples/plot_peak_local_max.py +++ b/doc/examples/plot_peak_local_max.py @@ -41,10 +41,8 @@ plt.title('Maximum filter') plt.subplot(133) plt.imshow(im, cmap=plt.cm.gray) -a, b = im.shape +plt.autoscale(False) plt.plot([p[1] for p in coordinates], [p[0] for p in coordinates], 'r.') -plt.xlim(0, b) -plt.ylim(a, 0) plt.axis('off') plt.title('Peak local max')