From 9e4b53b74f918e2ba9a811a814a255157320d27d Mon Sep 17 00:00:00 2001 From: antifallobst Date: Tue, 21 Mar 2023 10:04:20 +0100 Subject: [PATCH] implemented negative masking --- main.c | 92 ++++++++++++++++++++----------------------------- paris_mask.png | Bin 7027 -> 7255 bytes 2 files changed, 37 insertions(+), 55 deletions(-) diff --git a/main.c b/main.c index 09a7d2f..7ac8f91 100644 --- a/main.c +++ b/main.c @@ -9,7 +9,7 @@ #define DEBUG_BUILD 0 -#define MASK_VALUE 50000 +#define MASK_MULTIPLIER 50 typedef struct { uint32_t width; @@ -17,11 +17,11 @@ typedef struct { uint32_t new_width; uint32_t new_height; uint32_t* buffer; - uint32_t* dist_buffer; + int32_t* dist_buffer; uint32_t* mask_buffer; } image_T; -uint32_t pixel_distance(uint32_t pixel_a, uint32_t pixel_b, uint32_t pixel_m) { +int32_t pixel_distance(uint32_t pixel_a, uint32_t pixel_b, uint32_t pixel_m) { uint8_t r_a = (pixel_a) & 0xFF; uint8_t g_a = (pixel_a >> 8) & 0xFF; uint8_t b_a = (pixel_a >> 16) & 0xFF; @@ -31,16 +31,13 @@ uint32_t pixel_distance(uint32_t pixel_a, uint32_t pixel_b, uint32_t pixel_m) { uint8_t b_b = (pixel_b >> 16) & 0xFF; uint8_t r_m = (pixel_m) & 0xFF; + uint8_t g_m = (pixel_m >> 8) & 0xFF; - uint32_t dist = (uint32_t)sqrt(pow(r_a - r_b, 2) + - pow(g_a - g_b, 2) + - pow(b_a - b_b, 2)); - - if (r_m > 0) { dist += MASK_VALUE; } - - #if DEBUG_BUILD - printf(" %x %x %x --> %x %x %x = %d\n", r_a, g_a, b_a, r_b, g_b, b_b, dist); - #endif + int32_t dist = (int32_t)sqrt(pow(r_a - r_b, 2) + + pow(g_a - g_b, 2) + + pow(b_a - b_b, 2)) + + (r_m * MASK_MULTIPLIER) - + (g_m * MASK_MULTIPLIER); return dist; } @@ -66,39 +63,27 @@ void image_destruct(image_T* image) { } void image_calculate_dist_buffer(image_T* image) { - memset(image->dist_buffer, 0, image->height * image->width * sizeof(uint32_t)); + memset(image->dist_buffer, 0, image->height * image->width * sizeof(int32_t)); uint32_t* last_row = image->buffer; uint32_t* pixel_row = &last_row[image->width]; - uint32_t* dist_last_row = image->dist_buffer; - uint32_t* dist_pixel_row = &dist_last_row[image->width]; + int32_t* dist_last_row = image->dist_buffer; + int32_t* dist_pixel_row = &dist_last_row[image->width]; for (int y = 1; y < image->new_height; y++) { - #if DEBUG_BUILD - printf(" Y\n"); - #endif for (int x = 0; x < image->new_width; x++) { uint32_t pixel = pixel_row[x]; - #if DEBUG_BUILD - printf(" X\n"); - #endif - - int32_t shortest_dist = -1; + int32_t shortest_dist; + bool found_dist = false; for (int i = (x > 0 ? -1 : 0); i < (x < image->new_width-1 ? 2 : 1); i++) { - uint32_t dist = pixel_distance(pixel, last_row[x + i], image->mask_buffer[(y * image->width) + x + i]) + dist_last_row[x + i]; + int32_t dist = pixel_distance(pixel, last_row[x + i], image->mask_buffer[(y * image->width) + x + i]) + dist_last_row[x + i]; - if (shortest_dist == -1 || shortest_dist > dist) { - shortest_dist = (int32_t)dist; + if (!found_dist || shortest_dist > dist) { + shortest_dist = dist; + found_dist = true; } - - #if DEBUG_BUILD - printf(" 0x%x - %d\n", dist, x+i); - #endif } - #if DEBUG_BUILD - printf(" 0x%x\n", shortest_dist); - #endif dist_pixel_row[x] = shortest_dist; } @@ -111,14 +96,16 @@ void image_calculate_dist_buffer(image_T* image) { } uint32_t image_find_best_line(image_T* image) { - uint32_t* row = &image->dist_buffer[(image->new_height-1) * image->width]; + int32_t* row = &image->dist_buffer[(image->new_height-1) * image->width]; uint32_t line_id = 0; - int32_t shortest_dist = -1; + int32_t shortest_dist; + bool found_dist = false; for (uint32_t x = 0; x < image->new_width; x++) { - if (shortest_dist == -1 || shortest_dist > row[x]) { - shortest_dist = (int32_t)row[x]; + if (!found_dist || shortest_dist > row[x]) { + shortest_dist = row[x]; line_id = x; + found_dist = true; } } @@ -129,14 +116,16 @@ void image_cut_line(image_T* image, uint32_t line_id) { uint32_t x = line_id; for (uint32_t y = image->height-1; y > 0; y--) { - int32_t shortest_dist = -1; + int32_t shortest_dist; int8_t offset; + bool found_dist = false; for (int i = (x > 0 ? -1 : 0); i < (x < image->new_width-1 ? 2 : 1); i++) { - uint32_t dist = image->dist_buffer[(image->width * y) + x + i]; + int32_t dist = image->dist_buffer[(image->width * y) + x + i]; - if (shortest_dist == -1 || shortest_dist > dist) { - shortest_dist = (int32_t)dist; - offset = i; + if (!found_dist || shortest_dist > dist) { + shortest_dist = dist; + offset = (int8_t)i; + found_dist = true; } } x += offset; @@ -182,25 +171,18 @@ void image_dump(image_T* image) { gfx_flush(); - #if DEBUG_BUILD - printf("Distances:\n"); - #endif +#if DEBUG_BUILD + printf("Distances:\n"); for (int y = 0; y < image->height; y++) { uint32_t* dist_row = &image->dist_buffer[y * image->width]; - #if DEBUG_BUILD - printf(" "); - #endif + printf(" "); for (int x = 0; x < image->width; x++) { - #if DEBUG_BUILD - printf("%x ", dist_row[x]); - #endif + printf("%x ", dist_row[x]); } - - #if DEBUG_BUILD - printf("\n"); - #endif + printf("\n"); } +#endif } int main() { diff --git a/paris_mask.png b/paris_mask.png index 16ecf93a90a9cf97e499460fde5b40497f37914f..9734aee32be7035fd44b2021b62b7d9b66171006 100644 GIT binary patch delta 2555 zcmVRxiM@wcdGi+Mqg0* zy!wV#JMS2MM@#d&iF^xk{XGBlen{o#s63(nVPtLZtNiu;(pT1n_$~TR@Xv1NSu?8` zS_yT1FY057&lT-}L+{WnFtr+uU!eP0H-xZ-4AsizDQCu!Pgq?7zPuYa_d zqGk`-xX5_{+P&Gta?k6*P4AvgHtDjZf$Ms~F8OmV=^3`i6`s)=Bkx4hoaij^$}jKX zS6?{imO@H5mO!6g_~v|r%``4@_ee7kN#`BZ@&x!}|Gr&Z1q92D@-2~0VCSogS<-)* zKpvolhK2L129xb~2ZV^B3zJC#0)L>Eq@ zJ2bCYdYa~vxgEFOE@rVqe^N4&EElt#E@B|4 zo^mj$LNTinz8D z${A_wdQvUZD9{aoB9C78I-cc>ZF%{S=3ttpx1Ib{GOehOT7Ytnc7Nsxsn_Go@btdc zPRgUL*7Cj5a+UY*ox`ub@cmrIhCPOct-d=+t_Q3w`HHR^iS|sg_h>42sdttq3rRGR zoz?2t)9*3}%RZ@`14FJRsKOZp;y!Q!biu1I=~!#RKIjn{bj<1@z{jh>Rd+&W{p9*g zF8qU4eL4S~j_NqgSbtKd23lv4YbGz92~%gsN$BD^jFL?^92RSlKb=IY}VbWsOoaCW44)?|p)GaNFv>b@cGwhwjO zotX}WMc{SJ6HxUW=B{#N$MK|n{N1yJ0mFz^h}S2zcdMc-p?_RrU6J}3lK`2nS{6jr z%N(^*N}0s-oE@ zJ7(Kqkw0366gygShb(HBIZxSJ>`=l=#1#|ayQNiNnx@C_Ier|Jrtj#tkAP{wxL_F@ zszS6$Tsb%I2Y&&lJa>^kLCzfCG4wdZF@n4 z9gsKD+;W~fkJ&mbP2rT@;T7_Ho;9GJl>>YS7n5U|L=(5((Tp`u^f6hg*w|zFWLH zU_gNz#7oT6xVi|vA|Mpnx)qlWN;JzN+2Rm$NS3G~Bc<%nPHP8EKto6`ol9p#gFt?i zW5Zd(-hWFVbt3ju5Fp50QBO2GfIP;WEMllkZhSxBDRS^u9A&4XtkT- zMX!&Robq(YK2?6uol{2h&Jc1V@*VcZ&b|UL&m;Rv-Nh)T$o7N591n zlEc6fNQ$munN_z$C<~uCs0j%XU@|I22L-Nox{{HD=tgc*|LbzBSRCz9Ry1@8`HY#t zMLbnRYux z*XfYUNF77NU+~4aex^Y=G^2Dn9}gw&4&QGCf+WQ6t<%x=LgueJ@kbWUn3b;(JOYfP zufP->&i~xjl=jjSzE*K&hg2)1Zl2^3Bu}#C59uWIM1c_CN|6N3u&?U<5N!z7qJN_$ zinu9ti^`c(wq9GPnC?z-Wb-2!OCfRd><_s#be$5ve4P(|P6uf0dP!~fmf@+^5f6f5 zG04IO`mzm^wmxZx3jk}V0%C=(`{V(k>Q`2 zkpFk|gT5Rba}WOkfUOB}gvfGw0004nlc@+Ce_N$RDh^fiY`*(|B^zB7!Qv7@$TN^?j7K7 zRG4aZ#Q{~bjC3*~WOJ)R@D%|JAcP5wNzByeL@@==@pTU$U+-c(%lq7)qgTnB4DboW ze{rT87V!r0%%-Jt-Y1T*lB5uy6OS8oLE=ZQ%PzlhE;{VznGqwCo+pkF3&jqWJD8OW zm3W#ss;C;}`?D@9oVPful^Sc^lfN*W*H)IfPIDMZEMf^F1jwkNj0!BoXw^tDk*58G zhkwZNi{z5YRR$x+0;*6UIezdz_}#5pf0&wdlfnt0`^C0DMu6Zh(5&0`_pxm^Pk_KP zaHX~V)dn#8NqW7lMUQ~KZQ$a%t;u`9DJa?Csw(t^R%h%gl1h3}1%7000j^X;fHrSWQeivp@=h z0wgzMV`gGBWo9j5HZ?IVG+{Y2EjeRhWG!YiV>e+qHD+dGVP%u%45GdD3dGB_|YV_}o=4k(lT45N`+sdRKCrlbjeb R2o(tdEW_YB%CpuOodU}e+AshB delta 2499 zcmV;!2|V`KIP*4;BmsDlB}oH<5pID^cTye6m)KdnolQiu#(n?^gf8Q>y0)pj6`KCxGu=CZ$Ea|^W zAP>+&!@~KMgUR;0146{mg~^ZyntwnoNl7(D%h^&QkPUzaQ_rG#flq=HS$ zcW7R*^fb*Sb31S!F$0MrRSayp48T$?@W-^lp;4r0DWw)Gt@JXgRIR1fYW0fZFfk2Q zteRP~Zlg)lR$6V=TI+4}+y&7ry>{!Z_dW(=4tgHEJ!mk-%u}Y$5@ww?+kfnHEa zl*>sU*oFK;^dk3gp_KAw9Uxs7Xf zuk$R!${5@C39D51#rjuAPJM17D?Vk|vQf7)#WW|8ORcVHTibD#I#Q2w>@rhU%(b0R z&PZd|lWLhpf^Gy9d-S^3@hoR-%gcu}2h%jY?c}Gzw4y$00m?brnSUpwUXL@w)B9RG zDUY^V%lAslb>6>s4!`=s_j4H=^%xqq`tFci4_I6B6-75$xCO#l9Bw)pMA;%8?z%L;LuTXPjc^OMOi|+#DBUX`77r9UOqbA`)aoq1H+8pP~bFO1P!yK{cP{c|(^dUrlS<3nA=) zys_q%^W1sN)=_B^r}U1l!1H<5KzddV=p9-N$1+3{x8CuLHBa<0S*qCBWBF!2gW$g9 z!EKFL9>S7`(i7sZ{n|){s9Bc^cOjkyi|aL|ZrG(!q&lS&%IbF-K&HDmGHe4(+sd@B};rdg)v`BOV0uqZ}K~ z682t#sDBf&CxZY%=8Afv;WJtsqbU}~BV2j6mos>i)qW>W!k2`Z3`1-Qf%gfH*8!4n z>^_@c&nR#UMjqP0tb;mU{PE0iFfI^9GBZwton#gRV<21RlZb6nAXmx88noJ_c+p!& zOHO$@Vsb2=9b{sTbP8M~M_O~vRBt_iY@gx{w14VOg&%xV+YXn4yYz zvWV7H^QQ+=*3c_$luH|<#=a@*?kCr^;D5%e+s9&cYmh`l9ki(g8}-d>w*V6%gr$XB z>A+>Ij-k;n^kUq4rXe{rBXv3-4<+u7-fs*75>oH2)A9BK^H-hJM;6YQm9G$L1QbVK zfhklt|MRk@w3naowMu1npjv^tdBP(^9R>m>9yvg=0bq?(AgsuBpL`(H?wuS=2nNE4n&$3wKsCnq2O_UCT;AJ3M=OI- z2jC^tRVb`S2ao!A4eN`Pxl`ogNjHT{MUS0}-0!81l`48f^-?IIk%YHKc7pTk8X5js z5%T|ze(;w=#oWVx03tUDY-qR_`~Uy}gOjKT9Dh^AA{7S%ia2DbPIgg|j?U+2$*-g8~d7oHhB}F4XC!RFvg2azpS3Q2?Ty$CBnWC9V&l8KpQn8EGE@mZD zC!QgWXu3i9Le^uA^A=~lQfKXZ@)w5l#>z6+X^tU@MJz#v1Qm6ZQGtyptp+I;(zKuO z@sGNGnOrKl%3$PJKovR^*AM;&zq_>x(|=Q5QaAzhzBtauIMBBXv>J}{ee5``6Cn5u zTp1mIwF$&NNpEzt$PqBO4P0DzG<6TS+yO?OYKp12Qjn%lC;;zg^i4Tn=oaW-^LlIV z