Artifact
f23f75773bcb40848647da820ba902a59ae6587049660bb1a457f51db81b9c52 :
File
etc/transformer/structure/embed/band/copy.tcl
— part of check-in
[c4b6c0e2c3]
at
2024-02-08 20:18:38
on branch trunk
— feat: added band embedding operators, `black` and `copy`, plus tests
note: when embedding a single-band `copy` uses `resample replicate` instead of `montage z`
feat: added pixel-wise linear blending between two images under control of image with blend factors, plus tests
note: uses band embedding to match the image depths
(user:
aku
size: 1777)
0000: 23 23 20 2d 2a 2d 20 6d 6f 64 65 3a 20 74 63 6c ## -*- mode: tcl
0010: 20 3b 20 66 69 6c 6c 2d 63 6f 6c 75 6d 6e 3a 20 ; fill-column:
0020: 39 30 20 2d 2a 2d 0a 23 20 23 20 23 23 20 23 23 90 -*-.# # ## ##
0030: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 # ##### ########
0040: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23 ############# #
0050: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
0060: 23 23 23 23 0a 23 23 20 54 72 61 6e 73 66 6f 72 ####.## Transfor
0070: 6d 65 72 73 20 2d 2d 20 53 74 72 75 63 74 75 72 mers -- Structur
0080: 61 6c 20 63 68 61 6e 67 65 73 20 28 64 61 74 61 al changes (data
0090: 20 72 65 2d 61 72 72 61 6e 67 65 6d 65 6e 74 73 re-arrangements
00a0: 29 0a 23 23 0a 23 23 20 49 6d 61 67 65 20 65 6d ).##.## Image em
00b0: 62 65 64 64 69 6e 67 20 2d 20 63 6f 70 79 20 62 bedding - copy b
00c0: 61 6e 64 73 0a 23 0a 23 23 20 53 65 65 20 6f 70 ands.#.## See op
00d0: 2f 65 6d 62 65 64 2e 74 63 6c 20 66 6f 72 20 74 /embed.tcl for t
00e0: 68 65 20 73 75 70 70 6f 72 74 69 6e 67 20 63 6f he supporting co
00f0: 6d 6d 61 6e 64 73 20 28 43 68 65 63 6b 2c 20 2e mmands (Check, .
0100: 2e 2e 29 0a 0a 6f 70 65 72 61 74 6f 72 20 6f 70 ..)..operator op
0110: 3a 3a 65 6d 62 65 64 3a 3a 62 61 6e 64 3a 3a 63 ::embed::band::c
0120: 6f 70 79 20 7b 0a 20 20 20 20 73 65 63 74 69 6f opy {. sectio
0130: 6e 20 74 72 61 6e 73 66 6f 72 6d 20 73 74 72 75 n transform stru
0140: 63 74 75 72 65 0a 0a 20 20 20 20 6e 6f 74 65 20 cture.. note
0150: 52 65 74 75 72 6e 73 20 69 6d 61 67 65 20 65 6d Returns image em
0160: 62 65 64 64 69 6e 67 20 74 68 65 20 69 6e 70 75 bedding the inpu
0170: 74 20 69 6e 74 6f 20 61 20 73 65 74 20 6f 66 20 t into a set of
0180: 63 6f 70 69 65 64 20 62 61 6e 64 73 2e 0a 0a 20 copied bands...
0190: 20 20 20 75 69 6e 74 3f 20 30 20 75 70 09 09 4e uint? 0 up..N
01a0: 75 6d 62 65 72 20 6f 66 20 66 69 72 73 74 20 62 umber of first b
01b0: 61 6e 64 20 63 6f 70 69 65 73 20 74 6f 20 61 64 and copies to ad
01c0: 64 20 62 65 66 6f 72 65 20 74 68 65 20 69 6d 61 d before the ima
01d0: 67 65 20 62 61 6e 64 73 0a 20 20 20 20 75 69 6e ge bands. uin
01e0: 74 3f 20 30 20 64 6f 77 6e 09 4e 75 6d 62 65 72 t? 0 down.Number
01f0: 20 6f 66 20 6c 61 73 74 20 62 61 6e 64 20 63 6f of last band co
0200: 70 69 65 73 20 74 6f 20 61 64 64 20 61 66 74 65 pies to add afte
0210: 72 20 74 68 65 20 69 6d 61 67 65 20 62 61 6e 64 r the image band
0220: 73 0a 0a 20 20 20 20 69 6e 70 75 74 0a 0a 20 20 s.. input..
0230: 20 20 62 6f 64 79 20 7b 0a 09 23 20 66 61 73 74 body {..# fast
0240: 20 6e 6f 2d 6f 70 65 72 61 74 69 6f 6e 0a 09 69 no-operation..i
0250: 66 20 7b 28 24 75 70 20 3d 3d 20 30 29 20 26 26 f {($up == 0) &&
0260: 20 28 24 64 6f 77 6e 20 3d 3d 20 30 29 7d 20 7b ($down == 0)} {
0270: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 24 73 72 .. return $sr
0280: 63 0a 09 7d 0a 0a 09 23 20 62 61 64 20 61 72 67 c..}...# bad arg
0290: 75 6d 65 6e 74 73 0a 09 69 66 20 7b 28 24 75 70 uments..if {($up
02a0: 20 20 20 3c 20 30 29 20 7c 7c 0a 09 20 20 20 20 < 0) ||..
02b0: 28 24 64 6f 77 6e 20 3c 20 30 29 7d 20 7b 0a 09 ($down < 0)} {..
02c0: 20 20 20 20 61 6b 74 69 76 65 20 65 72 72 6f 72 aktive error
02d0: 20 22 55 6e 61 62 6c 65 20 74 6f 20 63 72 6f 70 "Unable to crop
02e0: 20 69 6d 61 67 65 2d 62 61 6e 64 73 20 77 69 74 image-bands wit
02f0: 68 20 65 6d 62 65 64 20 62 61 6e 64 22 20 45 4d h embed band" EM
0300: 42 45 44 0a 09 7d 0a 0a 09 6c 61 73 73 69 67 6e BED..}...lassign
0310: 20 5b 61 6b 74 69 76 65 20 71 75 65 72 79 20 67 [aktive query g
0320: 65 6f 6d 65 74 72 79 20 24 73 72 63 5d 20 78 20 eometry $src] x
0330: 79 20 77 20 68 20 64 0a 0a 09 69 66 20 7b 24 64 y w h d...if {$d
0340: 20 3d 3d 20 31 7d 20 7b 0a 09 20 20 20 20 23 20 == 1} {.. #
0350: 43 6f 70 79 69 6e 67 20 66 6f 72 20 61 20 73 69 Copying for a si
0360: 6e 67 6c 65 2d 62 61 6e 64 20 69 6d 61 67 65 20 ngle-band image
0370: 69 73 20 6a 75 73 74 20 73 74 72 65 74 63 68 69 is just stretchi
0380: 6e 67 20 69 74 20 69 6e 20 67 65 6e 65 72 61 6c ng it in general
0390: 2c 20 77 69 74 68 6f 75 74 0a 09 20 20 20 20 23 , without.. #
03a0: 20 68 61 76 69 6e 67 20 74 6f 20 63 6f 6e 73 69 having to consi
03b0: 64 65 72 20 66 69 72 73 74 20 76 73 20 6c 61 73 der first vs las
03c0: 74 2e 0a 09 20 20 20 20 73 65 74 20 73 74 72 65 t... set stre
03d0: 74 63 68 20 5b 65 78 70 72 20 7b 31 20 2b 20 24 tch [expr {1 + $
03e0: 75 70 20 2b 20 24 64 6f 77 6e 7d 5d 0a 0a 09 20 up + $down}]...
03f0: 20 20 20 6c 61 70 70 65 6e 64 20 62 61 6e 64 73 lappend bands
0400: 20 5b 61 6b 74 69 76 65 20 6f 70 20 73 61 6d 70 [aktive op samp
0410: 6c 65 20 72 65 70 6c 69 63 61 74 65 20 7a 20 24 le replicate z $
0420: 73 72 63 20 62 79 20 24 73 74 72 65 74 63 68 5d src by $stretch]
0430: 0a 09 20 20 20 20 23 20 73 69 6e 67 6c 65 20 65 .. # single e
0440: 6c 65 6d 65 6e 74 20 6c 69 73 74 2c 20 74 68 65 lement list, the
0450: 20 66 69 6e 61 6c 20 60 6d 6f 6e 74 61 67 65 20 final `montage
0460: 7a 60 20 77 69 6c 6c 20 73 68 6f 72 74 20 63 69 z` will short ci
0470: 72 63 75 69 74 2e 0a 09 7d 20 65 6c 73 65 20 7b rcuit...} else {
0480: 0a 09 20 20 20 20 23 20 4d 75 6c 74 69 2d 62 61 .. # Multi-ba
0490: 6e 64 20 69 6d 61 67 65 20 72 65 71 75 69 72 65 nd image require
04a0: 73 20 73 65 70 61 72 61 74 65 20 68 61 6e 64 6c s separate handl
04b0: 69 6e 67 20 6f 66 20 66 69 72 73 74 20 61 6e 64 ing of first and
04c0: 20 6c 61 73 74 20 62 61 6e 64 73 2e 0a 0a 09 20 last bands....
04d0: 20 20 20 69 66 20 7b 24 75 70 20 3e 20 30 7d 20 if {$up > 0}
04e0: 7b 0a 09 09 73 65 74 20 66 69 72 73 74 20 5b 61 {...set first [a
04f0: 6b 74 69 76 65 20 6f 70 20 73 65 6c 65 63 74 20 ktive op select
0500: 7a 20 24 73 72 63 20 66 72 6f 6d 20 30 5d 0a 09 z $src from 0]..
0510: 09 23 6c 61 70 70 65 6e 64 20 62 61 6e 64 73 20 .#lappend bands
0520: 5b 61 6b 74 69 76 65 20 6f 70 20 6d 6f 6e 74 61 [aktive op monta
0530: 67 65 20 7a 2d 72 65 70 20 24 66 69 72 73 74 20 ge z-rep $first
0540: 62 79 20 24 75 70 5d 0a 09 09 6c 61 70 70 65 6e by $up]...lappen
0550: 64 20 62 61 6e 64 73 20 5b 61 6b 74 69 76 65 20 d bands [aktive
0560: 6f 70 20 73 61 6d 70 6c 65 20 72 65 70 6c 69 63 op sample replic
0570: 61 74 65 20 7a 20 24 66 69 72 73 74 20 62 79 20 ate z $first by
0580: 24 75 70 5d 0a 09 20 20 20 20 7d 0a 09 20 20 20 $up].. }..
0590: 20 6c 61 70 70 65 6e 64 20 62 61 6e 64 73 20 24 lappend bands $
05a0: 73 72 63 0a 09 20 20 20 20 69 66 20 7b 24 64 6f src.. if {$do
05b0: 77 6e 20 3e 20 30 7d 20 7b 0a 09 09 69 6e 63 72 wn > 0} {...incr
05c0: 20 64 20 2d 31 0a 09 09 73 65 74 20 6c 61 73 74 d -1...set last
05d0: 20 5b 61 6b 74 69 76 65 20 6f 70 20 73 65 6c 65 [aktive op sele
05e0: 63 74 20 7a 20 24 73 72 63 20 66 72 6f 6d 20 24 ct z $src from $
05f0: 64 5d 0a 09 09 23 6c 61 70 70 65 6e 64 20 62 61 d]...#lappend ba
0600: 6e 64 73 20 5b 61 6b 74 69 76 65 20 6f 70 20 6d nds [aktive op m
0610: 6f 6e 74 61 67 65 20 7a 2d 72 65 70 20 24 6c 61 ontage z-rep $la
0620: 73 74 20 62 79 20 24 64 6f 77 6e 5d 0a 09 09 6c st by $down]...l
0630: 61 70 70 65 6e 64 20 62 61 6e 64 73 20 5b 61 6b append bands [ak
0640: 74 69 76 65 20 6f 70 20 73 61 6d 70 6c 65 20 72 tive op sample r
0650: 65 70 6c 69 63 61 74 65 20 7a 20 24 6c 61 73 74 eplicate z $last
0660: 20 62 79 20 24 64 6f 77 6e 5d 0a 09 20 20 20 20 by $down]..
0670: 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 20 5b 61 }..}...return [a
0680: 6b 74 69 76 65 20 6f 70 20 6d 6f 6e 74 61 67 65 ktive op montage
0690: 20 7a 20 7b 2a 7d 24 62 61 6e 64 73 5d 0a 20 20 z {*}$bands].
06a0: 20 20 7d 0a 7d 0a 0a 23 23 0a 23 20 23 20 23 23 }.}..##.# # ##
06b0: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 ### ##### #####
06c0: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 ### ############
06d0: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 # ##############
06e0: 23 23 23 23 23 23 23 0a 3a 3a 72 65 74 75 72 6e #######.::return
06f0: 0a .