From 195dddf25b4879cd94a6adf3b81ac526433d3197 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Sat, 19 Aug 2023 15:24:31 -0400 Subject: [PATCH] feat(compare-images): build native pipeline Add test images from ITKImageCompare module test. --- packages/compare-images/CMakeLists.txt | 15 +++++++ packages/compare-images/compare-images.cxx | 38 ++++++++++++++++++ .../test/data/input/cake_easy.png | Bin 0 -> 8363 bytes .../test/data/input/cake_hard.png | Bin 0 -> 9408 bytes 4 files changed, 53 insertions(+) create mode 100644 packages/compare-images/CMakeLists.txt create mode 100644 packages/compare-images/compare-images.cxx create mode 100644 packages/compare-images/test/data/input/cake_easy.png create mode 100644 packages/compare-images/test/data/input/cake_hard.png diff --git a/packages/compare-images/CMakeLists.txt b/packages/compare-images/CMakeLists.txt new file mode 100644 index 000000000..f47dfd73c --- /dev/null +++ b/packages/compare-images/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.16) +project(itkwasm-dicom) + +set(CMAKE_CXX_STANDARD 17) + +find_package(ITK REQUIRED + COMPONENTS + WebAssemblyInterface + ITKImageIntensity + ITKTestKernel + ) +include(${ITK_USE_FILE}) + +add_executable(compare-images compare-images.cxx) +target_link_libraries(compare-images PUBLIC ${ITK_LIBRARIES}) \ No newline at end of file diff --git a/packages/compare-images/compare-images.cxx b/packages/compare-images/compare-images.cxx new file mode 100644 index 000000000..f3ffc3f3d --- /dev/null +++ b/packages/compare-images/compare-images.cxx @@ -0,0 +1,38 @@ +/*========================================================================= + + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ + +#include "itkPipeline.h" +#include "itkInputImage.h" +#include "itkOutputImage.h" +#include "itkOutputTextStream.h" + +#include "itkImage.h" +#include "itkRescaleIntensityImageFilter.h" +#include "itkExtractImageFilter.h" +#include "itkTestingComparisonImageFilter.h" + +#define ITK_TEST_DIMENSION_MAX 6 + +int main(int argc, char * argv[]) +{ + itk::wasm::Pipeline pipeline("compare-images", "Compare images with a tolerance for regression testing.", argc, argv); + + ITK_WASM_PARSE(pipeline); + + return EXIT_SUCCESS; +} diff --git a/packages/compare-images/test/data/input/cake_easy.png b/packages/compare-images/test/data/input/cake_easy.png new file mode 100644 index 0000000000000000000000000000000000000000..530a14c12c02cef3864870901d3f9a509323c461 GIT binary patch literal 8363 zcmV;cAXMLpP)9Z4x@WrQIY20I+OQyi4J-Z& z>{#(LSh3a%2?Zv23i0&RW_tSid&^g4ne^T#=fD>v9Tn6a)vRW>@E$(o{CF$m#>7xx z6zvI>(WK0&*!l4Hzkck5jspA0=*u|icrU;DJ9RXtI`Q|Bi81Y64GFbN?bK4F(j%$& zcm37*=l2_xA$$i9t8Oh|Z|%xs)(MWH&{iPXeIw!L?BW&$z?dw( z0_#|nQ|CR!>%dmct*NH}B$rAu#T)Qify)<`Sxpw(s|3p0yS_!EpgnC7JkS*u4{8*} zC`O#^u8@34(*0LPN-qNWYg0O~?0$kcW|Fk4vqOyT>a1cJZ%K1{i!nlA$w({PcfBC2 zhv19KLRcJV8zqC|i%;r80j#*-<$5jActPQ89o^~pB<4u(UP^mAcW7vl=g3i^qr_U< z@lX)NZ5*XNB7_zZFsreT+Hk2M+9I?f_V~Wasa#?A9fC`+wAP6wDiC{+3=np@{Q&2gwIv%IB*p}409Q(pjhhXWKVd>ZU1EF_UBW1H^{zhtll=-rRESO&p;8AMXu zV~q}_mT-sUisy?vr{SUHeDn>AgX(&CZ`Sm}$j5|4q|6lx#Oc~6 zRz2HK`X&i&sOkds!rrDiI~|0PQ^9!Xi)*18Y_~>h3(dP|Q3lG1o+Si6fsKM6ITcs0 zgMdi(VXNWc`K!|R<#o)mM{n$*axNYq@J`!msQm564MxpTlQ*x^dDaOgXv1+GySy#6 z5Q9dTdXM!**Xi#QHL{rUps|BpZQJmTZuF!|axVRe+oH?oOBWN{P8Yu z#sMna!=I!=&T7=ouGlCb1k^}y@_XG)Igvb41B2hUV)GJTG@ED%A|ge%%D(g1PThg% zx0sjGf+a#;-bnd+P`uHNa^H0U1$?&RkNm#p6am6~-X)jR^&Q_YFX6@ODXm0@I+HWV zA$qCunbJQiAyQ&V6r3Q7yCe_h8jdc}uW_3HZq4rylS`FDY{D0rlfRQ_TzsB}g|?~| zl3P&#DajlLz-0%^eS0sV&nkza<1hRH9g(48cbOQqyz10AcT1LqW$>`0a3_@uzq7g0 zJCicQ&Eq;^ z7+~V>y3<{Ju1aQhl)GzYF3nFxIH3eAL<=C&$5$;FeG1OE;G}fmoWpz-ZM==Kj6Py! zp-=3pj&2)AHWJc7p#Wpwf}XrwFh!4BG>=W4B?gTtn{WGW!Ooq(cJUc zrrQf?dm1hibM!*V+9r?}ia9uRTF3IrGX!?oprZ{lS`KDm%^M%`N6pe6#z{w*_W(*X z@Oz41VkmNmhkM%dby?Y+1Q&>GF)^AI`t2Wsf(A7`OQf@kj?@^8>AA0VNCkIwl3NlK zi5AgomG{vh|GhK4u|B}ka*HSNF!dVTHa)}2y~)_v2Vs%^7q<9Mo+hd8*+I%&;9O*%@p zLy1~lixAj%mwrL4%X+4oZLwPQb4VZk0y;a5sV%daIT`P{NR+vdkabCvg5D51S&?f6 zQ>yI_GJ~+S}B~GYW`&M6wm$qo`T$&T8vUDQYj5 zbUxClv;%QWfcEL264jP=s4ZPp?;C?Vzp9`^nPI2o{mGIt`^UIhUb|UYb*l=u`qNZ` zU(!L@TBIWbmJVI`!r6D-cfl*m;6dUKA#z{-Cv-acg&wY=AE!`B=2`T99VEz4f4Vi? zL6kHgohYgS;$=~@2IlsRd=c}}mmhu>E26=^{r6bp0@l{M>*(x_>)nqxr!S~SqK(9V z8ZV;oYarVh*%29bBPVaZ}6;VLuHsW^wuFuedBBehgoIvQOa-#NB^NXfpZ?n6!FD6aX3Ik zR1B`Sgqq~c385rtq44(t9)<@7J2u-k-H&bjG~u>f&vbwILNi2A zlHtxCNOTOfEhn$Kxiy-;#@y!%QTW>;T{YrXezfb{Q>tB+pc?2}RU0t{g51gxk^(qB z#_z61VP>APxl{JIwZJGvBvo93cMbuXzy)S*th}7epZ(l9Rp@+iu-M2KV65hf?!ns-X>wgr$4BS(N|Yf|9P{PL-48u=0(bH-)(x-6$Ik ziQ2O8I!cm@d_7M6kEvLAH>M{xXxn;c7uAW#|K-R>4Y8y-jJD70LF|{o3DDMJjIA3L zv4IZZMxqQ9`$v>D(98Oy{7UXnl%UYc4o@Gi&>+ORCAldmE~Gf&p)-ENcxLb@TKR_L zygl4(r@P}H0xx*?lr>xoKYFc-kWDTJbXl=(3w`ohYA%j#IxU$Www7wkhS})pY^<1} zB&6X=+zXA@i`qfU+!%#=>f-4R>n7Nuxd3rXs{&r)m&-Bn38_V*Zp^fdvO8cgLTr2s z@}Vqe>+XQi)5iXAwzW!lnGEjwdq#+T#ePQ&2SU{9C{1kpMM{ zmhld3dk?6vjWl0@{@1N@2B|5V7Y{#@ul>T3S{yoZ_rz$oEV1^wpCYhZGdz=4HsBlZ z994%1yBJn(R@2N1D~{c4mHB~EJVihK>0*`eMlTB%liik2_`wTeC%4}we4b|2i`mMd z(OVN%zre}*0#tG_{?qA38Q)zX1{G#V#-BuT3k}@OQ1KVgJmNnKI-7ugfH5(R9O$0e z5gAx>n`?3oL0Hxmfl^{PhP1&(syFLa5(|XNNk@n39J;iA7J;hv`O$Z|br|Wh_Xje# z44R_c+~GUZsyEZjm{LK=}|^-%L{Tz&Hs_*NKSP2UW{25)HY1(fsakKD%%GGPrTmV|$@e zlq-LSc}TEKaw0~XL3Mt2!umz`PDxgM=R7=IB~7{~r(Vo~Wyv=bYSY`dSX)ZWp$Jkm zCR;Yf9mu0WFU`I;@S_H^a{2hWK49Q@qW{_`SuAaS>)_z6xT=dw%R7DK2`Ju_5l4su z4AFkeO*7nGnWU6BqS8l-Y^_c^GoQC09X?X@CXMzYw@8Gdhm!Zf<<{qZI_jtIPbYuryF!IV|^ z`cXuxfGX`*Jls*}>HX0%eYH zPj(nv_%pG-&fqP7kWeg~=)zlsFT<}D4pt0Pg{c^YEqP1syX^nlW-3gD{77*2_1kGp zP){^SjtSnGLbT_fqI(riRJJ-9BJ}T36 z{Mv{HB(%yq1rO-ZX$PSm{q-O%%4H9Yz0J+`R(CJ{^brS0rJ@dh(|HZn-t!>Q>{Nn(|Gl*C{_9Ffrr<@Y0R-t8oZdHB0)XnCr_NDz+!ypkts zi7Ec=B+#75hAJy)Z(rP%oy8AMhP_@4UifT++8O;F7fw{LDQH?j_5K4l7VGDslBTQ8 zK5z7=*VV}8Fw-fvagt4^A6#MAt@L+Ee@n9uHj~$2fGu`okPp*Xhco$Ut1!!tT9BJM zFKs61Oic5YB+U4KJwNo0x9hqS%TzBSrtjuQarBq%=AufZHS&@whIV96gaUf0O2CZV zVRsujK>^_N```o&%C1X5sq4B-;Wt=V3z=W7XgB^f67e%r#0fNojB3&+T0qWASg4iy zj;P3Kb)v$51;5lkW~n2KW5>hXq6r=cf5q*$i7&v5W~sLyG$%)N6ow->{Fra@KXm&QlCMA9_rEm( z+94J!lzct#s7IqkiP{PsMWtE;88~1qz4qRe&Dev|ZpqgL+{>!hR)Pr<*i%gu)esBw z|AoH?&sSb7A&%8ps!hNVM*pvOl5&hm`{Gd2cpd5;FF~y(8BY$#ieYfqw=QYjwJd~P zjD8s&aOoO4r8C?@x#nOrDDY;B-I8{kLWXWG2&B2@BK|arMM-&AbW~(f7k}y&^lhBS zu+;XFTNEwrL{|swf`dm?27NeCM=!zO0<_(YL4tcDE=^Z541qC<0pW4S_KH|*bvdsUtFNW5bjVsYO zkIwlSb~HZ#Mpl-r-3{>qjyr=gcSz_z2JrJWe=OR?#uz%|ZO^o&ZVwWTkIPYjz2?L3 zU7uT_x#*dRGn%7bFkay@UP&{>?QU~KkdKXrV5sj=F5vQ$L{;sZr%L6$4!g%a5Vb0X)M3C-v=B9ja z#;l>6<4xT&8pPS78CGkg2b`KKTCKa&?y~o)*qa7HW)srrHmpIh-_VO&`xuODm>7B1 zu*g9(-`sfQV_S}j{-OB0uCf(RUu>Nfxd%0omZ&~_s32)698Ma^;_PR>rzThwfJ@f# zop6*Up%66K9_8(@e@m0d-Nn~rG7j1pDh^-WnES_TSuzi~`Z`K8rg4u48^a2828U*@mITmf}kpi91{B~ISJ%vpe)YmCCT>TYDV0AN9hd|tpv}^{NKLq zUw9d9m*>?bJaoYC=IRE{+)&MnU0k%}nN={u7=6YX$|7~zRW{Bb8$&uvhTV#OPPS&r zRx^BMRM9VMpJYR-g8Zf?e|`Vjq*Ma?eRp@pualu4I=pdNym%ujL2|km6ev2%u;IG_ z_H2|G-xS2;nwzHtp^(*SNvQl=W@L8SVlHywANYO{d{jcTdb`Gmx0qZK&;Ila)WhF3 z({!^=X7@HNhX8V9BYEU`vCVT6$%oOEAfuQ!Wfkj-Tu zy!F5h39C`MWtN;*k=a(B!ti@(AHx#w)~(}jmWqtzlSc9FjQn)Q*#q1rwOprJ=p@&L zT}PuMk4ZttEaT&0#nRD}&SDD=OG$MGe2*AaT*IY+;B%4Y4&Z)eYPEGsipJT$GSRfA zrmZ$!K_0v_eV(Yu{p@O|txj@UPUEsqH-p`~Kz$8*I$a16>Qj=YxzbjI=Fs{QiH48e zqu@sZ*l5u<1BlZXzjvM~DeKSrdzM4+?1EH+A0DBT?Q4~kE`0^wp!I0_Qz?Cc+B1~H zVs&9<6nKgTbQE0#%_k66Bqn8T%5&YH&Sa9IrH$!1)U&$X-U#H^!2cw zd^2=)^)DAAG2qdc0Xuve76MN&W@CQ(r1|*uKj7`{(y&mqVM$_t71l1QIThPbOUKe4 zBLrvvuQ2#>F$)yiRi;Q|aRb*z0l4zCi|vw56*AShG_{f#5`EpZ6%g&k2*|#2Z%Rk+ z>=%lG< z-g=|xow&6et`Av0G1-6TL?z76X_kvg^awj2)1>{}r9nE@fGEdvz2OG^q`N+y6tGqAadYJtx~Q3of_&H z5hj&=9)iw{MO;2{#<<%}IW#rT==zl*=-9h<8mq{K8g&cL+gq<`{r>cDB$%RyjOIh3 zusV6ZlfjtG8LWtyVy-NznC(c5+9-EWwstrV!*!w!vy($_2t6pd!pQ9_z1=Q%0^UefV~N3V+?* z%#YfW<{tB-eV!4ZZf@|Cuav_Yth2MA3~XXZb9Y2@Hk?u{B zX+1KLj27X@I)I(+|M;47+!Aw5w1u~ymo+&*ADV~4B@47Y<89~2fpKo4eZSeN5Vn;E zSCrg?-g(K0CXe)j<7=aB$Cxo@YVrFdi&X~MFW)VYx?+y}8##a_NW!C^|H$C_Tua7>yY}R|T zMA>6v!x4u^=|GyNVOkXPD8btMpu0LGYAm$A7yUN$Gf}k>Oq}1`-RkPrVwV|V0!h1P zT*WP$>#9;wN2L)AC-!!CE{6`t=3O+e{-{rI2t|oOx|20=z+K zCNTmEl#Bf&Finm&4{{krm@7LZL^qc~2z*9iTYh%J@K22ww&%5{LBr%vzfGcarJ~$y z@YqJI#zQxNptVIG)`b_;{pEW#+mz*lFKCNmC>>(A|8Bq1IRPOj%-umNg^&@NH z%U(1Aeaa~hUSBs_t#6?96&G;vLTFg+8BDjZMax}@+d)KIMydjsMw|{cV)$5E?eZ>J znQ2iiMZP+-kg?=jvCiAcXXy1;W&LnPLjrXa6yC%T159keZiQMT-!0m$1b3v}>YpRj z5n@`BMYO+lhKTsm_*{NCQuNXl+Bp~cnEcpoiNs--y-U06A*L*4w4x{iNffjH`&1D5 zM8(nrw9Tr8A<$wUh@s%&LIwq+X!16)uRi0GA2lm%$+=-!Eu0RJh_1#A@LSWtG1_F^ zS4v(F)@C_x(B}w%SZP(y42du1SrRuus(Tu4?RLS?;oGg<4H*h>2#iZ|l>%6KR07@- z^XU(S{^td}=jRzlc5`ZIUVj@={pn(no1(RoObTomAGis z^Qw86bL^-7i-Mm1GKR>*Kf?~slXPW#S97+WK1$2k4s=byfh?%)mrt$yuT ztUa!(!nKI*uD<*^7Md?@<0s25AZ2|%BcZspZ@+#7S-q8>%%8F&U7kL1n&pQEzBhyhYcK@>#6#D z33sa~*|D5cmd*Qfyy^6dSWXOdXhBqsb>7ta4fR)DxhB5TE!{`F_dj!!^bL+&iGrd0Ci5d1XV4|7w zPJX&6a3(H_*^7EK+{W_YA9BA6;Wsl%r!%y&UE z4GYOgc&7Z?rB2-%SLdL|KMwhTOb_dK=qD1#Ik=snpU8xOyngPA98>X2SchedeT@fq zh_{^w5^;^!hJO*OteCTb?Ia&orX9lIzx(Bi0jP1D0TtCNWV0hEDB5&1I8!` zqu$aQ|Lpkfw8?J~Rh#wO*;@xnv(vz~p&49sMBz;UNbGYotq^K09JN5%NaJlYA5$X} zOi*72AAiw1cf14NhV1OUGkOkUAC|J?5G4Q=iv7$w4IOlBdK=-0x~4^&4A(H}b>?-G zK`0ekJq3-_X@>m;wRgo;u*z4`{I{zk5)PN$dzc{?S2oc4%sw9q#=)*+uNIOL{;<}A ze)a0l9TF`FC?l}A1^btXI`3%a5A^F+elkYI=?fEAJ>iXNvvZztj~yq8-jiP2kcsY5 zSx>xlg+N@gz+my%Se&ie&k9 zIP#+#e?Pt(wP*P;=UTsTEqFR{^%LQ6jJhNexvW7j8P|DI&1PksAcYQieXIaSX@y7W zt(9&Odhpsz-vQh=0%N%1Vv5&W`c)FrIj816h8z&3P$^HN))3m=c9P9irpv3{yRExM z38wUFmyjt`-F6?;72;96MNhB6SqH80w2l&KUQcpCUbn2i^fNEaPu1Q_(b*liU0$$A zC^XDUrQB$OBb*r<-Q5s5m|QwRUZP9A&G3m-hvadzs!u$GqD+%Hk#c2>akY2p0UV!F z&u%C(9zJpKux!5#_FHIFtcqP;2#{S4Bl}nPM4Nq>_}f*lVngEbY~2bdW^q9_P18SJ z>XqzFySpOjA4i$_rhp!HvaiiMj<^#}SvdXR?fmmGC$&(0tlHYHR1Fs_(mP;4pa%fpHLnzC99DFcNzsbZa-9oW5{a6<%3o4g=W>=C0BTZEOwiY+COlr$G zY433!Jpiy2!l(p7e;uA2pm5oNeR`8obuuRtbi5mWt3fdG>x~mZS9nZu>X-49+PSZrZjWmuoIC<;k&Hd}V^jbJ#7=o?ydQ!9002`- zL_t&qoBOLHhgxYzMdsO6DVITJa%Q(|+oCAN>V8+3IcO~^kY`cF)W;f%ju_BrIcz<( z+h2^6CzLJ-X-77=I;Ww$IM&Rj$-dp1(&h$V|9_*DF>S;xnyml;002ovPDHLkV1oQ! BW|aT{ literal 0 HcmV?d00001 diff --git a/packages/compare-images/test/data/input/cake_hard.png b/packages/compare-images/test/data/input/cake_hard.png new file mode 100644 index 0000000000000000000000000000000000000000..6db3f10e39194e8db7438f637176f2f53c7aa60d GIT binary patch literal 9408 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