From b9777e4729af695374f1b82f9edcb5b708937f20 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 24 Oct 2012 20:15:07 +0700 Subject: [PATCH] Optimize Algortim , Add Openning and Closing --- build/classes/image2d/Closing.class | Bin 0 -> 1418 bytes build/classes/image2d/Dilation.class | Bin 0 -> 1633 bytes build/classes/image2d/EdgeDetector.class | Bin 824 -> 814 bytes build/classes/image2d/EdgeOperator.class | Bin 2618 -> 2490 bytes build/classes/image2d/Erosion.class | Bin 0 -> 1629 bytes build/classes/image2d/Filter.class | Bin 0 -> 785 bytes build/classes/image2d/FilterSequence.class | Bin 0 -> 1286 bytes build/classes/image2d/Grayscale.class | Bin 0 -> 1178 bytes build/classes/image2d/Guassian.class | Bin 0 -> 2122 bytes build/classes/image2d/Image2D.class | Bin 2038 -> 2649 bytes build/classes/image2d/ImageReader.class | Bin 0 -> 1444 bytes build/classes/image2d/Opening.class | Bin 0 -> 1418 bytes build/classes/image2d/RGB.class | Bin 766 -> 1204 bytes build/classes/image2d/ServiceProcess.class | Bin 702 -> 283 bytes build/classes/image2d/Threshold.class | Bin 0 -> 2479 bytes build/classes/image2d/Unitys.class | Bin 1900 -> 2298 bytes src/image2d/Closing.java | 52 +++++ src/image2d/Dilation.java | 56 +++++ src/image2d/EdgeDetector.java | 6 +- src/image2d/EdgeOperator.java | 15 +- src/image2d/Erosion.java | 56 +++++ src/image2d/Filter.java | 42 ++++ src/image2d/FilterSequence.java | 48 ++++ src/image2d/Grayscale.java | 37 +++ src/image2d/Guassian.java | 74 ++++++ src/image2d/Image2D.java | 39 +++- src/image2d/ImageProcessor.java | 260 --------------------- src/image2d/ImageReader.java | 75 ++++++ src/image2d/Morphological.java | 69 ------ src/image2d/Opening.java | 52 +++++ src/image2d/RGB.java | 11 +- src/image2d/ServiceProcess.java | 20 +- src/image2d/Threshold.java | 100 ++++++++ src/image2d/Unitys.java | 14 +- 34 files changed, 665 insertions(+), 361 deletions(-) create mode 100644 build/classes/image2d/Closing.class create mode 100644 build/classes/image2d/Dilation.class create mode 100644 build/classes/image2d/Erosion.class create mode 100644 build/classes/image2d/Filter.class create mode 100644 build/classes/image2d/FilterSequence.class create mode 100644 build/classes/image2d/Grayscale.class create mode 100644 build/classes/image2d/Guassian.class create mode 100644 build/classes/image2d/ImageReader.class create mode 100644 build/classes/image2d/Opening.class create mode 100644 build/classes/image2d/Threshold.class create mode 100644 src/image2d/Closing.java create mode 100644 src/image2d/Dilation.java create mode 100644 src/image2d/Erosion.java create mode 100644 src/image2d/Filter.java create mode 100644 src/image2d/FilterSequence.java create mode 100644 src/image2d/Grayscale.java create mode 100644 src/image2d/Guassian.java delete mode 100644 src/image2d/ImageProcessor.java create mode 100644 src/image2d/ImageReader.java delete mode 100644 src/image2d/Morphological.java create mode 100644 src/image2d/Opening.java create mode 100644 src/image2d/Threshold.java diff --git a/build/classes/image2d/Closing.class b/build/classes/image2d/Closing.class new file mode 100644 index 0000000000000000000000000000000000000000..6e7fe8294e837045894b221505e315eb93a7027a GIT binary patch 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;>=_ literal 0 HcmV?d00001 diff --git a/build/classes/image2d/Dilation.class b/build/classes/image2d/Dilation.class new file mode 100644 index 0000000000000000000000000000000000000000..358c06fe88e0e26390f44ef513eb42b4cade82cb GIT binary patch literal 1633 zcmai!UsD@Z7{;HI{g>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{|6oPD67!Sb#yn&Go z5KTOQS28hH4{BHXud4sAN2e#|i&_2re)|AwlpSmWi**NsK*NTHoI{>X9c@``TkH%E zi>m4{tH`wO>dmOus2nw#(RnB8)_d))%Ps|%Jqi{@mwkMf65-%kT?F1=!{vRe*MCsh zx9v{&lC#HYeBY8cCNf@Vy5coMtQ0_Ite%w`c^7~T9x zQVdG(7*}HwBa$coVd^xTV4nTv;Z6Bqg!L-b26}@Zclz>>49j8x*?3zxok&`EM9r}z Ws*;;#MNqy^>awCHgk6p2t^EL`YcC=I delta 337 zcmXAjy-or_6otQ;)g4%tReoGW#UBt?7ZQ}tN3gNd!eC?65DJh)8+se-eGioej3hpQ zPh@4hv&k!;XihYGK#Ho?+j^wTes4Ds{twp)om) zl;e|6x~ft?B=R{TQUv|MZSSFT-@Y35pT|!=$CQ0yn#rrW%$U2!(fEAOOMX@N#xAr+ zqmUrMK)SY6C3QKTp(g2gMbJ&fJgdU}g@FP^>9Uk4i(((Yup}2wl6M`B=D620OgtrX zF-Hq`;$~|~_CqWh8(U261^G#dkTq(orz_$`j3}YFax_HWkR>6TRD@}92Es!eQMb~( F?SGJbC5Qk3 diff --git a/build/classes/image2d/EdgeOperator.class b/build/classes/image2d/EdgeOperator.class index 4d6f7b645c4727c0f871fd3a72628ea3136aa53b..3ea8bc37c79f17ec13cd170410cc2faace8c0bba 100644 GIT binary patch literal 2490 zcmb7GO>h)d5dPlo?9A?Dc6JkYVxoX3sJr~Fpe`gt!2CcK0>K0VYY?*89X6XRnXuVF zunLMpkPF3uiySNuT)4^wQvQHtl~oqrJm^6Wlpd_|WO<}g#P7XLh>}QfYNlUzPrvT3 z`@McM_aA+J7r+*jO*Epzz;6BCpH%SDzb28FzDo^&i9P5vk;YyV`_LuHeiH}KEy+Pi z-ZRmIUP%t=ySxW#o`J(AV(63Ph@5lOK*qrP0(whvv{>08;EyNz1hh6U?+Qe^ilgp< ziBp4a`A~MSL`_|nm&=y=vgM+b=agDys5mZA-&H)7Ex23q$&P%%?H+T>*@{=*E?~Qq zJH2x8LvOT_EeQnTiT?g}j^o~-OWCg^OPck$E5krRk6 zxNY-FDlIY0S2Wa5C^Q1A7HpQnCt#=$GMAtVqVlX!w%rqzv55+!j}<59NnDb9Wcz64m~*`kQ3MEWCgh1$_PO298f#bZxP6pDf79UbPTJjbmS%6Vhw(sGprb}X|EmfZl+ zdGC4epe#212McaR@d9g>bKl=D7lsp#6!VoK)iG3rsOWTyg&}5FT~XGdXHTo#M{b@I z;+&UGCukZdlwFtQ)CNlv%%@saRi6D><#5b9ORIQ$dxD!!8$Vs9Pc5z_JuaQFLv_Ye z?)7oS;AJ%M*pQb7As3u<1*IfM!7;Gz4#X`oKCC3wmD0v4@>bOVFJUz$L07Mk%E{*u zq&?7~e+6I0uYYM|{4w}@GFl9Qo=iaUy%|mEZEE=hY-$2Z6H#^sb&;OluJxbMQ8l=! zoW{^boDx8NHOL%*HcD%-mJkG9eFi8pCvhIs-WjA7eiS^C~KF2@)};R zRz(ZIKrM4=TtAIavqow*2R7Udlv29i(Fan7V>D{FQRC=&Eq_D&rIbM@D3#Wn@+W^P zucU0pc64pv2Chgc;zX*_q!YT_7;p^7&O1RTlAlKS@&;)-utk~- zY#zy7O@$ou2_t*4k?GVtVH86nTMPF{3sBzJKj z#bo{$>W$BWdXdpms23Ui8+G_;sKbtRnR{az(P`8=;RQa|WH;C`)P4LZf*hn|U;hNU z-DH1(Sf;_gTD|YUX^u8(T#;a7^fu~m*RaZtK`) z8&HQ$+(t>X;0<(OGe5y^A%nM3KohQ@8Mm+zvHO*gCF!69P^n-`l8t6tLI5CyX-!{`p0nrapH;K zAg&Qp0=9_F>x4e9W909#o^L~F72gqef`1$x;#+JaSA$OR4f9AaqkZBYvq>OK6x*27 zX8N0f&A*s85yeLF8}mr;5NQyPm{o#}!?v00bIGN!l}#nNZEQduHRPJe`JwxsV?DO= zG_!nRR;2|2)cFj&LoYgZFrN#sXL;xa4eT_q%fP$pCezBYVFocV%hMyW)N4__q*Yiv f#QBE^%wP?XFGzd*p;;b3|KXhzh`Ws_d}#k0fqwI> literal 2618 zcmb7G&398(5dYnm{y};b%6`EvT1v)qHDMM2e5MG!Zio2zk8Dc(n|52yt#Mg&Yk(q%)RsS%irHW z1kjEfUhF`^z-j%bKPlj&|4bquy;}`{fiqrskdP$l#aW#5VgQ4ZeCWjxh9x;K$%rJQ zUR=OMNm6=u>5(#G;F1^HFeb@Ia^qzKR}5Sg(2o^n3e_$FN3?lVz}ZvE*#g02Va7f; zKRs?&&S%Dplr$zw*-UXXQz=NkE_7BW3UdNmlZEL_-fqve_T}>SK-sQjs-;S&K)@z{ zs#Ga_T$-t7iUO`^^VnD~$GOtDP2Qn6Q>u;Hm1==5xJxb8%oIv90=?1XWafINHFKld zsywxxn7?+-uGqPR^xH`z{58K^NkGuHNbsHFo8epGo98=DKob%r$LkUXfmQO93PKfG zfzUJ4J*A=wO-yo$iuzTBNMPqPosBRG7|Ml=$E}>GSba)&V7^+OuhM(DaI>Bk;&e~h zl^MHuF(u$1u4b}RXESA$cvZW!fqe$L1-!$h`AXLAFUT@AJYRu>GHWJY$4&uFrahp% zu}&kb`K>t<8H^jqn#jR6kT!7*c@q=J8z`8V#FUAmB-4`2V9G$rL>aRtDq!6MPphJ` zB0W`2%u5^B!EnNB?w$w5Y^rU=%uK#@V0_ZfQgg>sOB>{lsmqqiw-VE=Ro5m*Vbenp zTEmnp4a#IQ40qnHs=2`K&CHLD$-;2Mg+i`6p>7QY9tuv`h5Q6Vsa2FY9y)n~70ndO z6Fh6~D0e0j%~W>q+;Smbv2C6O=Xi0Rb*rUP<>YKe87`M@P%GNo+swi_=VmLk?Tji; zk4jU#tvdZGH~O5K;7z>7ej*(m5N)l9h24%sa z;bhBqG*ol$RYt?;!FB~;Yt2a=Ko7aS*hdHg(N};Xozg)ah61L5gkd~|QUhJrTn}X@ zq3qcNN;CG?vf?bVFE=ul=@ocVOYpWV!q?$!S%%r+iam4{2|4-J~WlR6Zcr&7nDNlmAsbk1*L}dN(!WCsyezbU z<-g7Iwu~*y2wQ1acr=t93pA|YmRTHM7Mv4W&{MA`3L`vZfT55wACjA*SG z)ehsL)`^tXg)waqm$fT6q~*}2P4YV;TgY#)`0@A_EyNVUB`o0pXF<`kCKE^2Wa!tL zh&Lwx*Ju{|Qw&}twMIq}gAW5*kg>$rl!i2u5ycqih~{BjF$9R`Jsf6yL81sS#&^+x z!&)1qF}A8*+8M?itF_ik{x4TVMC+rea;;4YiV?G)rl?IB^*aLT!?7r z@d2&qIKjw1LtvG?&~2c{K(B#5_2Z;p(Bu<@#VUJLXrpCOf25jUJjT7pa6Q3p@jQ3Z S;gS3Q!#p<-_(|0`PyGW26$df^ diff --git a/build/classes/image2d/Erosion.class b/build/classes/image2d/Erosion.class new file mode 100644 index 0000000000000000000000000000000000000000..8d18ac496667a9b1ad4254e690f1296f9d1fbfd2 GIT binary patch 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)}LVNIa0UxpbYfb>7|@)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$xMA0Syb AtpET3 literal 0 HcmV?d00001 diff --git a/build/classes/image2d/Filter.class b/build/classes/image2d/Filter.class new file mode 100644 index 0000000000000000000000000000000000000000..e0e0499175dfb634de89a60a87fd3c6f61518c00 GIT binary patch literal 785 zcmaJ;%Wl*#6g{3e^GwqRr929KP!R1bCQ`RWU4T?+&`>Ihx?tzYxFIFuj64|-f5Qi` zK>{JM-~;$5#BnmJ3aZ%LYhU}k>|eis`~GO^B% zGL;C3Hv%0yGbS}jHEB+4o>)Dd@~|&Zf0CNCI27=9_s#_5vwWll76+-($FuQJ+t+HC zak4VVW0jpLo4WmcD2ul#d6ow0SS5OY6dk2mq3wZyuO^f1qrlWyVaI zBzif#&~YKR`6G4yl?Un2TuDbzc5<-$5RRNR`Cqae9GH*Z%+`uX)H%r_ar?)P3`g5JI`xT!2gl1P#%PDxJLdXu> zr_&8$wyv;;6+2bkUEz%1p?qaOVt4j^(#p?VRDSE_aOVn(KWACSI__Nq_WlJwz6LC4 I&`E6k0oV_Pe*gdg literal 0 HcmV?d00001 diff --git a/build/classes/image2d/FilterSequence.class b/build/classes/image2d/FilterSequence.class new file mode 100644 index 0000000000000000000000000000000000000000..9a82ed7f6d98d6d1abe6f2079c5f97c3491d1832 GIT binary patch literal 1286 zcmah}OHUI~6#i~oS{R0hyaXSppi+vqiuf#opdlgDM}on?ic5PbgToZ2Qxt!SJKeZ( zp@~4EiE-`1pQL`LQxpi%#hf|!JiqguJM;bL=dS>UanFK!RIA;HE;fY&H}+bE|q&XDWf?W+r@JZ{?hFkX2}yb&8%2D!x$| zI4Wi|=d9_X87^d|95*n2c8pndj#n@*71XpseAMxrV2q8DgL4Y8`=tVFwd5SnJgTfM z8ULwXa%pMHmGau1)4n6;nlTovIAw+ILrrGQM#Xq}BdzrMy1S(?mJHG97eS_qC^K1E zUN*idObfp3;J@91S>hCW{}IjP}au*;2*No1ED+?u6%+ z0v$Ldk0W%1WnJwRGmkfo?>hy7A18d{6%^W&hi1$QTk+*8sS2%!y$X#*6Fl)tMc@+*N2kxM&-v zaN5Qg#%&BBsnB)Mzt@&P{fg%~UUACRMc#=8UV^goiU6&=<`Uh|9_2W^hso*Mrb4Ec zR!v^+VN@4LQfF<+`+b88ILA9~@q38y;S5kXRz0;*avaJSZ5*8PI8QT(QUf|uyHKew zh|KRIx{X+hqV6Ld5p+|wF-;1@Sh9sBJ6NKJ7CTJF37q6f2@lMW!f#kuK+L3K+lW`o zr9PpKPizN?w@6W|e~o@Ih+_v0-(U^xpfQ)4=Q*}W0PlYNkj#1!@u3ea7p=nSMS^+{ z>e%)Sn-23mPVE8CVj6u_XkB6Z8Z?=-ml28)!a>9uAy+`0mOj1}`f;98pieSWpj(2C zi0o&7iI6`Aa1jk$v=9(>vHo!?4TjIy;NN zg&~bi6Vn)f0~hwTHqn}1^ar&6!Ku&&K_&S9Q zhLY&Oa0(;Hrtld?waBILIli!_|2-9d*7X1XJ-C1S`HD6DNAvhx>QPZAjp@QuHomm+ zm4G$r2YxgqkQf|V6fkCMWhKy2^aFLJxw@pn8*-^iPgk*4lGQ~S`r6)g8qu=f5a=%Y ztI|_r<=mxEZZw#uCIn1buU9t&rUr{Ea!uysohTRQ(v$~UTsG8W+afl9?4Q=LDpkDHu3@kwa^<4RJ5dI z&=|d5YlbCNRBNhwAqZ-bjQm)*Bw!ytp(U^%y==l_ahZ9o^!++)JVDFIGb9!gdBZhE zp2FD1Y9epCCUtWg-;cP4Yd(XOw_Q7v+3dudyTA0nuFz`TvyzpPYwt$dDy0W`%e69@ zb&A&YE!W!8_Ec6kI`kCjd#3p9&GtQm^5Jme3EH)2$^OoL63`gVqMfo6Cc&oY*+(=- zi6P7VZ{h%!aS#<8LPY;2<6Ag_pGnkx48*vv5!+4X96%p&W-(8_4>oH$Sk=cVy^uIe z%|sdvd`ivGZ0s_nwIl4ui@;Bu+)vg981I4c8fhEHAYP$Oyu^<$*x@)Mn)MSr1x`}7 GVDK$w{{uDv literal 0 HcmV?d00001 diff --git a/build/classes/image2d/Guassian.class b/build/classes/image2d/Guassian.class new file mode 100644 index 0000000000000000000000000000000000000000..ee8417fceade445cca9b1dfc895848e005da1d16 GIT binary patch literal 2122 zcmah~O>h%s7=FHNvb))CeoC_~X(>Mt zfnmnZaA3x(7smq^4_sshu%k10a-8wx-Gk#vkDfe$V|~6&KxY)lbl-ix?|r}b_xZLz z{Pp!C0DYJ@(1a6V?7&GWhBc(rq2#_N=SL3hREKCHe+EWyN*xM)YurxEdInBo)S&Sh z18KY~#d`+EFfP$q4HFvP7YMC**=0vSj0gl*ybYHyEubFr3SMQ9`qW6ebB4O%Vurfd zm{)MmR+kst@_A<=&z&7(#YHDS*BE}TmXkKO&|9db&g{JOwkYV4YG-RX5!E4_Xiy(g4_{>q{_>}o%`7H1$ zF>E!lIO2t*5dn28s$1|tXuEVf$p^PG>t*~?sZLTi%#Aa3vea773@1lV(hoHRr`9TNA>(G)*q2Zwot6&O75^AP zD$Si4?Bk_s;(ZJ7Ve{nGll`MqAlTC+Wh+-Xu7i9hyS{?xiatP~OML*Pt3#r8qI*;Z z&_>w`l`>BAD8h(QHZsHxI%~o%YWC6<9ibh&`Iblq7Cw@p6`ta>YJtUZo;Rr5XdTq; zV0-&_2nLRZ6kD~__B+TZwq|Jr)0Cln#@4wl-{EA)()uhlmO!W@0c{K6TrmN|(r?vP zR=5rpxqfD`D(xmWHSxvv-A$G9vt;N?MpyjGdeA`J%sN{TVm%S&-pqRUP}{-UdRbGB z>yNm<%GSziFSD8se$4jqj82PVc!elTiwoFKq_I<3yh_|85j4j0NsHIozm=&}1;QSqI$W`2m*H%}phFexN9^Yuh_KjP~ptPFrliK;i zxy4WH2FsLs{ds!RictTY!;#H6hxX}ajPhfvL0ZM*YnJH)eeI?dk?5u!J1A4NVh_={ zY0$QRGfdfb@Sj;<@#oON7N*#?E>5GHO*}|m9^#C8xa!Ao9Ki(M;3RD<;7ye97H(hw zpL5EOsQroSU%3A(P6!3VB7!5L3H>68QJ)(Rc`K^O(`$>*f}8Z+!W%P*Zy2G4Y@5aw zInx69-Fkr6i6V@27l(h2mz+F+Kkzn@#)^N(Q6k-ET?YC#gBcnIG#ulf&ppAP rT>zc<#6SlI z4Gdveh6`a_H1H%Y=@gwHV_DYQ?A(Zc5Bd<`9GjR&%17B-p)&fIrFBOFqiU)QQyb3%9Nee z&{zs3?X2bGY}b+CqL(SI%a~3&F_QOeC(Te$b=0uCv{HEzeTy?QmS?5ZP9$;0Gqc>k z-(oqDTVjF4`7`2WIAmWm9gAHW?>&R^$`;~+%J#V5rhE?yt*mJ~8k*wQ{v&RBY2wqc zMVRQ=8jKNl(VMo;*aC4x?YT2~RB(#mDEf8eBFJMgf}2>NV3f#<5xj&%1h?@r;VcTF&-GH4 zH)yW7i+LTdMDQwJBPsoslegIWb-bbD%?RGY+Y!7Y!@F43@m>V)<9Gxg$nYUnBlrj( zQ?#3{FDzINS(d(uGPl}MC-+#V`YSRoOwI9}o31i#5~H-0Pg*nPVkTeED=~_T+t1iTU2|wWSKlYRgiJb)O8io(7Bb?N=;SPzf~Sjs_Ppx z7Zx%r8hQ&w{w5awaV?NokNJr8{2s^~ap+38sdN#|C55d`A{ij&fb zib~+KwB#2E%@)>G%Mtm+`gj?%#_XJ}p58$GYU>#G@y+hw#|H>N6J>LJ0MKqBh%miB zwXH+DgNmW{HB=5q16_ew;0}Ua!3~5a8li{QQ56fW!4OaN#5y8k)reI~YnxbgV%5`% zj>m#`&>&{xM0EQ)nz}+8*f9|cuA{k2kA*^Oh{ZVEw}BSs?_9$!Wkz?$^fl}mkA{E(D@kV3!}DTKS66fsE(LnI|A^%N@BqE4 zd6S=1R7FrV;+4i}s!QE4Tw&u%mWpnmjaol4C^OkF7-q;O%#Rj7*{tJ;Cc_$jwm53js0~IK4RcJ# z<2GZQ(C~}SIT_&;r!}0>^sEN=oW;0Jf?kXBiqL`FT&~=w2)5tS#RGQ8rB_l4=SRyLV5pruoRDfqK*{{lU}J*@J|^- z$q&*=ueg|-^wva0Q+c}Rm8J{%>_B05KJS%1MW6r1X!D;LZ7t339fz`0-k^w+P_Ti2*k9*973aDX!ER?Jyg$GTQ9 z(}ruT5UK|&ZLAU=k42WT)8;Dc#$96>CmnLlP?ZMPtg?QU#_?sMRhnuv7IQ_~aMm?l zqf(_g8lG^CDlO4%6IJ5+R1SAPVPn2Y{Zp5OeUY!?x~6EG9!X~bwhHzW6^u%^P4eZ$ zXkde|X5ws;xe{y_Ovzknne32Ec3hsi$X8qyjO6so!f7fl2AEUe?E!133CUe&?E2ATq^wr0UyDzU>Twbg;2 zr1p;TWIs`MD7(szVp>xbCaj*ltI>Xr^`badURoEJF*gDwxxw30-Xr@ltB@mQNBUvi zz_%7Q(IS(qzK8qGO1TtrGWTW=|A?mHiNvgV(SJdYL3h^=11{Ir9w@P*?zKZPiR7ftD zha(=A^^nqwmUCk@jdGO0iMc}mLqH<(HXqI?VDxnUAf!4wDs8GH;Y};Vb>JlXyiU&D z_3UnJ$dI0iWG~t;aJPIJL>+-zK~^_pHR|>#vM_B7-JpL;vV{vc&TotUmB2D!n&U~X z9L|FC==?K?r#_7btBrMEN;J+yybf z=+C(DD=IHwY(GPFa%=!|p3meF4g**NjQ@h!rYQWE1~{s{$Mi6fL!M)D;RzF!u!Jl8 z+LfV+y@x8tX7OOyJeGON2e_D#wuxV+ZH7-tQ-n>gKK%p6m}T7exf)0L TFDx0jxMJXg^E7^#LFWDjPxNbF literal 0 HcmV?d00001 diff --git a/build/classes/image2d/Opening.class b/build/classes/image2d/Opening.class new file mode 100644 index 0000000000000000000000000000000000000000..3c551211b8309580d22413827ac64673ae5c3eef GIT binary patch literal 1418 zcmah}O>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$( literal 0 HcmV?d00001 diff --git a/build/classes/image2d/RGB.class b/build/classes/image2d/RGB.class index 3bf3b49df3706bb277a73679fc5bcd8479d2afeb..6a296ba20455ce6122b5e56b1a6dadf0ee1c39c3 100644 GIT binary patch literal 1204 zcmbVKT~8BH5IwiM+m^CyTLeT~`~bvu3#?W|4cG^aA5E$zYVd)?WXoRKC2b*fE9is& zz<=V4FGzgw2l%7Zb9Zau!IJ21?%bKVGjryixj%k>`wpOtdnqKbkivBolqjZPqol;5 zGM5rqPQVd}ulpT8s0e6<;--N9V9%2R>6+h>&wA~;?7njAEqcald)sbn)9w1o?mP9M z>Aw{itNCrWAVM*-IkAhb@?P)SXQtmMvzM2hKZXfo4AE?0xKqN zW7WhRCGKKXVDuCn0-3PimfLAK&+EH#o5k~IU4d}C^y{b}PK7j$(D9_-m~~R_sjFJn z+CKR*3enBAwo7i~5pB4N1Yd#r;$Ru1C`V~I+y!^T{tEGhN(^Q{2n-veZbkvHkft?) z46^-Xm(eE{%K7EY^oJ~deXPuUrZXyJL8CrKOQom7f_9XIah&5B(=ma`5G0E! zYBBz4oTsJ{ZhAOeW(eE_3rw=a)IY#o=)+wc4woDPmm^%Ba5Mh_mm9#nVHHKD)hF}s zOwKZDjw6{rg=Gzxv<6IC113%UxmunbMpOSpW({JM>?6b~6xyn;&FEh482T}cb!}4D zy?kWcw{!U;#7{;#6{Z#`Z9btA2ers{mcoWsqO!Pz%WASby+U5q11s?fs?i!)z--9% QD9`4o={%ojL=4w{17Dh|<^TWy literal 766 zcmbV}%}&BV6ot=FehOkKe~N+&bt5bwVXI-GiH3w|qK1u$$p8~9DaBMU=)xy*bZ>8@fVp>d z)oeD)O=51Hsd8CsP!bSRE`2_5vC{BWkCD&bzOR(Wi*(!xv5AY(#P6zON8iDueRUx3 zWfEaT1Xg}v1#JDM=1Q+$JL?QocZ_X>_^JAdfR4c)WmaP*v|4$EcwrDijC(W?O_+?6 zvjW7CU>3(ppy+1F>M+l=(Wn&brK(+cOyldRvGq)GW@H7_B(qhdUkm<(K2kCAdxEio})vfm>VPuIZwOY0ZcE h`y};$++ok|50R-xRigj^ diff --git a/build/classes/image2d/ServiceProcess.class b/build/classes/image2d/ServiceProcess.class index 53d6ffdb635020a3d515bb0f9790dabb2e9e2872..4a7b5ab3a9a37bdabdaa829f38fa87d3751d89fb 100644 GIT binary patch delta 125 zcmW-W!3}~y5JlfCE(;mq``f-N z@Surgq(B|Gd~WZtwLUxH$ERIibU1zgV_Ib~m)#EsKP=d+;0R)_42eRlj@wfbWyV=_ FR67#k3i$v4 literal 702 zcmah`%Sr<=6g{c!)Q+QeY#rb4jSq0Zt)loqC=4nn-AX!5+sL#dnW^Gm=}K|o2lyd= zhIo?}Q3RXCNpkN!C->aEf4;r}*uk2OVN6*E9}Tl?Ok+mFtcJNf=JQx!u=Zp}ruz&- z>l;;u>~UNd4C8_9h_i0HCe#(LMHHC`;*dvGuB5*AgW0qt6Nc$Pws}+R)cs4L?qnz~ zR2+&V*=2CkmJ&%Tj_Sv8`!*6ON$sx(H~fzK{66&!(Ld@o8bXPBMa%4N{GXtGcwgJ%@}SYs#}4-xM){qx$5 z2-6?6#z%h$v7&J{c{fQU?@$9#DkyR|U%E-JR8*IHG rr@;!g9x0O{HZXxKp-YdJNMjOZct+Xlu_<4oyiK)bI_ZWc4cGeu$nd7y diff --git a/build/classes/image2d/Threshold.class b/build/classes/image2d/Threshold.class new file mode 100644 index 0000000000000000000000000000000000000000..87c457955fd6259d77ac2e2f746b232463d2e60b GIT binary patch literal 2479 zcmai0ZBr9h6n-}Qmfb8Glr>;LD~jc%k}8^lFHuBMG=LRRQCqW+C5a75nk9;G!Z>7NEqYBHMxTizI4Y)o6UT5|$AH+JFrnk5n37^UDD;O64C9oE_ikN7wEek4&Pzy;Tieb`Q2L5#SHjw4uHX($PmR0fGtPLPl6A@Agp)t(lyhRgEL6N~ zt|DQ5GB@R9++FF|nQYmuWQ+OqJ_)K*D&?<9NVF!eI5SSnx$4Dyz1ZRD$w{~DrU!)8 zzPA5AmLQcl286?WDeG`u=E!i2b6nxbF^$W@; zhG*PzIhS^cgH`k@(`S}(k+5YoIGCwE#fvVFiyZq`c9YzhGfw%i>s@u-0ymclzE{kY zohb={ivl2z!Q@%W$}~k9XWvKgYA%!YUSA4d8hs5qvpTvY7*$W6@YK9oeB!2HuHd=l z8F86eg`+5*$pp6c-su}CoS`{d*1ELqj&AnC1YZc!!b*bVXhW(U$u8mx)crGg^7X^duDhqSP z*r_tBG~$(AXNojj?;E@+CbvpLDPO=AJ`Z6&FMtA~igldVa~I=R;#X~d0_jIC0;uDx z`NFlZxwfhb*nkLk66(=FEgDPDp`wPe?>ZI{xYMKaBkwijxM`am3sB~9Q;vu15ZCHF zN*%UohZdp56u2Lu zQ#d>uSDM1X*|^#i*KBI0Y&B(TsYHVzyf-Z%G#8Q{E`2#?a=y`EJZ5;ZpVE+@Zyg^@ zn?Y}25)rguBN2#VFB&m~CNg*vsreRCXhsHGF@RBrW{b;4ZdPW-uZk2W^R_rjAw}Z4@wBE?Cf)2uVxmg|%`-nSUg4u|$_E z2V(!)!Os73_JTpT)3;zn2fv1Bd9KNUfX>te2cEVs!b-NY>>O(LK&W39g|3w_kGd9H z>9Cc~?CtUXIfaFJ9_m))xGKlBP`56}gL2%k4PP~Hs~xt{nTo5ndLPX~?jjIs%TwIBmkRFyU^ziyrRwao*3r1b>bX;uH>H zlt`aPAGvds_3p$4R$UT$hIz)V=W#r<|v!9mbdJog-j2hGvXMF z)J2B9$5WO2Tg*l9uZOJe;i=ASJ|)AV2>QI*1$~J@spOK5y;6W2d4c*R`X$w>qJTs( z<@GgxpidCQ5D$2j6!?wzX^gRtHT}g*$_E++G3K#bPBaO6%wt=7W7EIh0v2Aq)TyL~ z=VaFB_qhP)XC41E@OEASwx~v^!x&?OT_6M(S(r;qc8u4bXBiwH)C9Gf$xqRQ3N?a$ y6RLdn+8`QErliM*G9bcShEl@;{s|~WbFGK+CxRmXmoTIkXcbxV{~aC$aPV&h)!@1S literal 0 HcmV?d00001 diff --git a/build/classes/image2d/Unitys.class b/build/classes/image2d/Unitys.class index 2efe8e91a3cbf1e4717843e049fd428d525fc96b..cb6510332032ab6e638d9be196cf29229b00a462 100644 GIT binary patch delta 1173 zcmYk4TTc@~7>3{3-FDk$Q=xzY7Hc`vT0qo_oRmX>3Pt6h;2X8YruC>@FhF;faDBYs~tQ=Aze zj;|Lp`E({N(75#}_$-lVr;N*z1yorrtZ`f{EOT$oN*9-Cv6Qj0OGTQ`7T&EcX2z^# zo-CWE@5bAX*Qxg@6X#H4;t8JWcxIvr&rQ5QN+7WHIZz?9FG(BGv1lTVOzD@>5qyQL zi6vMjUc=Jy#>6smCh~G9AouN`vMM$OJcNGWaPWpC^>Sn42*@YRJC{@WY-chhQPrH4 zCwQB4DK(c`C%$uSgiy&R0eBBo<18aLV}f(6<*Jjj;Oq+TLTocouvvF>3aG$&#-?)u z0n~Hl#RUY9s#mC{aW4?wfie}@fjSTtJJ6zu%rpiEH5WS3tFLaw+-#mzBKA8*r;`c083TYOfWaeb4i|> zrLdGAWIoA%7!g{7Uzc+c8C^n@S~BWja}+!3WTf&pi!MeQE_1gW`T_jH=kpJXQ61en ztFGXxW`o4sJ*Pmr;9-fM=~~V~iZml;gIuM38DHa?EvpbWW?O;4$4ITXjvgDS6*rhw zj_kDqDB=Jfv5(4q>PY)u=}x#csHMN|pv~a)xR(rlY*{Zk22Oe`+j#6)b>dh>$3EM! z>Xf4wiget^8K(Lv;#hrPUu3tVd~07!<9H_KQmb8BIlGA~Mx*}$qSly% delta 750 zcmYLGT~8B16g@M$+gX>jw(C*^+k(;xvfH9X`BIAl#a66e6%yi$gb;&KOYkEhG4VH; zjsF8L1%{uG(mC?>1gO6R3_xgChU=Pen-4 zhzhbGYEeTjOgOFf+ntTgrL7m60zE6Qw%+W%En!g1paaQ5u zCYM&Y(q-u?R2ayk9|IJzxSvIq#~l{t7&mz6BnB}=D#0esYb#NZXvek(Xb7w`SW!n2 z%NXXJ6wtzjSg6W;lix67+W6}KrZg(DMmN2R5sXq%ql-ia-xkJ*OazRkpbp@PWYU`# zoM@L1zaOyU3l diff --git a/src/image2d/Closing.java b/src/image2d/Closing.java new file mode 100644 index 0000000..ddb323a --- /dev/null +++ b/src/image2d/Closing.java @@ -0,0 +1,52 @@ +/* + * 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 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)); + + } +} diff --git a/src/image2d/Dilation.java b/src/image2d/Dilation.java new file mode 100644 index 0000000..f4b3bbd --- /dev/null +++ b/src/image2d/Dilation.java @@ -0,0 +1,56 @@ +/* + * 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 Dilation extends Filter { + + int radius; + + public Dilation(int radius) { + this.radius = radius; + } + + private int maxAround(BufferedImage image, int row, int col) { + 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, col + i, row + j); + maxR = Math.max(maxR, (c >> 16) & 0xFF); + maxG = Math.max(maxG, (c >> 8) & 0xFF); + maxB = Math.max(maxB, c & 0xFF); + } + } + } + return (maxR << 16) | (maxG << 8) | maxB; + } + + @Override + public BufferedImage apply(BufferedImage image) { + + int width = image.getWidth(); + int height = image.getHeight(); + + BufferedImage img = 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)); + } + } + + return img; + } +} diff --git a/src/image2d/EdgeDetector.java b/src/image2d/EdgeDetector.java index 9f618d4..20de526 100644 --- a/src/image2d/EdgeDetector.java +++ b/src/image2d/EdgeDetector.java @@ -4,6 +4,7 @@ */ package image2d; +import java.awt.Color; import java.awt.image.BufferedImage; /** @@ -18,11 +19,10 @@ public static BufferedImage findEdgeSobel(BufferedImage _image) { // get kernel vertical double vertical[][] = new EdgeOperator().edgeVertical(); // copy image form original - BufferedImage imageOutput = new Unitys().copyImg(_image); + BufferedImage imageOutput = Unitys.copyImage(_image); // get result return new EdgeOperator().sobelOperation(_image, horizontal, vertical); } - - + } diff --git a/src/image2d/EdgeOperator.java b/src/image2d/EdgeOperator.java index b333104..784bdf1 100644 --- a/src/image2d/EdgeOperator.java +++ b/src/image2d/EdgeOperator.java @@ -36,25 +36,24 @@ public double[][] edgeVertical() { return sobel; } // ----------------------------- end sobel --------------------------------- - - - - public BufferedImage sobelOperation(BufferedImage _image, double horizon[][], double vertical[][]) { - BufferedImage imageOutput = new Unitys().copyImg(_image); // Set initial BufferedImage + + public BufferedImage sobelOperation(BufferedImage _image, double horizon[][], double vertical[][]) { + BufferedImage imageOutput = Unitys.copyImage(_image); // Set initial BufferedImage int pixel[][] = doPixels.getPixel(_image); //use to store pixels int kernelXY = horizon.length / 2; // calculate image for (int i = 0 + kernelXY; i < imageOutput.getWidth() - kernelXY - 1; i++) { for (int j = 0 + kernelXY; j < imageOutput.getHeight() - kernelXY - 1; j++) { - int a = 0, r = 0, g = 0, b = 0; // store RGB + int r = 0, g = 0, b = 0; // store RGB int horiz = 0, verti = 0; + // int p = RGB.getRGBExtended(_image, i, j); // horizontal for (int k = -(kernelXY); k < kernelXY + 1; k++) { for (int l = -(kernelXY); l < kernelXY + 1; l++) { // calculate a RGB by chip bit - a += RGB.alpha(pixel, i - k, j - l) * horizon[k + kernelXY][l + kernelXY]; + r += RGB.red(pixel, i - k, j - l) * horizon[k + kernelXY][l + kernelXY]; g += RGB.green(pixel, i - k, j - l) * horizon[k + kernelXY][l + kernelXY]; b += RGB.blue(pixel, i - k, j - l) * horizon[k + kernelXY][l + kernelXY]; @@ -70,7 +69,7 @@ public BufferedImage sobelOperation(BufferedImage _image, double horizon[][], do for (int l = -(kernelXY); l < kernelXY + 1; l++) { // calculate a RGB by chip bit - a += RGB.alpha(pixel, i - k, j - l) * vertical[k + kernelXY][l + kernelXY]; + r += RGB.red(pixel, i - k, j - l) * vertical[k + kernelXY][l + kernelXY]; g += RGB.green(pixel, i - k, j - l) * vertical[k + kernelXY][l + kernelXY]; b += RGB.blue(pixel, i - k, j - l) * vertical[k + kernelXY][l + kernelXY]; diff --git a/src/image2d/Erosion.java b/src/image2d/Erosion.java new file mode 100644 index 0000000..7e34238 --- /dev/null +++ b/src/image2d/Erosion.java @@ -0,0 +1,56 @@ +/* + * 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 Erosion extends Filter { + + int radius; + + public Erosion(int radius) { + this.radius = radius; + } + + private int minAround(BufferedImage image, int row, int col) { + 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, col + i, row + j); + minR = Math.min(minR, (c >> 16) & 0xFF); + minG = Math.min(minG, (c >> 8) & 0xFF); + minB = Math.min(minB, c & 0xFF); + } + } + } + return (minR << 16) | (minG << 8) | minB; + } + + @Override + public BufferedImage apply(BufferedImage image) { + + int width = image.getWidth(); + int height = image.getHeight(); + + BufferedImage img = 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)); + } + } + + return img; + } +} diff --git a/src/image2d/Filter.java b/src/image2d/Filter.java new file mode 100644 index 0000000..2295de0 --- /dev/null +++ b/src/image2d/Filter.java @@ -0,0 +1,42 @@ +/* + * 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 new file mode 100644 index 0000000..275893c --- /dev/null +++ b/src/image2d/FilterSequence.java @@ -0,0 +1,48 @@ +/* + * 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/Grayscale.java b/src/image2d/Grayscale.java new file mode 100644 index 0000000..cb471c3 --- /dev/null +++ b/src/image2d/Grayscale.java @@ -0,0 +1,37 @@ +/* + * 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 Grayscale extends Filter { + + @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.getRGBExtended(_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); + } + } + cancelFlag = false; + runningFlag = false; + + return imageOutput; + } +} diff --git a/src/image2d/Guassian.java b/src/image2d/Guassian.java new file mode 100644 index 0000000..df88e64 --- /dev/null +++ b/src/image2d/Guassian.java @@ -0,0 +1,74 @@ +/* + * 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 Guassian extends Filter { + double sigma = 0; + int size = 3; + public Guassian(double sigma, int size){ + this.sigma = sigma; + this.size = size; + } + + 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++) { + int xValue = i - (size / 2); + int yValue = j - (size / 2); + gaussian[i][j] = (1 / (2 * Math.PI * Math.pow(sigma, 2))) * (Math.pow(Math.E, -((Math.pow(xValue, 2) + Math.pow(yValue, 2)) / (2 * Math.pow(sigma, 2))))); + } + } + + return gaussian; + } + + @Override + public BufferedImage apply(BufferedImage _image) { + + BufferedImage imageOutput = Unitys.copyImage(_image); // Set initial BufferedImage + int c = 0; + + double gaussian[][] = kernel(size, this.sigma); + int wight = _image.getWidth(); // image wight + int heigth = _image.getHeight(); // image hight + int kernelSize = gaussian.length; // size kernel + int kernelXY = kernelSize / 2; // find a center of kernel + + // make a result with convolution method + // return image result + + for (int i = 0 + kernelXY; i < wight - kernelXY - 1; i++) { + for (int j = 0 + kernelXY; j < heigth - kernelXY - 1; j++) { + int r = 0, g = 0, b = 0; // store RGB + int p = RGB.getRGBExtended(_image, i, j); + for (int k = -(kernelXY); k < kernelXY + 1; k++) { + for (int l = -(kernelXY); l < kernelXY + 1; 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 + int rgb = ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff); + //set RGB revert to image + imageOutput.setRGB(i, j, rgb); + }// end i + } //end j + + return imageOutput; + } + +} diff --git a/src/image2d/Image2D.java b/src/image2d/Image2D.java index 155c61f..5aed726 100644 --- a/src/image2d/Image2D.java +++ b/src/image2d/Image2D.java @@ -13,19 +13,39 @@ public class Image2D { + public Image2D(int x){ + Toolkit toolkit = Toolkit.getDefaultToolkit(); + 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 Guassian(0.7, 3).apply(image); + image = new Grayscale().apply(image); + image = new Threshold().apply(image); + // image = new Opening(3).apply(image); + image = new EdgeDetector().findEdgeSobel(image); + + JFrame frame = new JFrame("Display Image"); + ImagePanel iPanel = new ImagePanel(image); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.getContentPane().setLayout(new BorderLayout()); + frame.getContentPane().add("Center", iPanel); + //frame.setSize(65, 134); + 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 Image2D() { Toolkit toolkit = Toolkit.getDefaultToolkit(); 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 = ImageProcessor.load_image(url); - //image = ImageProcessor.gaussianFillter(image, 3, 3, 0.7); - //image = ImageProcessor.grayscaleFillter(image); - //image = ImageProcessor.balancingImg(image); - //image = ImageProcessor.threshold(image); - //image = ImageProcessor.balancingImg(image); - image = ServiceProcess.thresholdComplete(image); - image = EdgeDetector.findEdgeSobel(image); - + BufferedImage image = ImageReader.load_image(url); + image = new Guassian(0.7, 3).apply(image); + image = new Grayscale().apply(image); + image = new Threshold().apply(image); + image = new Opening(3).apply(image); + image = new EdgeDetector().findEdgeSobel(image); + JFrame frame = new JFrame("Display Image"); ImagePanel iPanel = new ImagePanel(image); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); @@ -43,5 +63,6 @@ public Image2D(String url) { public static void main(String[] args) { Image2D i = new Image2D(); + Image2D x = new Image2D(3); } } diff --git a/src/image2d/ImageProcessor.java b/src/image2d/ImageProcessor.java deleted file mode 100644 index a9341e1..0000000 --- a/src/image2d/ImageProcessor.java +++ /dev/null @@ -1,260 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package image2d; - -import java.awt.Color; -import java.awt.image.BufferedImage; -import java.io.File; -import javax.imageio.ImageIO; -import javax.swing.JOptionPane; - -/** - * - * @author pratchaya - */ -public class ImageProcessor { - - // get image form url to BufferedImage - public static BufferedImage load_image(String url) { - // init BufferedImage null - BufferedImage image = null; - try { - // 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) { - - JOptionPane.showMessageDialog(null, e.getMessage() + " File does not exist because name or extension file is not correct." - + "\nPlease check your file again."); - } - // return result image when read url done! - return image; - } - //---------------------------------end-------------------------------------- - - // -----------------------------Convolution -------------------------------- - - public static BufferedImage convolution(BufferedImage _image, double kernel[][], int wigth, int height, int sizeKernel, int kernelXY) { - BufferedImage imageOutput = new Unitys().copyImg(_image); // Set initial BufferedImage - int pixel[][] = doPixels.getPixel(_image); //use to store pixels - - // calculate image - for (int i = 0 + kernelXY; i < wigth - kernelXY - 1; i++) { - for (int j = 0 + kernelXY; j < height - kernelXY - 1; j++) { - int a = 0, r = 0, g = 0, b = 0; // store RGB - - for (int k = -(kernelXY); k < kernelXY + 1; k++) { - for (int l = -(kernelXY); l < kernelXY + 1; l++) { - - // calculate a RGB by chip bit - a += RGB.alpha(pixel, i - k, j - l) * kernel[k + kernelXY][l + kernelXY]; - r += RGB.red(pixel, i - k, j - l) * kernel[k + kernelXY][l + kernelXY]; - g += RGB.green(pixel, i - k, j - l) * kernel[k + kernelXY][l + kernelXY]; - b += RGB.blue(pixel, i - k, j - l) * kernel[k + kernelXY][l + kernelXY]; - - } //end k - }//end j - //System.out.println(i + "," + j + ": " + "RED: " + r + " GREEN: " + g + " BLUE: " + b + "\n"); - int rgb = ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff); - //set RGB revert to image - imageOutput.setRGB(i, j, rgb); - }// end i - } //end j - - return imageOutput; - } -//----------------------------------end----------------------------------------- -// -------------------------------Fillter -------------------------------------- - - public static BufferedImage gaussianFillter(BufferedImage _image, int _height, int _wight, double sigma) { - - // rander kernel gaussian - double gaussian[][] = new double[_wight][_height]; - for (int j = 0; j < _height; j++) { - for (int i = 0; i < _wight; i++) { - int xValue = i - (_wight / 2); - int yValue = j - (_height / 2); - gaussian[i][j] = (1 / (2 * Math.PI * Math.pow(sigma, 2))) * (Math.pow(Math.E, -((Math.pow(xValue, 2) + Math.pow(yValue, 2)) / (2 * Math.pow(sigma, 2))))); - } - } - - // get value _image and kernel - int wight = _image.getWidth(); // image wight - int heigth = _image.getHeight(); // image hight - int kernelSize = gaussian.length; // size kernel - int kernelXY = kernelSize / 2; // find a center of kernel - - // make a result with convolution method - // return image result - return convolution(_image, gaussian, wight, heigth, kernelSize, kernelXY); - - } - - public static BufferedImage grayscaleFillter(BufferedImage _image) { - BufferedImage imageOutput = new Unitys().copyImg(_image); - int grays; - int p[][] = doPixels.getPixel(_image); - for (int i = 0; i < _image.getWidth(); i++) { - for (int j = 0; j < _image.getHeight(); j++) { - int a, r, g, b; - a = RGB.alpha(p, i, j); - r = RGB.red(p, i, j); - g = RGB.green(p, i, j); - b = RGB.blue(p, i, j); - - grays = (int) (0.2125 * r + 0.7154 * g + 0.0721 * b); //formula - - a = (a << 24); - r = (grays << 16); - g = (grays << 8); - b = (grays); - - grays = a + r + g + b; //sum RGB - imageOutput.setRGB(i, j, grays); - } - } - return imageOutput; - } - - public static int[] histogtam(BufferedImage _image) { - int pixels[][] = doPixels.getPixel(_image); - int interval[] = new int[256]; - for (int i = 0; i < _image.getWidth(); i++) { - for (int j = 0; j < _image.getHeight(); j++) { - int r = (pixels[i][j] >> 16) & 0xff; - interval[r]++; - } - - } - - return interval; - - } - - public static int[] balancing(BufferedImage _image) { - int _histogram[] = histogtam(_image); - int _factor[] = new int[256]; - _factor = new Unitys().randArray(_factor, 0); - long sum = 0; - float scale = (float) (255.0 / (_image.getWidth() * _image.getHeight())); - - for (int i = 0; i < _factor.length; i++) { - sum += _histogram[i]; - int value = (int) (sum * scale); - if (value > 255) { - _factor[i] = 255; - } else { - _factor[i] = value; - } - } - return _factor; - - } - - public static BufferedImage balancingImg(BufferedImage _image) { - int new_Histogram[] = balancing(_image); - BufferedImage output = new Unitys().copyImg(_image); - int pixel[][] = doPixels.getPixel(output); - int r, g, b, p; - for (int i = 0; i < _image.getWidth(); i++) { - for (int j = 0; j < _image.getHeight(); j++) { - r = RGB.red(pixel, i, j); - g = RGB.green(pixel, i, j); - b = RGB.blue(pixel, i, j); - - r = new_Histogram[r]; - g = new_Histogram[g]; - b = new_Histogram[b]; - - r = (r << 16); - g = (g << 8); - b = (b); - - p = r + g + b; - - output.setRGB(i, j, p); - } - - } - - return output; - - } - - public static BufferedImage threshold(BufferedImage _image) { - int _r, p, r, g, b; - - double threshold = otsuTreshold(_image); - BufferedImage imageOutput = new Unitys().copyImg(_image); - for (int i = 0; i < _image.getWidth(); i++) { - for (int j = 0; j < _image.getHeight(); j++) { - - // Get pixels - r = new Color(_image.getRGB(i, j)).getRed(); - 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; - imageOutput.setRGB(i, j, p); - - } - } - - return imageOutput; - - } - - // --------------------------------not ok!!! ------------------------------ - public static int otsuTreshold(BufferedImage _image) { - int _histogram[] = histogtam(_image); - - int total = _image.getWidth() * _image.getHeight(); - float sum = 0; - for (int i = 0; i < 256; i++) { - sum += i * _histogram[i]; - } - float sum_bg = 0; - int wight_bg = 0, wight_fg = 0; - - float varMax = 0; - int threshold = 0; - - for (int i = 0; i < 256; i++) { - wight_bg += _histogram[i]; - if (wight_bg == 0) { - continue; - } - wight_fg = total - wight_bg; - - if (wight_fg == 0) { - break; - } - - sum_bg += (float) (i * _histogram[i]); - float mean_bg = sum_bg / wight_bg; - float mean_fg = (sum - sum_bg) / wight_fg; - float varBetween = (float) wight_bg * (float) wight_fg * (mean_bg - mean_fg) * (mean_bg - mean_fg); - if (varBetween > varMax) { - varMax = varBetween; - threshold = i; - } - } - System.out.println(threshold); - return threshold; - } - //----------------------------------end Fillter------------------------------------- -} diff --git a/src/image2d/ImageReader.java b/src/image2d/ImageReader.java new file mode 100644 index 0000000..13733bc --- /dev/null +++ b/src/image2d/ImageReader.java @@ -0,0 +1,75 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package image2d; + +import java.awt.Color; +import java.awt.image.BufferedImage; +import java.io.File; +import javax.imageio.ImageIO; +import javax.swing.JOptionPane; + +/** + * + * @author pratchaya + */ +public class ImageReader { + + // get image form url to BufferedImage + public static BufferedImage load_image(String url) { + // init BufferedImage null + BufferedImage image = null; + try { + // 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) { + + JOptionPane.showMessageDialog(null, e.getMessage() + " File does not exist because name or extension file is not correct." + + "\nPlease check your file again."); + } + // return result image when read url done! + return image; + } +} +//---------------------------------end-------------------------------------- +/* + * public static int[] balancing(BufferedImage _image) { int _histogram[] = + * histogtam(_image); int _factor[] = new int[256]; _factor = new + * Unitys().randArray(_factor, 0); long sum = 0; float scale = (float) (255.0 / + * (_image.getWidth() * _image.getHeight())); + * + * for (int i = 0; i < _factor.length; i++) { sum += _histogram[i]; int value = + * (int) (sum * scale); if (value > 255) { _factor[i] = 255; } else { _factor[i] + * = value; } } return _factor; + * + * } + * + * public static BufferedImage balancingImg(BufferedImage _image) { int + * new_Histogram[] = balancing(_image); BufferedImage output = + * Unitys.copyImage(_image); int r, g, b, rgb; for (int i = 0; i < + * _image.getWidth(); i++) { for (int j = 0; j < _image.getHeight(); j++) { int + * p = RGB.getRGBExtended(_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]; + * + * r = (r << 16); g = (g << 8); b = (b); + * + * rgb = r + g + b; + * + * output.setRGB(i, j, rgb); } + * + * } + * + * return output; + * + * } + * + * + */ diff --git a/src/image2d/Morphological.java b/src/image2d/Morphological.java deleted file mode 100644 index a216ea0..0000000 --- a/src/image2d/Morphological.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package image2d; - -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.Toolkit; -import java.awt.image.BufferedImage; -import javax.swing.JFrame; - -/** - * - * @author pratchaya - */ -public class Morphological { - - public Morphological() { - Toolkit toolkit = Toolkit.getDefaultToolkit(); - Dimension dim = toolkit.getScreenSize(); - String url = "images/wl5.jpg"; // this program have 4 images : wr.png ,sh.jpg , ca.jpg , icon.jpg ,r1,r2,r3,r4.jpg - BufferedImage image = ImageProcessor.load_image(url); - image = ImageProcessor.gaussianFillter(image, 3, 3, 0.7); - image = ImageProcessor.grayscaleFillter(image); - //image = ImageProcessor.balancingImg(image); - image = ImageProcessor.threshold(image); - - - - JFrame frame = new JFrame("Display Image"); - ImagePanel iPanel = new ImagePanel(image); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.getContentPane().setLayout(new BorderLayout()); - frame.getContentPane().add("Center", iPanel); - //frame.setSize(65, 134); - 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 BufferedImage erode(int kernel, BufferedImage _image) { -// BufferedImage imageOutput = Unitys.copyImg(_image); // copy image -// int pixel[][] = doPixels.getPixel(imageOutput); // get pixel -// int kernelMask[][] = new int[kernel][kernel]; -// int kernelXY = Unitys.operation_Number("/", kernelMask.length, 2); -// int temp = 0; -// for (int i = 0; i < kernelMask.length; i++) { -// for (int j = 0; j < kernelMask.length; j++) { -// kernelMask[i][j] = 1; -// } -// } -// for (int i = 0 + kernelXY; i < _image.getWidth() - kernelXY - 1; i++) { -// for (int j = 0 + kernelXY; j < _image.getHeight() - kernelXY - 1; j++) { -// int c = 0; -// for (int k = -(kernelXY); k < kernelXY + 1; k++) { -// for (int l = -(kernelXY); l < kernelXY + 1; l++) { -// } -// } -// } -// } -// return imageOutput; -// } - - public static void main(String[] args) { - Morphological m = new Morphological(); - } -} \ No newline at end of file diff --git a/src/image2d/Opening.java b/src/image2d/Opening.java new file mode 100644 index 0000000..bfa3856 --- /dev/null +++ b/src/image2d/Opening.java @@ -0,0 +1,52 @@ +/* + * 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 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)); + + } +} diff --git a/src/image2d/RGB.java b/src/image2d/RGB.java index 35a89f4..b646786 100644 --- a/src/image2d/RGB.java +++ b/src/image2d/RGB.java @@ -4,6 +4,7 @@ */ package image2d; +import java.awt.image.BufferedImage; public class RGB { @@ -35,4 +36,12 @@ public static int blue(int pixels[][], int x, int y) { return r; } // return bit RGB - } + + public static int getRGBExtended(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); + } +} diff --git a/src/image2d/ServiceProcess.java b/src/image2d/ServiceProcess.java index dccf7c2..1316ba0 100644 --- a/src/image2d/ServiceProcess.java +++ b/src/image2d/ServiceProcess.java @@ -11,14 +11,14 @@ * @author pratchaya */ public class ServiceProcess { - - public static BufferedImage thresholdComplete(BufferedImage _image) { - // blur ** 3x3 in sigma 0.7 - BufferedImage image = ImageProcessor.gaussianFillter(_image, 3, 3, 0.7); - // grayscale tone - image = ImageProcessor.grayscaleFillter(image); - //image = ImageProcessor.balancingImg(image); - image = ImageProcessor.threshold(image); - return image; - } +// +// public static BufferedImage thresholdComplete(BufferedImage _image) { +// // blur ** 3x3 in sigma 0.7 +// BufferedImage image = ImageProcessor.gaussianFillter(_image, 3, 3, 0.7); +// // grayscale tone +// image = Grayscale.fillter(image); +// //image = ImageProcessor.balancingImg(image); +// image = ImageProcessor.threshold(image); +// return image; +// } } diff --git a/src/image2d/Threshold.java b/src/image2d/Threshold.java new file mode 100644 index 0000000..1f5697c --- /dev/null +++ b/src/image2d/Threshold.java @@ -0,0 +1,100 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package image2d; + +import java.awt.Color; +import java.awt.image.BufferedImage; +import java.util.ArrayList; + +/** + * + * @author pratchaya + */ +public class Threshold extends Filter { + + @Override + public BufferedImage apply(BufferedImage _image) { + int _r, p, r, g, b; + double threshold = otsuTreshold(_image); + BufferedImage imageOutput = Unitys.copyImage(_image); + for (int i = 0; i < _image.getWidth(); i++) { + for (int j = 0; j < _image.getHeight(); j++) { + + // Get pixels + r = RGB.getRGBExtended(_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; + imageOutput.setRGB(i, j, p); + + } + } + + return imageOutput; + } + + public static int otsuTreshold(BufferedImage _image) { + int _histogram[] = histogtam(_image); + + int total = _image.getWidth() * _image.getHeight(); + float sum = 0; + for (int i = 0; i < 256; i++) { + sum += i * _histogram[i]; + } + float sum_bg = 0; + int wight_bg = 0, wight_fg = 0; + + float varMax = 0; + int threshold = 0; + + for (int i = 0; i < 256; i++) { + wight_bg += _histogram[i]; + if (wight_bg == 0) { + continue; + } + wight_fg = total - wight_bg; + + if (wight_fg == 0) { + break; + } + + sum_bg += (float) (i * _histogram[i]); + float mean_bg = sum_bg / wight_bg; + float mean_fg = (sum - sum_bg) / wight_fg; + float varBetween = (float) wight_bg * (float) wight_fg * (mean_bg - mean_fg) * (mean_bg - mean_fg); + if (varBetween > varMax) { + varMax = varBetween; + 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.getRGBExtended(_image, i, j); + int r = (p >> 16) & 0xff; + interval[r]++; + } + + } + + return interval; + + } +} diff --git a/src/image2d/Unitys.java b/src/image2d/Unitys.java index a414f09..cce8285 100644 --- a/src/image2d/Unitys.java +++ b/src/image2d/Unitys.java @@ -4,6 +4,8 @@ */ package image2d; +import java.awt.geom.AffineTransform; +import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.WritableRaster; @@ -14,9 +16,11 @@ */ public class Unitys { + private static int IMAGE_TYPE; + //----------------------------------- helper method--------------------------------- // use to copy image - public BufferedImage copyImg(BufferedImage _image) { + public static BufferedImage copyImage(BufferedImage _image) { ColorModel cm = _image.getColorModel(); boolean isAlphaPremultiplied = cm.isAlphaPremultiplied(); WritableRaster raster = _image.copyData(null); @@ -56,4 +60,12 @@ public int[] randArray(int arr[], int val) { } return arr; } + + public int getRGBExtended(BufferedImage image, int row, int col) { + int width = image.getWidth(); + int height = image.getHeight(); + row = Math.max(0, Math.min(height - 1, row)); + col = Math.max(0, Math.min(width - 1, col)); + return image.getRGB(col, row); + } }