From 85eab8d379953845c373ff32d7532f0b6e354f85 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 27 Oct 2012 03:08:27 +0700 Subject: [PATCH] Optimize --- build/classes/image2d/AutoBalance.class | Bin 0 -> 1565 bytes build/classes/image2d/Closing.class | Bin 1418 -> 532 bytes build/classes/image2d/Dilation.class | Bin 1633 -> 1494 bytes build/classes/image2d/EdgeDetector.class | Bin 814 -> 713 bytes build/classes/image2d/EdgeOperator.class | Bin 2350 -> 2215 bytes build/classes/image2d/Erosion.class | Bin 1629 -> 1497 bytes build/classes/image2d/Gaussian.class | Bin 2523 -> 2144 bytes build/classes/image2d/Grayscale.class | Bin 1172 -> 980 bytes build/classes/image2d/Histogram.class | Bin 0 -> 802 bytes build/classes/image2d/Image2D.class | Bin 2138 -> 2227 bytes build/classes/image2d/ImageReader.class | Bin 1444 -> 1268 bytes build/classes/image2d/Opening.class | Bin 1418 -> 532 bytes build/classes/image2d/RGB.class | Bin 686 -> 850 bytes build/classes/image2d/Threshold.class | Bin 2473 -> 1820 bytes src/image2d/AutoBalance.java | 59 +++++++++++++++++++++++ src/image2d/Closing.java | 42 ++-------------- src/image2d/Dilation.java | 47 ++++++++---------- src/image2d/EdgeDetector.java | 9 ++-- src/image2d/EdgeOperator.java | 12 ++--- src/image2d/Erosion.java | 48 ++++++++---------- src/image2d/Filter.java | 42 ---------------- src/image2d/FilterSequence.java | 48 ------------------ src/image2d/Gaussian.java | 45 ++++++----------- src/image2d/Grayscale.java | 15 ++---- src/image2d/Histogram.java | 29 +++++++++++ src/image2d/Image2D.java | 14 +++--- src/image2d/ImageReader.java | 3 +- src/image2d/Opening.java | 42 ++-------------- src/image2d/RGB.java | 11 ++++- src/image2d/Threshold.java | 37 +++----------- 30 files changed, 195 insertions(+), 308 deletions(-) create mode 100644 build/classes/image2d/AutoBalance.class create mode 100644 build/classes/image2d/Histogram.class create mode 100644 src/image2d/AutoBalance.java delete mode 100644 src/image2d/Filter.java delete mode 100644 src/image2d/FilterSequence.java create mode 100644 src/image2d/Histogram.java diff --git a/build/classes/image2d/AutoBalance.class b/build/classes/image2d/AutoBalance.class new file mode 100644 index 0000000000000000000000000000000000000000..d94f79c96b44524630894d233505336a3341ecf3 GIT binary patch literal 1565 zcmah}+fEx-6kUh84|ZZmCKnP2Ng8U5Yp0}{l0w};D8Z>6q^1y2BGIuun4w@>!#KBx z3aKcK)R#W>15l;(v3-H4iShw`=`Zv{(~;wb$O`-~ajT6@XFP zwvoaW8z11R0oR5i4+=iiuQ&fB0I<=GF}Yl`aTFgJ7?+0$8y}+}txpVGH!vxnPXvu1 zDhMd);RONpMziJ%94!S6|8{$$;)h>&m34Z0OUXw(HRq)ThweJ}4li1INyKh<7Y@k75>ly}F6mx=<~eQ&+Z zWP-K`NNzcX3JkpcvVgrzCQ-8lPJ0YfRbjA1u%Q&rxr-qgFd2^E=IUSoLQD zNiKCjz?{@8fgbc4m`dOVP756A2tCiHJ=#oQ8lNUGgPRG=%H@;9pHgNtk=RvQg|!$8nwwV^r)hdUMd#ju9|f} zx*OD@)p*F5&!S`259+H7si%vCaq_x5u|K~##oL6?xGQk+kZ$lcL+YC`9_KmjsrU;} zK)&eZdW`2hcfnoD>_PlWqYKBm>ajBkhj!vM04H#gCrfHc4=;;zP+`zl%REO{sYl?Y zU48*&aSv)%*@aeC3df;mc46|dR=;chFs3T5=4jbhJGk6G;%K?A3jI$`s%zi7x}*1C z|0g7~jz(kd87x|kKDVujXZwF-e_4$94F|Rrl*86 zSU^AS(Oq-|5Klf8s1HP1Zo<0Cx?`I7c*v$0B7Lq#}K|g$u+f%yA7D z@eb?0L@evyXAs@Mkb!sk6J6BuZ|;9VAD?gU02KM(ryTxsL!rKbaJBaI|X z6O}YF$eP&UOMh7>zCzOk@peSxHGW+1y@&X82|tP literal 1418 zcmah}OLH4V5dKChOL()1ABoMw;5cy}lAK7f5+GpX#E%$EHi0Trrkqp8+OaapX4kA% zhH&7AC#v%W68xRZkDmEP)c-Q zyB!6!rr>nUR|;ePL%pjT-PDGS#U#;BeA`Lq6b9FAJJM-4F$x!7b!XnUk9FHLgT|^2 zQ(+8H*jT}H*4&#oE+8Huws4)3|9gnZ4y7lOe-s#tz zj+1shGU=AlQK!BhcaxU!&8`U-qbN>wYU7A4PvvDp9km;u?V2R9fnnDYc`#9+aI$iM zsZUpRgW>IrI)&kXM-`5>P5OBfw-eK0eWz08la=OeWYY!GQdyIHH;2QDoXqPFTbBp* zu!372CNS>db-dwW6_-7HEWS^`N+*s!o`<*bj)zZi+ruTfS%**1uUHKaV;Cpk7x^nT z%s7yghKCBOe61J3TM6lpqeGrPMvj+sqlizl8tOLp@g8UD*l#(8+tN|Xgt^}#3EWXm zdzjy?ho&Vv>ga&fj`epe=RS{BS&x)$V3xmuGJjYOzXVPR;R6b9QY+vsN|Hobq>m)f zH%aSzW)yhdt`+y7YR(=CwV$)E(?jtYYP1HPVw#5|fgVb~qde2YYkqB$cJV$lp8x%) zWDbZ>Ge5GNgVU6g8KiLx5Xfl)Y4W_m<|}N!M$Z)QjOXof24`sz2&Qq45YJODqTpV` z1!^UFF7i}DJf%QiVx~ZM1sf3!e)$uvLe|;MBGVXTttoo*F781W7d6bVj*>0lU8(02 zwc>epIFLyn938m__r7?@O85hB<$VMfSZRvV%d`7Ej-uwyFe+WXlc{(%Yx_7>`xV~i zK928^+>H8(J)EF(Xmes8!##{p9~J#1^_SD-yw+K1g#Uk|eEJ62y+Y1r`MG*%;^x7` O&1@}X;w$W4!0bQ14;>=_ diff --git a/build/classes/image2d/Dilation.class b/build/classes/image2d/Dilation.class index 2526d05f2ee96879246c82ddbcd01c78a2188c3e..5f78465fe02440cf3bfe6b42b4fe8929cba9cfbe 100644 GIT binary patch literal 1494 zcmaiy-%}e^6vw|e`{V9zHZ)LgERdkKR3TWRSXV7=S^?X}0j;#t+9z0&g)9cbgix^K zbUMm|jx)~m(N|vjpbz@eGCJcQ;Jg2Ue?@h~@7)mesSx&@bI(2J+;cwn{{GJ|zX6!Q zRS#*5dnn-z4{u_^gN?VeI4|+G)`15P?`Z2?iT5Nf2-p|n^|)OYFh)ji3z*Z*S|o5{ zHeQcD+FDzRTDQWb20eYV&1%@V9kybdM-tKq${6mGXmNn~kiYk4_pMYW2~o2*nSqZI*B<)`&3znHBpB*6kh&rcUf zEo^I1XI_gl@Z|Z9y4F!s0&Xj;#ao*UGt zJ+2|S&^eAZx8quyjoI}mUa7Zf9PJ!V=iO{>wW`t8SYys~365)GK73>(CVgDQC5f_+ z%edm>eN6e72B*qDkE_m}@o^F_`1k-b0@>um|6LPZNr6VVzEb*lX*H^{!E`rj{u)n^ zD^Z)q9f32)QAsYb=f8q;p&s1eZ4kpq=Z+ngyVD`U2gl2H>A2oS!=Q?Oh4yB0C|==n zP4j63283oo*~3+dT2NcXrw~8WNZ|yfoj5bd()K$6=tUn_o~A$#lf^eMxeGip0@DaA zBd`mFdLRo{BXE?{4qW9bXAjHT_LQgXTXeZ~+FpH8$vu>dgUVgZD{pZhsUWRPmCk1G z_u}BeK3G**Tsuc=OW7*j-L!W-@%Z3}U6=BEWoENG%E~%B50(A!M>b_7gOn4Q<*JuM z^}%KPJsjX96kb9OV|WphIE4!OaTf!KF^GHgf5H7P8KD8(=a3bgqbEm(!}ydrIf6Ka zRem|vBm(9SP-|S?5K(u^1wmE)KUydurGMf0{?d&j_pfk^>9bgTZ_ zs(>ib8S?`_8W&LeO8vJvOf{>XKwH@lyc=uFOJ4ZCyVT%Hw%n|^joWVMOaEw5jp{xV zWy}7uTl0phg{ywUjr?XXDqt?Vn-gJkEvO3g_Lc9s>u$l_hzfCNVRG&6T`%;iCAo35 zRO+V|QQ>`$w=bZ@VFG8LzEMC4n;W#1W`p8+AhVH&`8`1aV+@Mytx$cFbU-c-?O5&$|*@Bj1x`Ps?jnkO2(T=P@YfOv$KVUPr zR&88Gw}ERmrZHn<79|_+f`oHV>w-*p-9{O6Hf|tm;|#iO+{AT(%yIr>1^+ve+9EGx zwSDsaX{~wDt(nPdn~@h(J+{6zJ~FOr&Xsr+Hi^{xlAfm-|6#(72`JIz!t4=1ok8(i zX;s{y;x(olE`f?W0_l~oSqr^YlG9h?6Y&CH^bCJ1f;XYiDx9B22dzVI8Yy0Yl|O*U zcRxbvXL>1g(zY^I?ozqW%dK_-t1xs!CB)ihBMR zq~u*M8ght=X(ufw5Ak{8n~s_IA3Ji`wg9V(0k8{|k$k{#*gFJ){RU@$x2mN=< zt82%?(1|Ha%9F)_cv)40l%^EBd`V3K%?j_VqITXN3@iK>NgmcFb?p{D*|ENCJHO6i YhZR;e;!A6>CdazY%9Pmyb7#^12S$@0cmMzZ delta 384 zcmX|7%TB^T6g^XDYs-jQP_b2f0BQ>ffq!se;v+F}VRS=;7#2!{Wx>Mu4W{uojBdb4 z;$FYVmGMkb=Vs2m_niBf%!mGDG(NxI-T^dGwPC?Cv1&tur(jJ%(Z)J9RJ3Vg%S7p+ z{3SEp>(*80co2nyD0W4uVIw1uPuOO=zSpK0cKWTT*Ow@xBC(B%i5-buI1)aB_(as= zN8!7FJ*PL_Xm~4NUG~D^z8W7-#QFUUAEk~40WKj*W_5Z&uLom@mqeZ=8VQ+2ma&`` zU=H)lEG)nwqnhuKrUCv0+SwSX5z+_$p?(;=!Z`ZPgNtfy1oN5I8q@|S>2&yzJeFu4 h3dy!$IuSYYpjyNtRl%FXGLb*Zx&qY{*_C9T`vaqwHP-+D diff --git a/build/classes/image2d/EdgeOperator.class b/build/classes/image2d/EdgeOperator.class index 3e7ec23e09c822bb84d42e08ab8be78a98945a04..c070cbcfc3503f02dc932430d2956f8bf66cee30 100644 GIT binary patch literal 2215 zcmbVNOKenC82)6nx-iDD!KEgK5)fp;M&bf>Z(PX26~?$Q1Y5szrce;9#+y0k{I7Gq@BhzZ zZq8o52A~OVgs>F5ExcrY{VNUp%HelD?64gwg`;cx;}xgH9zDD$~&`TUf1M_L9cK)HJGEN zsxzNX<@!>EtkUO=zT$9pLa?MWdm@$bnuZ$NhcaIGxK~IO^Mz(X)T7>!FJ#Z;$BL<( zz+YQ;^k^H$iTt2P-O!q?!uq^IF-r)}($3N{+5DKGt+sO{bu!hMI#q1cNR4|Yk0196 z-cUl}HgggF>J|?Y$T(YqjTkb@R$$Ap4U*8XV#)EOqCsMX46Q<{k``1fEZv&V>C|L| zE(V&%G$X;Pg_tLC6j&NUWc`lpFD237xf#*HrxL=oQ2?@4xLh3#Dh|Qe&CM?!gf+t#ZnE#s2J2aabQQmOn^C zhnLL^(`nWw5(#zgN_F6RJ^S{sR1BfeFR1yKt>a_+ZEbCJEQN34 z%>u!EwOTVvixYf8qhJk|@UE%P2T>JdznoelN8#wNpMiWqp$se7o7xz~O3HRA08e8T zwIEjG8Culj2?VsS-Mosjq+xz#C5;%2o}@1Ze^1h{wWVCgS+te+ z^d6}HoC}t~LmYt^S_yKWKr3x)uvQbO`40pX6qlU`*K{;|4AuhzC93n0j}ur$0_&bg zU>%+!hspsT^p|XbFR;D{f@tZ_Veqgh9beJ49ozBw2F_zzX%Qz<(kAL1zhe(LrV|;sgoqn;tZ64&QE{dcbMH)V zP?H9lRPex-(eydjastX7_y>2u3DW)Ksllm;T$npMWwSr&gd9tSRaBgI0$K>1e%A>q z>D>W0^uGyjT%7P@?uQ6J=6jTIcrn6ZCp68izl7)|lsn-CIlaTKwqvOH@Dl_$C@uQY z$1tNi>?^2BR@>)FzZpEWGuptdFqcIyB6bnZlqnZxw@mrjuWnF>*U&fTtUjc5sKf?d zxCYc<6E9gKwqr9|@EkhvJRhE|7@_5T?7(N(i5s-tr0*6Z?(o$8i8cwNT~?q&b|N83 z?3YQ}-bSmuhc5XPhvW)hs2eye-=I%!p`wg4q4>ZUuj_I>|lNV`(i0ctY z6o>E@YAHpC@&W27*+iN5O4$SN@AtiElIy5voQ17&l{v+E=eNscY@`%Kv&=BZI6`QV zFPUi^VKUpsd^dCD+r-(z|M@7^%lFJL&UacB61g}@4|l%HH==+ V_8GxB-fi>Ii2y@MqD3=$@h@M6z1#o* literal 2350 zcmbVOUu;uV82_E!_TKjP_IATwWI9nq=gJ0!36*~iWF1>^FxX(DPNjG4r7J7z>^c}E z8XlG`A(2;nFq-hftC|RlD8ds7iElg^9(dA3V?v@afe_~JoQ@40GUH9pIp4qYeZTKJ z=R4cYhu>TU(2AUi<=AQ9E&cnu6!6opagv|DQ!RjrU1&FvM2DPqo9INBi4^w8>1};y z>5eiq&~2g)d*!rGTJ{*&Z{UD{zP&J7sI&=aO|gCfUwbL%2}HUJqu#!W<3nEgpgUBg zWLbA9>lXXnazXNQLSJRLFfOpXyKvmid#$;6M=tO6jCp0ZQYvo~us!l!rE=kPX|&=N z1^i91!NDZg@zRh-UQ?VU&HBA^rN9u}rIb}Sh0>@%vZ?!+d%}&oCo6FkDZXps=uxli z4Hag)i_H-iwF~*VNU<@(BQRc{V3=z<J7Apj529pN*EF8ok?zPa50SkvQU?6Sb9Sjv-@*}OSn~P$s{EuAdK!|OvTy~W3g$l!m~~OxitcDW-ZON}%QA(Ac~4KM0s}pA zbcna^6z@(jTN*o+lE)~}w!}FvdBTCbR~abeD#PkJ^QeOqba{pRFp*VD%^Z3=cd^vD zQm0o@a*rWs%;#?&dG(s2bcWq>&t3YY>Cg)tAM3VP0RF_e{r^2!oWR?|XNMf(v3 zYFVgz%`*sY^|f5}7ZZLhp*woL?-I-l;*ORu978gp3*rYY5zrDrEn#Yjke09~Q3oB9>L+hCr)+U?_Uu%c^9d*91f*GQ?W7Y_L}2oaV@m2wCK3AIfY&}9@FMkN zfEVfh4%m7cV9NHBike*erBePtPk5|uD>OIWoNxei;_R%~m1VSeV>cT8f%crKH0qN~O|hNkEkOXuZNGW@q!sW`UvChYNJg zZ)#CxT$3ZP@?2ZpY^zBDuNhY2jrH4&WG8oZ-))8EFJ{8EWEAodu)?*q+E)UX59@dI zu!fxZb~)zUj4LfRW>=$lx!R&}@TN1JyxZ7lmZKZ7rtEhBj%i>%d~`dQ@Np5B929+A z#uXn|G3nzPI8^p^SatN2k7MZbaUD}U)1=_5LlQ_Q@wKqNT$o*4iOOs*wZCcZCJQ*r zQH#a{ffI)@NsjQytAsP59^2qq5W-0Ngk7e4(B{G0#-sM=xU~<4n@ai$+UrSCyu-Vi z;=Kk8kPNyhk8o9>7SvY$1;jHNUFe~-6K6NlwEgx5^x`O2QbVAJ!Quy)d<#73#a>`) zVQFFKa@D}eS+&4bZY%JVr`#PZX@H0OqEKf zA2QdYT^NC>EUw*ywWVy8+J9+pOYwB?=WUPjCuOG7TgpniTaT6f_!qWjB;ynlnTEw7 zB**AUhUh~-6o!%E-}?>Tgf}ru&pZauz#zV+{~Nyl4sRzI9&*%KoTVp2l6ic_m<+QG zVTF+ycp3!b2dK3*NS`MA1X)^LiIt;eu!|oVl_5Nd@9`Ebiyi4Y8G`S_w>+&39Oin2 z6{+1VYOF#<<9xgBKtHCiXHg)(>HK8LsM5bWREHsxRa)~`(1Mw(~yU^$Bg zB~J4~jj-W7+dRYXyC_mlas3I-CHUsp%rJ-5&>SKeOQ6}h!2@VB%%h=MxW#N5n&f|T rl$OE#SC~yh>&JQK9^fvGWeDaT(>Wb1T4^e-c!?p6M6efqtIz%qZkiT@ literal 1629 zcmaizO;;OL7{~vY%u8lEg%CO@CG?G|5G*NFqXMNu%S&u%l`7h@C_^$$riK}u3@>$| zU9ha1t~{ROhA!B+&~q&G*mGRD@;``hmThVik9 z3@#aH!#g_OHIc$4DT*fE!}}%-d?3Y$j#0UeNyE!hjGGi!(U4gc;=esx7R+ioHQ)juslWaMtIE@7-^rU`ps6=&-f!fR7 zic@oktA(jBXnKJ^DqyU5{zMq8`Bj15zVdx%-6=R5Q6aW0Os?I#=Z0>zB>hH9rGAzo zDtzwq@dVV^OyJbZ9R*Thut8Y~8myfu=aXe7S=gtzMOMbXi>JqT-qz8fvOj^7--6|997x9qOFjS1fm zA}1m(5&p65lO$*o1 ztz*i>D4f( zg>I9W%!=bz+{SdnAz5*Uu$ys4oaHUg@Q)(+kO^gq`wpC-w5d&_gL&Y(^+iAysQISHGLd*Y(7WveR zx?G}S+D^;O6MU8EhHWJJqRm%zn|gi8)}LVNIa0UxpbX^f^iq#)EbT%qnzmw_natOW z{mnCIMa5RBr;l{i)@<|erM6{=o&D{tH02{($z(QdHIv?aXloCDVyUUP;SshhTU6Pq z$rjt#Y;6QNUX~u*#VG_hjc;)Vk9hu=@4v_S7|tr&zKaXA%+h}d4(%nnv)G_l z7HJ9P2;B~&oQVgsLyK$-b_eIUOR<7&^m3;#&X0_q4eA!?>O6N$yw&T&5059scau(kYvlzTY7i`FfTWdGVyDgWqFerEWD zX`UT`$yKH|$)*zp_I;5jLu5M4|J4xYdG-a0F~eDwc7c6LavJ$xiOH$5+#_;}2jo;N z;BDHqF!Cq#lH@uug+X#vVm7Ct>@$dV$VLK^Xgb6ToR?e*46KpPMXrLS$h$xMA0SmX AtpET3 diff --git a/build/classes/image2d/Gaussian.class b/build/classes/image2d/Gaussian.class index 46d5c23a1fb40fcc29c4d6f6ae37a55ad59f51fa..9d7347a5dc601eeb4462df1ec92d657edb0f7970 100644 GIT binary patch literal 2144 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 d7xYCg{3b5mBaFNaLj|N|r%6LN`4{$$-97*S diff --git a/build/classes/image2d/Grayscale.class b/build/classes/image2d/Grayscale.class index 87d617916db308f28345f15dae1a39d58e50161a..52bea22031b21167a84b2ef3251daaa98ce89a18 100644 GIT binary patch delta 523 zcmXw#&r1|>7{))}`MEocIcq!q$lbEkwApGZYqAa=0tq5W>flA8Z4uE8gV;(sqz9o} zAXCsK2oH5F0+SB?0iF9lIv1fmv(>;n-{*aw_kF+5`+Zsd?vH-k|MC^Mz}0|5j0KEy zGGKzq0!{@aG`1(}^a&pGzSb zmqVtxlK(LM)o8W(xS8H>t}Umx?yWAhI)+;Q#;WDB){T^>A*?7$bsC*+@)`57EB6V#ZnB5N;^E%{s>F)Q^fRE0noUJ@zH(2JJ*=DdOg-7f z-eJYgoY)a}c9>7g?3rg#o zvAdbM4NZyNUBWHLygzuiWeZ<5KIm?n!f!$#tl-LVubd9c*0PzJ&`2YX_ delta 762 zcmXw0OK%ck6g?lz1Exa@$W$rRwqkt%7Nv@{tzfGGZD>sB!bUfaFhL3(;_yiALWrp` zX-p%*U%*0lrfOOn7ybam8I?oO{oGe&^0N@s)k)%fYA50HU}d!HKhW z3?L{Wgs_Bjm@pwC;XEz~iLaC0Pe}awxwZM|$BK}6UmH(KuhV8x)NGs-aZ$vj)~yec zJ#VOwD_OOqwe~ad7(<|JoD#iipcd;F^p%%*(irDF#i1kZrkgN~>m4^Yr-E z+mUwKGT2~{vZ|idN@gX-NVAiU2UtK0;U+vnEJBu%<%1u=-gVO+LZKUUKp|iLSAanr zCB|?JUK&EpY=P=*6nhcmc3=tZ!MbRTaS9jO1=r|c)f(d!o(SK;y^z8w{2qjusEAJI zx(kO-o_in`iP?J0Ud$@u|4d&oyA=}@!RcHhu&p%}p=t7X*c>#x3&#e}-W+x|IKr1f z>kj%&u!OhiK~{JgWTw$i=mJl2C3r}If)k`7ObV7Ugop5>h+$MIzE1fjM)8bJwTVDi zd4|+2Q_T>3q%@41*QEZZFzmXyK6aCyY6*X3Xkgo z+2i)S!`yvV@XFLh9XJ=^Plkq34flx8g|N?&7ReA1(~x(q`;2l?$~X& z>%TP>MhR?KcBjkUi9c67ytgjUnc-naF#n&2tJe#4erJe3?5zOUj0kO%QJG%oL&f)y zw|?574f|jm6FkR$70|~SMKOsfB3|~B9Rf$V5v*o;3Lashn8|*C zwyLGIMB=51(^spZQabcxS$np57?jtiUk?Mc$E7!<3&Oj4(Wg$3*hB(J%p!#x&fz-J zxXHLe{0?S(X;oI`m`@PXSP@~~-+6sGJ~wLIS}>rUJKQ5XXPB%p(gSrA-cE3hd5L9@9EQh{@v$)dj1N(E=vFT z@6W#g%{;TIqs8Vhts2@wwA*xWB-r}*yKi2--TbS~QI6Rhr_-iOLpLAUoS;W>GQ=sH z0zOupwh41aJG~mtDn7A^XyQ-l3vo`{&uscRui-+2PWn8bi+rKsOYIJ5@D!J9YG_eh zUjA*?=&7ecG3bzB$YGc(28API-f&_nHkWMPKAIXzJ4vOicE8^Aj`Eidzo1 zSuhA5NsLb?gfGn<#iGMqzH<0l!#$Q1_Z=Sa(BYAW$1FKK;i-Q$?@eVm+i&w=tkavB zni}!O4J6|mWS&G zGE}(f-0HTU*qAIb{>a6|t4wC7axKZMUe2CivtX}`3Nk<@MT97pIVce?LX=WDX_PIL zu>+U=l+#89om9%6Dw&*WF3Yq`QY-gT&kNCFS+rQ8F-@aTcI5=2NhlENAKA(WB3A)F zu#FEzz%bvjofvsi=36PUQ<~^yNdAmnSW@5uyV*mKeD<<0Cp7J{FCcvRYt)D$wLSlz g#Lfn`5^555-9a>$DXkyKc3=>fUJQ8;iXY(6f0V47BLDyZ delta 945 zcmYL|TW=Fb6vuz-?0W3Y#@L1=EO!C~2L}vkxztdgBq^kXPzr^baLGcPkYGq+CvgK5 z2Pm{$TB!WU146v?6@l!CAgEL-B@v}!umtwC?wT`dW@U=}yLrB9u zn+V@%>9X0+0mZig4%*amNb#M`Tv8eiYia9N9I;uT7a!$Vfa7}ZvGF*e<)jYk4U(o$ zOTWfbS_Tw@HZj^2ryo8THx9>XR%9H`aModnVS~`X8LvN`OXM>xYX*n=6(bH=at7gw zqop^o(;Lg>20U31XVhVgaf8SQXV#m@o%Ay4;(fERMu+4T-#bh&UQGK|R>e72yzQ&+ zjdR}N0(plYxM)y2=#6^`FF%^tF_i61XFI)#p|Md#!C{h12L9Ic+0k^?;WAegKRR6H zn!`_8e&)L3hQm#6IsBsKSFStU=1$SB`X^+?+B%vJ8d%=&aAu;|W42mmOf1EqHTmd{ z)nOE3@(cCn!;o^DMOTAy4htpLzgLwprto#fOH}QNnq8}>u#)C9{?r^)Sd|I7W(ixH zs#9egO*NWALbEi5HAPZZnW)CuNz*l_n4_(=sc50DOnuUtW^T$g%eYCuYxzsebFC8d zr&%Cb7M564!RTUFTuTnQmQJ)Z9O%(=L%5-*#Ipa5&5v20i5M?uTtX`{B^q5z0#`n) z9CM9m7qdmfm=yn1(Lxh-Y^0ucxn~EMN4H$AJ{B^ z*G!LC%Q~R|FXT;pA|0&ZIiIp#dK%^_8zgs?>`-D8pUIYeGLmeT4v)xATllLw+3Xy~#;MTw5(iq=+T{x3D=bd-n^D*c1(63VK$Di+~z)dzBBg|PYI|8ma=2^&? zMN8AN~#8}DDod%ezXH$62q=Xu1c=P^&xMv#;}Pg%9Bd7iPJ zeh7X}yCm*y#rym1BsPrAFSPz=deM8^=_cvN@Oe5}czJL}|HxK=Q3qAoQQabWBR{Zs zggMNg$7Ba{vcg$m|4+a;=X5J^o(VBo@K-`@STU^=f^DS;k14d8rq949!Y|BhnG@{x z5yhp0KBYdcI+PhN)2DpQaPymT1&{8N$Q7KfELTwdM5LBefA91QkF{FtmPGr*5KucgWy5b33 zb?4f|t+*&ej1S<#jW6IsxHQHyMWT0d&$;LOzVqka`5AfF_W0}XPhWshRxG+mYlbaC zj96s25FptIIWB50S!mKGqk+F{G8XtN7FQY9OjsP_n#rWel*M&!Xl`nzcb%wexg~V{ zsT#<{=~md!-Is2zQp?R%);*gzGn%~3ZSL62GN+lhS>SH{vq~%~I-HujmRxgvH|hGx zN6XHn%_8>{;pAGa>Sb*l3Yz;i513JOHjA&j)pBn3)iZC?uhgnGOBCuqRN2%#v{|ND zUkQEBM*m5RueW_~Lt)fj_=>o5G~v=#rRo>`EzjMkFBtRruA%fH*K8m}rCOdkYAQGS zPp{CMLH2r8VU<0<;B9ZaWv~9mc(T(ej~c8H(u{7gCnU;=SK?cT_fWe{`lQ%!6YQWz z&i0{z1icbPIK^o}g5+-)@V6p*BvE7392$qmjuka~R^f5s{ vs|+@$PKtg)ursnll94Tu6gs&7suW2{;jl5&NQ!?}iNhfy> diff --git a/build/classes/image2d/Opening.class b/build/classes/image2d/Opening.class index 3c551211b8309580d22413827ac64673ae5c3eef..6e6c0148c68c2c4cf7c72c886f187abaf7438c0c 100644 GIT binary patch literal 532 zcmah_%T5A85UgGvD=TjmRMf;9aBvf@7)^X7$VLttu4aG%hb+5fSv3BYo-`i(06)su zvtVL8Xdn7fUDc_XkI%Pv01fO~NMOT431thLD4W zy|BeYXh$sjWIi0qKn_}3(`?oL-m}BoNJrTFk4XW6S_JFbp9g(;p|tVz($j&qkwy}x ziAow7WKHbwOMh7>Yxd6g|)5*kl;U2PAw1LP`qQPHPiGX-h&NA%vz3P$^Zabj6G3#XLHU!+4w) z7W|Oz+D$iI6p1(zl~C7R^e44FcgBRILR6OTyYGIUd)~GG{QK2w0Cn8$$5GTpToQ5F zg@;c>yCT}BMSSL>h|lG6RkRrqvqfAJ%d7;>6>;6g0B*Rv%onlXVi-4yxT#QxbznPf z1+}c;w9ONR5&x0i(zQ-v!`gft>!-eLCo>BDE4CTwq!Sy33-5}V_3dNbH1(jiWW&V7 zGjq)9vr%Av;Hft^!>0;!r7Tr{pVZRu+Cpbz!^9?7mgJf8``rrpo2`Hd27DWtd!5JY zCjMHlhqMg)t%eR)b!_F{Gv;6J){TzZ)s{=iXCJGdely))o z=qj($y^&Im*hIEB+5zQi35A4y~tK0&`@H9U-9ln?SI|5n^; zlLE=8c_^XGVcz%_ZJ6@2C%lJ|DTEZ|1&DQ_5FxR9*#J=DExuqR2K*Q${O$a2h8~8pT8ut zPlTHKjpZDip&U;kjiQf0&JakQ=XEw;Wcy`WCKxlCwZ{iI%Nv1U5+4%cIqG@j+{-vm ztw75Ko=TXf6zB`g6zHyCBclFqUhtMnJG-f868)?-L2K5<-R+--RrR*HJ657>GE8r;#sfk;9%uc_Tmn8ty%u^kL{F+_b>^dr>YPM7goWu+nh{|)o$Yh?E#Ih*F^(w>RyyA#*b NwUCJ~vU?8G{{qFF9VP$( diff --git a/build/classes/image2d/RGB.class b/build/classes/image2d/RGB.class index 95c53d828bdd6dbfddccea69dfc45c676e0211bb..222be37fc9f509eb1019149724d01ea50ce832d1 100644 GIT binary patch delta 199 zcmZ3-dWlW%)W2Q(7#J9g81%UqI2dHO7-SjbK!iLOg93vhh)@D?mDw3o*cntO>VB+#xjThV?9GF*JtqE?msR6oP-oEKVbEmIU}wDF@Bm3M238;`3M9oC WxEaKOP=Y}PXh0T|ExQz0l{5e)6(92e delta 146 zcmcb_wvJWr)W2Q(7#J9g81%RpI2fe47-Se^L4+I^gFJ%*h)@J^mDm}S*%?$O>VSZOCCGs$EGH|gosPZtVF{tw}XfUX= nGidTKXfbH>FzA2?T?XyRc8t>)nI>OlyvfPPAPIB=6N3~00xY zD&SA9DgF)vjW}oEyc`TPsc1HE0WAhvrPF4h9Z`YIq0#t2e??y~HaOltF*r8TC*T^6 zPsM{H@w)@T&Yt1^-pS+xrJ%rG5{*VnuL?L1wsf^M38(}8lQga+KPaU+6Q=!F*7l)^ z$+3a)_-L}*Ql4OWvRnBn5UeVVV>-PcXTjMP*o62(!-5Qsb`wm8i?*>BfJ|i3b08as zh;Xx*gUw7j6WD@fsn)&?r8}?zD}S4|342&mLJqehu#tdu88IcKyLGv?jHZCw;nugH zHsrZnvzbWEHRLUM?Jr(KrxRI$O^Ntju4%tZo1XX2M|_%$_isR3(8Wq>d%?kR)u*ko zBE_sYY_^jHmG${pVKLk&hZkXb%?ae91AcTNA2Af-Hu)H4z&!>|;kemm7c_J-nHwIG z5M%V76-Ee$i76-bM;S?#9LN{>&CeArUc1=+H1LpphVTbfPUV;5HH3anEO$E5=y1|!ba3qqe76Vh|@dmyx$Kd>~OvewlACRe?{s4bLr$51;U~TDhH(;^TDZ|{m=bn4+x#v9RIX682 z>*rqq>_OH<7)MO3$59hK=rwT+$HmlV;sj3W=ogDqCUl$@Q$j2Ug#Dm_A)GPsKF;bG z)-fVMJDAO9y|@IqrS+TyrMHlBC9F?m^X}lx^n_a)aVB!qY)BL)o!mL6lojh`rQ&6> zWeFP-*=Z;3?ny;QG9|a1DdbY!5>%&H%w3ldZ%JHnW}T>W)r$h+Qz>*UKF!-bjBq?>SO-Q3Z9zTi1twvZ3RJj4b0KVcS}8FjIY+7hRqZIrgorrnoX^ol=kMU3J|&7ncdXS4fwf zX$gUG0g%UFax7(ehANG-?<06Mo6dNvMd3@MuL0+pj=d6$iYHHaYFaBkaZ@mx_uSH~ zxXi4;(U%o0S@)U%9irwIs&&{#F&n83zzT#&%I_yZy{GG zS@;l_#o?p{M;K3F(n2>5>PT5|F{LAIA%moZYQKD|sYh=sItIlsB{aNt@9(@xz*Y96 zY=!Hrq%m12Uhfy|WU6V`JD*K?8NWrCyFtZCS3tT#9^QWTL=R0h z6$5NSgewWPsG}7ROD~|Jin{OG7ZJGIrSl^nFyxqNo9zow=5b4oh3pVzbsoib+q6TA z&|-?Mgu^$gvGhqyc?NyV-&jEKDU1b}G0Rr&*6QCpgh`Y5BdBuRw!*d7Vpd}~d@ZIl zhJ)8)YGX{ZX_>Uuq^%|6b%yZXxPZ`HNP4vN<($d+W}Web;mLkVgMPj>d@5}Qy@^Rg z(2UJQpdJU%fI&2pyIV-gw~#~=(%6n^>_C}Tvv?b~(1I^`=04AUi(Ni6Hwex+{colZ znI7WwQ%_xz4|qiv#U%aK6ZJB-(tAB2o2AuON*cejysaJ~*5)(Ts2-+(a~WzOH8Bd7 z5nnNqW`3)14?C$d7!i<#w#1{RjusuQR4`czEa)qQq$M1MwX#K>za>#vqRW*Hv0k;Y z`@fvMWYBH&Em+acuOXV9GC2^?nVR6hv$jQ8i8hvh$yxp z4Cty;;X=KW?=+hu%9O293UN*0O2mwWrk3YUD`G|TuOA{5u{w3zhy~{ihH(EURN27= zth0lU1#CV?@~i-`o9XUlzwBe5>}QQ)#Cksy?!>$3;;NhTLH@=0Lwp!#a0H`7`T}~% zo#U)`AEwaHdY{5goW^Y=@BjmZVG!T*m-z>tdxEoA#IVnydsxT2>-_2~JP}0)hskrz zye~>_JYb1;Q?hv5$G)8*0Qb4U&cy=RwwL8tkH?I;p3Pa!TlVvWOb?$k;wX!>mkfK4 zyDHbWnTz0G7g^oKU7gu{N`}=V=<{k1^d$zRl1n-cNC9%>C2E)GmsG2$0ut5K*H-<3 zUO^B;Jlz#i;5Xi 255) { + _factor[i] = 255; + } else { + _factor[i] = value; + } + } + return _factor; + + } + + public static BufferedImage apply(BufferedImage _image) { + int new_Histogram[] = balancing(_image); + BufferedImage output = new BufferedImage(_image.getWidth(), _image.getHeight(), BufferedImage.TYPE_3BYTE_BGR); + int r, g, b, rgb; + for (int i = 0; i < _image.getWidth(); i++) { + for (int j = 0; j < _image.getHeight(); j++) { + int p = RGB.getRGBW(_image, i, j); + r = (p >> 16) & 0xff; + g = (p >> 8) & 0xff; + b = (p & 0xff); + + r = new_Histogram[r]; + g = new_Histogram[g]; + b = new_Histogram[b]; + + output.setRGB(i, j, (r << 16) | (g << 8) | (b)); + } + + } + + return output; + + } +} diff --git a/src/image2d/Closing.java b/src/image2d/Closing.java index ddb323a..f6c2a7c 100644 --- a/src/image2d/Closing.java +++ b/src/image2d/Closing.java @@ -5,48 +5,16 @@ package image2d; import java.awt.image.BufferedImage; -import java.util.ArrayList; /** * * @author pratchaya */ -public final class Closing extends Filter { - - int radius; - ArrayList seq = new ArrayList(); - int index = 0; - - @Override - public BufferedImage apply(BufferedImage image) { - runningFlag = true; - - for (index = 0; index < seq.size() && cancelFlag == false; index++) { - image = seq.get(index).apply(image); - } - - cancelFlag = false; - runningFlag = false; - - return image; - } - - public void append(Filter filter) { - seq.add(filter); - } - - /** - * re-write for value correctness - */ - @Override - public int getProgress() { - return (100 * index + seq.get(index).getProgress()) / seq.size(); - } - - public Closing(int radius) { - this.radius = radius; - this.append(new Dilation(radius)); - this.append(new Erosion(radius)); +public class Closing { + public static BufferedImage apply(BufferedImage _image, int r) { + _image = Dilation.apply(_image, r); + _image = Erosion.apply(_image, r); + return _image; } } diff --git a/src/image2d/Dilation.java b/src/image2d/Dilation.java index 4c2e183..6e8331c 100644 --- a/src/image2d/Dilation.java +++ b/src/image2d/Dilation.java @@ -10,47 +10,40 @@ * * @author pratchaya */ -public class Dilation extends Filter { +public class Dilation { - int radius; - - public Dilation(int radius) { - this.radius = radius; - } - - private int maxAround(BufferedImage image, int row, int col) { + private static int maxPixel(BufferedImage _image, int _w, int _h, int r) { int maxR = 0; int maxG = 0; int maxB = 0; - int radius2 = radius * radius; - for (int i = -radius; i <= radius; i++) { - for (int j = -radius; j <= radius; j++) { - if (i * i + j * j <= radius2) { - int c = new Unitys().getRGBExtended(image, row + i, col + j); + int radiusPow = r * r; + int _r = r/2; + for (int i = -_r; i < _r; i++) { + for (int j = -_r; j < _r; j++) { + if (i * i + j * j < radiusPow) { + int c = RGB.getRGBW(_image, _w + i, _h + j); maxR = Math.max(maxR, (c >> 16) & 0xFF); maxG = Math.max(maxG, (c >> 8) & 0xFF); maxB = Math.max(maxB, c & 0xFF); - } - } - } + } // end if + } // end j + } // end i return (maxR << 16) | (maxG << 8) | maxB; } - @Override - public BufferedImage apply(BufferedImage image) { - - int width = image.getWidth(); - int height = image.getHeight(); + public static BufferedImage apply(BufferedImage _image, int _radius) { - BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); + int width = _image.getWidth(); + int height = _image.getHeight(); + int radius = _radius; + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); - for (int i = 0; i < width && cancelFlag == false; i++) { - progress = 100 * i / width; - for (int j = 0; j < height && cancelFlag == false; j++) { - img.setRGB(i, j, maxAround(image, i, j)); + for (int i = 0; i < width; i++) { + for (int j = 0; j < height; j++) { + image.setRGB(i, j, maxPixel(_image, i, j, radius)); } } - return img; + return image; } } diff --git a/src/image2d/EdgeDetector.java b/src/image2d/EdgeDetector.java index 20de526..622d6ae 100644 --- a/src/image2d/EdgeDetector.java +++ b/src/image2d/EdgeDetector.java @@ -15,14 +15,11 @@ public class EdgeDetector { public static BufferedImage findEdgeSobel(BufferedImage _image) { // get kernel horizontal - double horizontal[][] = new EdgeOperator().edgeHorizontal(); + double horizontal[][] = EdgeOperator.edgeHorizontal(); // get kernel vertical - double vertical[][] = new EdgeOperator().edgeVertical(); - // copy image form original - BufferedImage imageOutput = Unitys.copyImage(_image); + double vertical[][] = EdgeOperator.edgeVertical(); // get result - return new EdgeOperator().sobelOperation(_image, horizontal, vertical); + return EdgeOperator.sobelOperation(_image, horizontal, vertical); } - } diff --git a/src/image2d/EdgeOperator.java b/src/image2d/EdgeOperator.java index b0c5015..1654ff2 100644 --- a/src/image2d/EdgeOperator.java +++ b/src/image2d/EdgeOperator.java @@ -15,7 +15,7 @@ public class EdgeOperator { // ---------------------------- sobel -------------------------------------- // ** this template for sobel ** - public double[][] edgeHorizontal() { + public static double[][] edgeHorizontal() { double sobel[][] = { {-1, -2, -1}, @@ -26,7 +26,7 @@ public double[][] edgeHorizontal() { return sobel; } - public double[][] edgeVertical() { + public static double[][] edgeVertical() { double sobel[][] = { {-1, 0, 1}, {-2, 0, 2}, @@ -37,8 +37,8 @@ public double[][] edgeVertical() { } // ----------------------------- end sobel --------------------------------- - public BufferedImage sobelOperation(BufferedImage _image, double horizon[][], double vertical[][]) { - BufferedImage imageOutput = Unitys.copyImage(_image); // Set initial BufferedImage + public static BufferedImage sobelOperation(BufferedImage _image, double horizon[][], double vertical[][]) { + BufferedImage imageOutput = new BufferedImage(_image.getWidth(), _image.getHeight(), BufferedImage.TYPE_3BYTE_BGR); // Set initial BufferedImage int kernelXY = horizon.length / 2; // calculate image @@ -50,7 +50,7 @@ public BufferedImage sobelOperation(BufferedImage _image, double horizon[][], do // horizontal for (int k = -(kernelXY); k < kernelXY + 1; k++) { for (int l = -(kernelXY); l < kernelXY + 1; l++) { - int p = RGB.doGetRGB(_image, i + k, j + l); + int p = RGB.getRGBW(_image, i + k, j + l); // calculate a RGB by chip bit r += ((p >> 16) & 0xff) * horizon[k + kernelXY][l + kernelXY]; @@ -66,7 +66,7 @@ public BufferedImage sobelOperation(BufferedImage _image, double horizon[][], do // vertical for (int k = -(kernelXY); k < kernelXY + 1; k++) { for (int l = -(kernelXY); l < kernelXY + 1; l++) { - int p = RGB.doGetRGB(_image, i + k, j + l); + int p = RGB.getRGBW(_image, i + k, j + l); // calculate a RGB by chip bit r += ((p >> 16) & 0xff) * vertical[k + kernelXY][l + kernelXY]; diff --git a/src/image2d/Erosion.java b/src/image2d/Erosion.java index f69bd86..b88e831 100644 --- a/src/image2d/Erosion.java +++ b/src/image2d/Erosion.java @@ -10,47 +10,41 @@ * * @author pratchaya */ -public class Erosion extends Filter { +public class Erosion { - int radius; - - public Erosion(int radius) { - this.radius = radius; - } - - private int minAround(BufferedImage image, int row, int col) { + private static int minPixel(BufferedImage _image, int _w, int _h, int r) { int minR = 255; int minG = 255; int minB = 255; - int radius2 = radius * radius; - for (int i = -radius; i <= radius; i++) { - for (int j = -radius; j <= radius; j++) { - if (i * i + j * j <= radius2) { - int c = new Unitys().getRGBExtended(image, row + i, col + j); + int radiusPow = r * r; + int _r = r/2; + for (int i = -_r; i < _r; i++) { + for (int j = -_r; j < _r; j++) { + if (i * i + j * j < radiusPow) { + int c = RGB.getRGBW(_image, _w + i, _h + j); minR = Math.min(minR, (c >> 16) & 0xFF); minG = Math.min(minG, (c >> 8) & 0xFF); - minB = Math.min(minB, c & 0xFF); - } - } - } + minB = Math.min(minB, c & 0xFF); + } // end if + } // end j + } // end i + return (minR << 16) | (minG << 8) | minB; } - @Override - public BufferedImage apply(BufferedImage image) { - - int width = image.getWidth(); - int height = image.getHeight(); + public static BufferedImage apply(BufferedImage _image, int _radius) { - BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); + int width = _image.getWidth(); + int height = _image.getHeight(); + int radius = _radius; + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); for (int i = 0; i < width; i++) { - progress = 100 * i / width; - for (int j = 0; j < height && cancelFlag == false; j++) { - img.setRGB(i, j, minAround(image, i, j)); + for (int j = 0; j < height; j++) { + image.setRGB(i, j, minPixel(_image, i, j, radius)); } } - return img; + return image; } } diff --git a/src/image2d/Filter.java b/src/image2d/Filter.java deleted file mode 100644 index 2295de0..0000000 --- a/src/image2d/Filter.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package image2d; - -import java.awt.image.BufferedImage; - -/** - * - * @author pratchaya - */ -public abstract class Filter { - - /** - * Apply an filter to an image. The result image will be allocated. - * @param image Original image - * @return Processed image - */ - public abstract BufferedImage apply(BufferedImage image); - - protected boolean cancelFlag = false; - - protected boolean runningFlag = false; - - protected int progress = 0; - - public final void cancel() { - if (runningFlag == true) { - cancelFlag = true; - } - } - - public int getProgress() { - return progress; - } - - public final boolean isRunning() { - return runningFlag; - } - -} diff --git a/src/image2d/FilterSequence.java b/src/image2d/FilterSequence.java deleted file mode 100644 index 275893c..0000000 --- a/src/image2d/FilterSequence.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package image2d; - -import java.awt.image.BufferedImage; -import java.util.ArrayList; - -/** - * - * @author pratchaya - */ -public class FilterSequence extends Filter { - - ArrayList seq = new ArrayList(); - int index = 0; - - public FilterSequence() { - // do nothing - } - - @Override - public BufferedImage apply(BufferedImage image) { - runningFlag = true; - - for (index = 0; index < seq.size() && cancelFlag == false; index++) { - image = seq.get(index).apply(image); - } - - cancelFlag = false; - runningFlag = false; - - return image; - } - - public void append(Filter filter) { - seq.add(filter); - } - - /** - * re-write for value correctness - */ - @Override - public int getProgress() { - return (100 * index + seq.get(index).getProgress()) / seq.size(); - } -} diff --git a/src/image2d/Gaussian.java b/src/image2d/Gaussian.java index c40b5f4..2472bf6 100644 --- a/src/image2d/Gaussian.java +++ b/src/image2d/Gaussian.java @@ -10,20 +10,11 @@ * * @author pratchaya */ -public class Gaussian extends Filter { - - double sigma = 0; - int size = 3; - - public Gaussian(double sigma, int size) { - this.sigma = sigma; - this.size = size; - } +public class Gaussian { public static double[][] kernel(int _size, double sigma) { int size = _size; - int _height = 5; double gaussian[][] = new double[size][size]; for (int j = 0; j < size; j++) { for (int i = 0; i < size; i++) { @@ -47,15 +38,14 @@ public static double kernel_sum(double[][] kernel) { return kernel_sum; } - @Override - public BufferedImage apply(BufferedImage _image) { + public static BufferedImage apply(BufferedImage _image, int size, double sigma) { - BufferedImage imageOutput = Unitys.copyImage(_image); // Set initial BufferedImage + BufferedImage imageOutput = new BufferedImage(_image.getWidth(), _image.getHeight(), BufferedImage.TYPE_3BYTE_BGR); // Set initial BufferedImage + // Set initial BufferedImage int c = 0; double gaussian[][] = Gaussian.kernel(size, sigma); double agv = Gaussian.kernel_sum(gaussian); - System.out.println(agv); int wight = _image.getWidth(); // image wight int heigth = _image.getHeight(); // image hight int kernelSize = gaussian.length; // size kernel @@ -67,21 +57,18 @@ public BufferedImage apply(BufferedImage _image) { for (int j = 0; j < heigth; j++) { int r = 0, g = 0, b = 0; // store RGB - for (int k = -(kernelXY); k < kernelXY + 1; k++) { - for (int l = -(kernelXY); l < kernelXY + 1; l++) { - int p = RGB.doGetRGB(_image, i + k, j + l); - // calculate a RGB by chip bit - r += ((p >> 16) & 0xFF) * gaussian[k + kernelXY][l + kernelXY]; - g += ((p >> 8) & 0xFF) * gaussian[k + kernelXY][l + kernelXY]; - b += (p & 0xFF) * gaussian[k + kernelXY][l + kernelXY]; - - } //end k - }//end j - r = (int) (r / agv); - g = (int) (g / agv); - b = (int) (b / agv); - int rgb = (((int)(r /agv) & 0xff) << 16) | (((int)(g/agv) & 0xff) << 8) | ((int)(b/agv) & 0xff); - + for (int k = -kernelXY; k <= kernelXY; k++) { + for (int l = -kernelXY; l <= kernelXY; l++) { + if (k * k + l * l < gaussian.length * gaussian.length) { + int p = RGB.getRGBW(_image, i + k, j + l); + // calculate a RGB by chip bit + r += ((p >> 16) & 0xFF) * gaussian[k + kernelXY][l + kernelXY]; + g += ((p >> 8) & 0xFF) * gaussian[k + kernelXY][l + kernelXY]; + b += (p & 0xFF) * gaussian[k + kernelXY][l + kernelXY]; + } + } //end l + }//end k + int rgb = ((int) (r / agv) << 16) | ((int) (g / agv) << 8) | ((int) (b / agv)); //set RGB revert to image imageOutput.setRGB(i, j, rgb); }// end i diff --git a/src/image2d/Grayscale.java b/src/image2d/Grayscale.java index 1b3d57f..d4d68cf 100644 --- a/src/image2d/Grayscale.java +++ b/src/image2d/Grayscale.java @@ -10,28 +10,23 @@ * * @author pratchaya */ -public class Grayscale extends Filter { +public class Grayscale { + + public static BufferedImage apply(BufferedImage _image) { - @Override - public BufferedImage apply(BufferedImage _image) { - runningFlag = true; BufferedImage imageOutput = Unitys.copyImage(_image); int grayscale; for (int i = 0; i < _image.getWidth(); i++) { for (int j = 0; j < _image.getHeight(); j++) { int rgb; - int p = RGB.doGetRGB(_image, i, j); + int p = RGB.getRGBW(_image, i, j); rgb = (int) ((((p >> 16) & 0xFF) * 0.2125) + (((p >> 8) & 0xFF) * 0.7154) + ((p & 0xFF) * 0.0721)); rgb = (rgb << 16) | (rgb << 8) | (rgb); - grayscale = rgb; //sum RGB - imageOutput.setRGB(i, j, grayscale); + imageOutput.setRGB(i, j, rgb); } } - cancelFlag = false; - runningFlag = false; - return imageOutput; } } diff --git a/src/image2d/Histogram.java b/src/image2d/Histogram.java new file mode 100644 index 0000000..af47dfa --- /dev/null +++ b/src/image2d/Histogram.java @@ -0,0 +1,29 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package image2d; + +import java.awt.image.BufferedImage; + +/** + * + * @author pratchaya + */ +public class Histogram { + + public static int[] histogtam(BufferedImage _image) { + int interval[] = new int[256]; + for (int i = 0; i < _image.getWidth(); i++) { + for (int j = 0; j < _image.getHeight(); j++) { + int p = RGB.getRGBW(_image, i, j); + int r = (p >> 16) & 0xff; + interval[r]++; + } + + } + return interval; + + } + +} diff --git a/src/image2d/Image2D.java b/src/image2d/Image2D.java index 4e0f07d..fb88f30 100644 --- a/src/image2d/Image2D.java +++ b/src/image2d/Image2D.java @@ -18,11 +18,12 @@ public Image2D() { Dimension dim = toolkit.getScreenSize(); String url = "images/wl2.jpg"; // this program have 4 images : wr.png ,sh.jpg , ca.jpg , icon.jpg ,r1,r2,r3,r4.jpg BufferedImage image = ImageReader.load_image(url); - image = new Gaussian(0.84089642, 7).apply(image); //.94089642 - image = new Grayscale().apply(image); - image = new Threshold().apply(image); - image = new Opening(2).apply(image); - //image = new Closing(7).apply(image); + image = Gaussian.apply(image, 7, 0.84089642); //.94089642 + image = Grayscale.apply(image); + // image = AutoBalance.apply(image); + image = Threshold.apply(image); + image = Opening.apply(image, 3); + image = Opening.apply(image, 3); image = EdgeDetector.findEdgeSobel(image); JFrame frame = new JFrame("Display Image"); @@ -34,11 +35,12 @@ public Image2D() { frame.setSize(image.getWidth() + 8, image.getHeight() + 34); frame.setLocation((int) image.getWidth() / dim.width + 455, (int) image.getHeight() / dim.height); frame.setVisible(true); - + } public static void main(String[] args) { Image2D i = new Image2D(); + } } diff --git a/src/image2d/ImageReader.java b/src/image2d/ImageReader.java index 13733bc..13f4838 100644 --- a/src/image2d/ImageReader.java +++ b/src/image2d/ImageReader.java @@ -24,8 +24,7 @@ public static BufferedImage load_image(String url) { // read file form BufferedImage image = ImageIO.read(new File(url)); if (!image.equals(null)) { - System.out.println("Load data at URL:" + url + " done."); - + } } catch (Exception e) { diff --git a/src/image2d/Opening.java b/src/image2d/Opening.java index bfa3856..d7c2c3b 100644 --- a/src/image2d/Opening.java +++ b/src/image2d/Opening.java @@ -5,48 +5,16 @@ package image2d; import java.awt.image.BufferedImage; -import java.util.ArrayList; /** * * @author pratchaya */ -public final class Opening extends Filter { - - int radius; - ArrayList seq = new ArrayList(); - int index = 0; - - @Override - public BufferedImage apply(BufferedImage image) { - runningFlag = true; - - for (index = 0; index < seq.size() && cancelFlag == false; index++) { - image = seq.get(index).apply(image); - } - - cancelFlag = false; - runningFlag = false; - - return image; - } - - public void append(Filter filter) { - seq.add(filter); - } - - /** - * re-write for value correctness - */ - @Override - public int getProgress() { - return (100 * index + seq.get(index).getProgress()) / seq.size(); - } - - public Opening(int radius) { - this.radius = radius; - this.append(new Erosion(radius)); - this.append(new Dilation(radius)); +public class Opening { + public static BufferedImage apply(BufferedImage _image, int r) { + _image = Erosion.apply(_image, r); + _image = Dilation.apply(_image, r); + return _image; } } diff --git a/src/image2d/RGB.java b/src/image2d/RGB.java index 494ceb1..90203af 100644 --- a/src/image2d/RGB.java +++ b/src/image2d/RGB.java @@ -8,11 +8,20 @@ public class RGB { - public static int doGetRGB(BufferedImage image, int i, int j) { + public static int getRGBW(BufferedImage image, int i, int j) { int width = image.getWidth(); int height = image.getHeight(); i = Math.max(0, Math.min(width - 1, i)); j = Math.max(0, Math.min(height - 1, j)); return image.getRGB(i, j); } + + + public static int getRGBH(BufferedImage image, int i, int j) { + int width = image.getWidth(); + int height = image.getHeight(); + j = Math.max(0, Math.min(width - 1, j)); + i = Math.max(0, Math.min(height - 1, i)); + return image.getRGB(i, j); + } } diff --git a/src/image2d/Threshold.java b/src/image2d/Threshold.java index 4850eff..80d7b20 100644 --- a/src/image2d/Threshold.java +++ b/src/image2d/Threshold.java @@ -6,37 +6,30 @@ import java.awt.Color; import java.awt.image.BufferedImage; -import java.util.ArrayList; /** * * @author pratchaya */ -public class Threshold extends Filter { +public class Threshold { - @Override - public BufferedImage apply(BufferedImage _image) { + public static BufferedImage apply(BufferedImage _image) { int _r, p, r, g, b; double threshold = otsuTreshold(_image); - BufferedImage imageOutput = Unitys.copyImage(_image); + BufferedImage imageOutput = new BufferedImage(_image.getWidth(), _image.getHeight(), BufferedImage.TYPE_3BYTE_BGR); // Set initial BufferedImage for (int i = 0; i < _image.getWidth(); i++) { for (int j = 0; j < _image.getHeight(); j++) { // Get pixels - r = RGB.doGetRGB(_image, i, j); + r = RGB.getRGBW(_image, i, j); r = ((r >> 16) & 0xff); - int alpha = new Color(_image.getRGB(i, j)).getAlpha(); + if (r > threshold) { p = 255; } else { p = 0; } - alpha = (alpha << 24); - r = (p << 16); - g = (p << 8); - b = (p); - - p = alpha + r + g + b; + p = (p << 16) | (p << 8) | (p); imageOutput.setRGB(i, j, p); } @@ -46,7 +39,7 @@ public BufferedImage apply(BufferedImage _image) { } public static int otsuTreshold(BufferedImage _image) { - int _histogram[] = histogtam(_image); + int _histogram[] = Histogram.histogtam(_image); int total = _image.getWidth() * _image.getHeight(); float sum = 0; @@ -79,22 +72,6 @@ public static int otsuTreshold(BufferedImage _image) { threshold = i; } } - System.out.println(threshold); return threshold; } - - public static int[] histogtam(BufferedImage _image) { - int interval[] = new int[256]; - for (int i = 0; i < _image.getWidth(); i++) { - for (int j = 0; j < _image.getHeight(); j++) { - int p = RGB.doGetRGB(_image, i, j); - int r = (p >> 16) & 0xff; - interval[r]++; - } - - } - - return interval; - - } }