From 847dd67a412b9689e08c1fc60ef9716dc475188c Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 12 Aug 2017 23:22:59 +0300 Subject: [PATCH] serious test for kernel filters --- Tests/images/hopper_emboss.bmp | Bin 0 -> 49206 bytes Tests/images/hopper_emboss_more.bmp | Bin 0 -> 49206 bytes Tests/test_image_filter.py | 22 ++++++++++++++++++++++ libImaging/Filter.c | 3 +++ 4 files changed, 25 insertions(+) create mode 100644 Tests/images/hopper_emboss.bmp create mode 100644 Tests/images/hopper_emboss_more.bmp diff --git a/Tests/images/hopper_emboss.bmp b/Tests/images/hopper_emboss.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d8e001e2bd7a3345dc9fe53c9441f5869962ebd5 GIT binary patch literal 49206 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

F%=*TzzTZwlu@bd81-qPm0*T{DUoOpKz zO3Srr$P5vPYg3HoS#p#OF-6a<1{oF+n7qjbfEY9n=LkMd{D`~^duNEiGjBVb)noby z=mpH!!5JE$9n%PDvlxi~$3OP%Rr~V5VGsTop)cgDU6r{}s;t!;(xbT8@EWkgh~o(v zPIT7NFEH(e{IO;%PI;3Rr=dkT5#WNxLj4wBm3W|Ja~1~EjCv1sG_`UNZf}Q`TD>{d zTwdHOs9l*OW6!6>mVrO>X!q%KezMBfI*crUbnj9o;>e zTA9p}IAx6mOWd3$bzR%l9*qB%I#~Z= zzZmD*_;o~3m=EEj;Ecf>7ng6_U7w?PSP;=0)9U@XBbdCHH;DQroEMzv)a~`7u-lYz z*5jC=1lX_NSJU0aM_b`Uc0Tb=9B0w}Q9Q5i%y^AarIMsj$K8Bz_x^2c=HdNP8-xEH zj#?E$6kw||tgy_HnDGulgHQ7|xr1K(M~{h1J9tHB099OPFwc8@(Eoq_RXIso-ikeU z6o1{W9_Okne7cJ*`&gSq9guZ+r^YH6WHAC54x9h5JuPwiv0sRSI^{~~_!)Wy1RK1< zg#`c9@By(~6>nia9+4?w2k|GkeB@@a%GSco8^%8R`1D|= zJLs&N2zmYssjk&Fj#m*h$19A-h;Xf^@D?&=KS1GbN z)?vHO$n0%23M5IvUV!A0vln6%iXW{5!=b{0-f_T(kRN{iTR-p0MNT>J80uMMkpW*| z)2ZC@8ykLgs#LRz926m*OqXB@N;nTI6PXqRvRv4PwzDz-7Qis<|3tuEFVDP zJVFzZdt^^{kbcv54S0g$Y2d@Hrmnz*Gp;+yFy9G z9(~m>CO&)(Gm-Z(fc%91aj=&|8iTTE6!DLdXIct1@px%a_($)X`W)wCJL@&9AXfq{ z5&oC$(s7}+gt0-f%7Hs37VTJPZIWGqQ7GdrU&iCJR`t9rT5G{MNv3Bkf!aE|``Zsq zgy-)EJ9nOi$1_VzJ_WWGYccX?j_>#nWK94?^1ZDmk(%z=v)S#{GCb35E4Kq#Prl$7>6dMSoaV&B@f5%GUu`w@h44V7d{m)mE_L5p1U*&UWZ{{mPaZmzaxW=sC! zfRSia4uTuxFJ5c8V;Ugdker~A&rz8OlY>T*yu^AK(8$aJo&~ZNOBgndiHRRI6QYhF zVfE>TNIVHdL~=4$9BK4#-j1Hh@kic;{dr#uK{!^!>}HeqrQyWQ+xLzab`C02>uw!- z6(W+4VzSp$t4pF(NRn}qhHDNdmIf2O1|K|1P^r4+xE>RhTB@nK)7G_wDfGEaez!q>|->*9vZTCR2hlo$(I2YqhoGpQZb=Pjg{g;Q~Zq2#I|gF zuogxHW|BSGUJswj`oOJQ_j|*Ay@*5mkIK$)aPnwP1jiJx0@`2MPI;uArN!C#0_D}X zT^Xp!sE@YD1u#MR52r;PM6Daldm_dq7zOQ!LJ8VUD{$vZ!}!za4Sgi(GWbT#kx~WJuZqz>`*h|9n~SclYMk*8Hj#K4MZ_Ii_F$ zX=fvOTlOc(pM*1{Pc zBFRwkxE!NYd;Q@g5jAi&0IBVs&LjfEA{#AZDQ6P?If@s#O8Uzt&w0}ybg$5Yo8Z4A zpGc@VoV&ms({H%zNYpqd`g2}X`wae*AbiY{E8QH>|KQ8MdN>==6(7Zl0xt`f21v{} zv|C>8Wc;oN#|BB+XxEBvrco|t3yH9cB_X@`Ee;m3_%6`u^`#_m+CfXmbX1QhY5(Wl z$A=<_Zf=g!DTo&TqXNVk^JShhp^s(wt|Exu)Dr~=AX>;i6Ye8Df_y-09nJ>j9HjJM z!Rz1u!EgMo_k2$jjRxX*E6c~m7Atxi z|1F)YHr8N(BZ&L$$S3WpwpC|dJm|D%Ae;}v9+WR55!Ho07BN2wRDXumAt8m7_<1Jk zIgb$k8xT)A0wGaN{JS6ehJUv9b0>3iCo4;F<%C4j?sO~}m7=N&ahP>1nmk;b3ghkP zSd__(K{$AiTG2&J3PYwD3$yJZt7-y#o3Reda7k-(bNA;n12)(?8zrh1L6Pc#H>1f|%VEOHc7UNY5*xL{YW2 z>248Rza5QAQoQ}S@Ww*;VE^vkJWFMqQnG6J2*#{+_3$LU!f$FL_c$f#2rHbGz}MeT z_wj_%&FLZB#pXChlVRpbtdWD2-0`X3=+$#B@Ju>fqBMBS{udTEqZa{n#o0i9g1%e6xP+ zT{>LsCIH4itdv3j_y6~2?6PYlt**nE(mkl2=@#-1x}VKBwWNz8r)AW=nimf08_duN z!7?!GcAU>zT*jmX&`HWNOr|k&cp45C?`fax_U855r(t{VzACSI?(ISENw9ED1v7fW z%eqx~a8I`B-ZQ1q_nYCp+DvtRbMWNpjRE?f6nJ`}2aj3_eJSQ|FS3$0w$GB>^kfu2 z+yMW;9>W93tQTu_i`_d=)~Gc>8ka$Jf^ZW*c?7HabDXJSo#%uR5fUc-p&uOFx%=?> zAi6Lk;@=(*v7-E*lq~{|Q@P%6Jf7?>mE9U>H-~xf{gPnaY{@X;$dn$C@86nPd1zOs z;Dz1h>fU}>n%`B;`F44y+gPXOCNR>|+QRVohzUd*{o(Dy#m%Ya&4rn8XJ;M@n-S38 zqW*XD_Uf~95A89v(zU|BbF#m;fMX&90`l#>*5Ep>(%a?yz4r z0a`^Zr1_6fQl>JqhRRK>FUysgc4d8UH=Niy9_}Ar+dY|^nzJVC#)^0I7J54~bZD%^ z7Uz#|t!>S;W{NWXo3%w_X`tz@(PaXguU0AcQ9TQh%go3x(U*>xTBTs59vpe1_Axnu ze;6yrk;ywyL?z-L0RBf2K57>jApygziH~WPY!Zv{^n2geKmFg%!9VSj)NU3xN$?E4 zaEPL1FS-aNsUbJ-4XUMmPOag@$ua1p=U;Nnt6i|&iKWSd2Y15t#XH^d(d^ulnHzUE zo}NB@_;6!ozPs4pyteo7PNaP@I5GFf;lsgHuhVOBHUgQj8%-N0tNz^F`qG_dZF+NW z`ufw(Nmu~oNyPnIPvnE929r#wVq}gL6X9no!hcMd`aP1@sF$CK@t@}LcNV_(H$M3L zq=j^FZ#>BbPu2sVH1@k;dz0%)6L6Yj-KtK?i7^qQkVt_uEa$KHS`+biaN?AvjAAr; zjJtcoZLLgiwd=?pprbs0cVqL(%I;cwx#<@~vNAXl65(K`LcQIZp6kue75i;DFGiH| z0(P<5VBw@zDo#wdCf51nd3nm3I&>d|3(1#Owr)Igs`Hhp+5XOA9wF6@)>cdk$$b+1 zPe%ApJf#!~366X}g6pI2A@CB+QGRdXYrp18zlucR^{dQRQ)jTx+l^@sBbJV>`W0)~ zFLO2sJiV)GdI2Uy8GdG~?435n+<&Y9xq~$S;mmHJmdj4?jpbBE;yF<4Pu$j@HsPM6nb|%JbO7ZE(~e-Z(rsvU$x6L2 z?PcYFPchleOen@i5>Ap)HCJ7)1h*V#0cwt7^OmqX@Sl@d{%KPxNA!tQY7C=sj_H3Y zf(-Sa3f>^QRz+>qRY((Ppkgkcu;vrjT9<-F0-KxhOps5-G@iw(fr~Pl3r~s5M{PKQ zCicXK@FPq;SD)Yg=U?;rSFXYcAl+Gy?WH5GvefBtOg7!*a6+GjjmEfApj0gmFdfHC z$5tn$>S@N^%dwH3f*4@MVv&Im@x?rgEGvhn=ZaaY#D@lByP7EY|L=dS@Mf}djQ*yt z9>oVBv*cXyvjs~g0$hAOSqmLwg`@UoP|BmRGa>MqS7R~9A5cX9&ip^FUA{75JKbz{ zx={3zbKp4la-wH~GqAEZm7`UP-Fks<=>i(&vE&1pS{2ep*n19}g6i{1 z2-zi+ci#K+{eJtOb>9yD1Fz#+Lq57$iWsF6SPNQ>MHvs;t%i>6xA^GlIqBrH!F{X# zNOsW2MU&Imu?dYkI`-^Pm~OqOMy zfJ4Ajv+XQq=iz$Q;D0VJJe;y2`*6-O-x>laRYGwfM7Nvx<7v>I_LLVNHT>pxcHVL2 za<>pPdz*{7^>Y#;`e9Q2!SG#c<(d4+IA&RQW^A_0aFR_UUIUie3q6P&y-Q0fH(+e}l< z_ry*HBC7^ow(OwY!B_(UJ3N*tGe9S$X{dQmR`}pg5u95dJSoPxui|(g;r};gzv_!G zU#{kT-?bVX#TersONWIz22R;pskB|bxyg%!X7*pt%XGfcKB(53iD z5Feo76B@2y2NkhyRY@9LQ6^fHi}G>Fl-O4d_UoV$hq345^(910W^cqq7|5t~*@+qH z_lCMBLJSQfe*SHcE6EE`FsW(^;QXw|8cUAN1aVrULgEnfh&kffD%ULg2v0Vg>H_*6a8TP zwRQ$mdj82yaIe35AdTj>IIRF9_NYzy;8I07L&Yq+hC0cdcY-CpZYr<_lLR+{?~2zb zi}|oX3c>Qoxe=q)Mk1H1eA+^C5PSY|zSzUdYu0*I3)xRhB?N9YB&wusMgjArJrd`~ z<~UO-3e6{d^S+H8f8bf*|I031RAMWl+LP0jZp1*S(t3fpufY0ZwB)3puutumY+lhi zntKZ#O1kjjB4-==(LkmHM?!^h>*P3XoPH2ZgB-SFF$6%&6&it^_3#@IRQ6Q4rzT3$ zQi$IiUjSAp?1Y``mI^b?>P)3P^xbYH-|N@<><{59zm-OZk2N=&-A0E48aacJL+hfk zOu7@NcN%tMiozC0zLF*-7d$V?9zD@YamYD#cknlaPRb##HQ*TaBi+!@Fu*W%2E7EQ z(c#;CuZ>u|g+nHGS3J`HsR{V!>)eHc_uF%wue|y)-}=ogEX?g4CPdUxh28#~m_yfE z!xgcZ0;1A5{Zl#JGgOPK+J_U1CgfSe*urw*((pAJEpC&N=czW;s$% zhC-Tw)4yQSe9fcamJ7b=eNLq@ktxCT~OI^E`fYzlx;|~wK*V>&)jRk5B$G9n`_=Z z)rB45t;R9jW?vUyNGmqeZ;hL~$(0#y8d62U+2U0r4*8@fcxS+rRRSs?^IQIu$F?9& z-dA*n2Fxf|0>hFPff`IF`O@6<~t$STRZdpHXWc*3Ci_yE?+M< z=H2pCPE;n1O#STFKp<|fGG$kWRt2(WwC~h&!VXJ;%c|uynS5zWj&MaY$*2;EIp7)1 zr@?I$X#5Z2KcfSq?PRBz4n}Rc#QG|3(BJy5uWGrTnI(ZM9V%+;W}&ZSILuWwNz2=b z1?~otY-11kN2{Fpi-a)n?09vl2{{>npkZs$ad{nF}j(&w}~Kg%vqL zC=HT2;B6Vt>(`#_Oz(GLUqNl6;4QH8G*&)fN`nmtEf1Oynkp_9u|gpq4G@kx38u%J z=Z#klesi|{_b)in_?p5VpJBVUdpe)42KG+zS5(vG$*xbSN@=3lA*|{S(yzMnqQiG} zvNPa+p!$4LQ7Xp~XW2~MxB0+itcYXxZy8h4@}jCPsnt`Hvl9E<^Wpm5qi1?_Kcv-P z0O`V{gB;K8>WSQ!YHn3|XurS<}z z^lcuolfd+2su7L6Hm7sQa6tDGmXs+JhS;WbZ;dkhNUr&XjqXfD(k}|DGa&y6sE_fv z-XARxgip;JUBaB|z9{N8EmOTQ=|^nBq?o=l$JD!njUS27F1nT?%!6~|Z`ug_zwPR4 zaRH@x#(gle*{KgsHA<%+Jy8<_PRmbcGI9&+X2~gnk-v7~tMp;QOQhUWGYt{6fM{Z% zBe8eLZVu)e(F`a~>FmFWc=kRN71Kj89DLy3KXDJ&;AZ<`dK(rurcNWSE=i>$%5wzR z-ssa5dA!?Sk)sA-ei#=BPegKIYri2A9!21Z&6q(cgK0X=7r6-pUwRRM|Id8cj|+oE zahpDUp3YA-`G_WhKBzk{Ei-zB*S5~QBxSWObw|G)PUU9#I+OqhZ;wC~8_I=oMchsY z_z1TL55rq0_l?L-LRju`y2?k06TeO}HXc~mYvZ@ZBg9;!RH#fo`77lNGV+=8h|bv- ztdICHu@aF|!b_Am^^fkKG?|pS8T&Wh`xQsO@^8-+DM=&gVkSW1f7X$;&jg6oK+>C3 z=NaKKdSi{X9rdABBvE0>^T?RP!D)BzjDPduOfKmrOA4HJoC*K@V>)oifTUrUg5~8D zAVz(`q|8Q;ifIY(ua92R!C>sz{Ag$DCL^vEDH8m{dMv)mn>wE+C_q1AbIcCzXfF>bRnE1I6Hv$34-+>INl3$C)hAG*t}&hijwaq|B;iGG2!Yij z+q@{|*x!5-m}+imyKBuQxKSaYJ0{p@kP#ui&w}I0lmA<5TE* zj7OH;*(~i?fotcP1R$A$|Ic`9p;ZnjU57bi3KCqnb0XUSsh18;OX{Gbwvk6#3w1kpk4taM&iuyAKlr;Ze}XBRNj$l?V;B3{36Lc9P}zde7$6d= zvsDYGQO%{nts0eXwEtb>Ki;j_ZR;!-CKZHuf79!f-EjNR6eGFsw2M0`JBb>kmYPpJ zGQ;J``czHtR?f5YES;@!n|0?TDdX7QYGd1()QgbU`NkoJprcdfsijnuKEMEw&=Wo~ z;ObcuujK#@ea=4)>I`vn5g^ZL7+wJ+n=&xxW%6q_1QQUqmE|lBcz_wzq4vztyTANX zFS@39Cf3%hy0w@*z;^j-K5I)ZY(p4qsT@)ze>ijQ)Q{uZVgjni=SV5QNj zdTbPq_2Uu}B!`~b=fjjyJQn)dX&$(o=;Fw_B*(+@eX?j&(C3y=UoK9M0rSRfq8j|; z&lizQc>0ArIr7O`!r%ts zn{eDqUDH-NEpGR2hI_LS{$aF(*>OH0M-Cleh#teNR;p68G|w@KKeHw9WJ2ehkcCmV z<8yu`sz5mqoe%Yhv6j#?tOmdVK832|nwX@_J<%#iu=ESuqL?5Zkk5q_D}0FX;QzBO z3;m~qLl`%*)-|!05?ERouD8Y16*^h;ok4}OxFb52*Lt({RLN$^GCOHxY zR#WYiSLy?}L|Kr?F=rT+f_3zmg-h#>@J~YLevJHv zKAaAfY@+bzLy&TEh@3ye7i{Dksd6TX?0%6#!$1=JYf4U)P&;Xn1pmZ?zEdHPkw^!e zkQ5n!dcH+0gZHmbf7$0;0sjwDfyH@TDPONq4}rDCnUxYWE)_4jmQzE!n`&Mbm`c_p zn;_B|B0hK>GisVd!1Xe^xjnWlfl4^|1I#*We*{l$pHkmwNKki9lB z%uY%V-R&=}9B$M5sDwH17(qhC=TLqMY5t#7Y&0-3uP6I>C8mvhZ zCKaK|w3l8aNreJc6ws4Z5^!N3LF=Xz;cm~ zd_Hs=ot(u0Y+2yHa`_@PZ~0D@@g|0QlQR!nJ@Ztz`Jf#WafWR^4aWDy<&?B2U|?~a z-N1MHw$qB`E?HhIp@(lRXvCP1;QxA{>cR$ri2sl;a18#fOi#Yg9H>V0O*H+++@RBs z0SK+L?MYkeeDO}O44X%=Bhu?%;#Ovj_XdK8_dLc@tt-7 znKmRYqX$uG6?wI&Oor4nD~E3o$B=tUVA5bKYhcli>{Uh{)$b;JW6 z_9h=!S*j4ITFz9Fl_{319H$&um>N z@}b_^HlJa1C8e%96(kukhS>z1u3wnS26L*trm;tJ2^ja$=8kzx?x#2IC+@U^XeLT{ zOU#K6d^H#I*1qz3$^2X5fO#5WgkCVuavYS!R|544q;L|`Ax4381Y)LrbV7*rf_ZE% z!45!O$SF2^s{22nUEx9)PRiE!%rZgqruQVG;UBd2UC|_n0 zs5st)UYDmWi;Nj!WFF;D)`;{&$J%Z7XMKZCL}$ZzWaSYsiJ)e9;ERr>F5k89D!n&r zU%w-**bQNsF}skv;)Kc4&QcU+YkK-*Q0E{X7pu6QP_MDvnzQ0i1fd}b); zIG}d2M_%Uv(q~+EnPZ4e3HV4`Lv%ra(JAOk7z6M7*Oz8HGJQss?p0ERw__a%O_(1PVCXkJIGl^|H{N+`B+my#ODYE(#a5sK=-mlM%MU` zYYT%0|9a&LeB#SRD}ll1fl(mwOuLO|!3nsGJL|AE+HUpw)mGaI3OU<%T%@3AJSHQu z0RIh*e-% z`9M9$ixqJMrszB{rs-COm{w#sOt1$YMfL&7a-jHFXOJ`)9pZBy<0Q3&`Jy2h{?EJ& z|Mg-We6QSbH(70!^N98t%MlGA^`^_?B?|MtuF+j1ZOcK7N#-uz0upyq zea&lc`L8{{<6Qkx+it)5YU|ZkzT~QdW8y7u`Fj5ox^I3J!>xB*zVJm?E`I6Ni(l=% z{7+tcs-B3&42Qb&(8g?H~!@Rx&Qb-{&o02Kl*?Fr~mWm zzyA+^eeeJH4}b9czw;%fPyU9_|MacNul|{T+W6_O|H7aC#xMN2Z~2m+o&2I-{?_(? z_pUGf@4xAbfAODu?(Vz3Wa}H={;$9O3;xZ!8hh`0$KJcX;NMJs{x84tbGdfjS^e3` zzrX#?w}0T9-tp`2Z0=7s_J})_>sQ|S#XKIo>x+NwTN=Oiu6O*}H`foo`3nx-_4W_E zvrga-3>&}tjbHRD-&Eg!r(C}}`GwD4$*T{%>m3K*{6%uT^Bo`frZ4=}cYe_azWGc3 x?etfC@IC+VH)j9Q(Rcpi4}RCza2L{{taI%x?ey literal 0 HcmV?d00001 diff --git a/Tests/images/hopper_emboss_more.bmp b/Tests/images/hopper_emboss_more.bmp new file mode 100644 index 0000000000000000000000000000000000000000..37a5db83075d9ce6792cf2303246bc9ae42a8b0b GIT binary patch literal 49206 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 literal 0 HcmV?d00001 diff --git a/Tests/test_image_filter.py b/Tests/test_image_filter.py index e6172df50..c8a397e7e 100644 --- a/Tests/test_image_filter.py +++ b/Tests/test_image_filter.py @@ -94,6 +94,28 @@ class TestImageFilter(PillowTestCase): self.assertEqual(rankfilter.size, 1) self.assertEqual(rankfilter.rank, 2) + def test_consistency_3x3(self): + im = Image.open("Tests/images/hopper.bmp") + emboss = im.filter(ImageFilter.Kernel((3, 3), + (-1, -1, 0, + -1, 0, 1, + 0, 1, 1), .3)) + + self.assert_image_equal( + emboss, Image.open("Tests/images/hopper_emboss.bmp")) + + def test_consistency_5x5(self): + im = Image.open("Tests/images/hopper.bmp") + emboss = im.filter(ImageFilter.Kernel((5, 5), + (-1, -1, -1, -1, 0, + -1, -1, -1, 0, 1, + -1, -1, 0, 1, 1, + -1, 0, 1, 1, 1, + 0, 1, 1, 1, 1), 0.3)) + + self.assert_image_equal( + emboss, Image.open("Tests/images/hopper_emboss_more.bmp")) + if __name__ == '__main__': unittest.main() diff --git a/libImaging/Filter.c b/libImaging/Filter.c index 4c8b81587..633eb3438 100644 --- a/libImaging/Filter.c +++ b/libImaging/Filter.c @@ -92,6 +92,9 @@ ImagingFilter(Imaging im, int xsize, int ysize, const FLOAT32* kernel, if (!imOut) return NULL; + // Add one time for rounding + offset += 0.5; + /* brute force kernel implementations */ #define KERNEL3x3(image, kernel, d) ( \ (int) image[y+1][x-d] * kernel[0] + \