I was wondering about that. In Photoshop, the select, expand and feather are all nearly instantaneous on the same 68 Mpix file which takes 112 seconds in IM.
It turns out, however, that the time is almost exactly proportional to the Radius with a slope of 1.026. How is this possible? Radius should be squared. These numbers don't lie!
The Euclid-4 gives such smoothness, I don't mind waiting a bit longer for that quality. The chess, taxi, knights, etc are too angular.
I noticed that the process was taking over a gig of memory. For 68 million pixels and 6 bytes/pix -> 408 MB. I have 32gb.
The CPU was maxed at 13% so it's only running on 1 core. This operation could easily be spread over 7 to leave me 1. That should quadruple the speed. Photoshop can run some operations on a GPU. I have 1024 screaming processors just waiting for something like this to devour. How hard could it be?
Sample feather command:
convert mask_lvl_3.tif -threshold 50% -morphology Distance "Euclidean:6,10!" feather.euc.6.10.mask_lvl_3.tif
Resultant mask files. The movie version makes me think of Bacteria growing in a Petri dish.
https://picasaweb.google.com/1059471996 ... directlink
Performance Numbers:
Victim file suffering nasty, 12th degree burns from Sophomoric Software
P:\br2\tl-2014.0416\p1\c8>identify 215799.pclear.q16.tif
215799.pclear.q16.tif TIFF 2100x1300 2100x1300+5400+2900 16-bit sRGB 16.43MB 0.000u 0:00.000
Kernel Rad 4 -> 2.05 seconds ave
Kernel Rad 5 -> 2.82 seconds ave
Kernel Rad 6 -> 3.78 seconds ave
Kernel Rad 7 -> 4.78 seconds ave
Kernel Rad 8 -> 6.18 seconds ave
Kernel Time = 1.026 * Rad + -2.202 Seconds
#####################################################################
Elapsed time=2.0758 Seconds => 7.068% for event "Feather_Kern_Euclidean:4,7!"
Elapsed time=2.0632 Seconds => 7.025% for event "Feather_Kern_Euclidean:4,11!"
Elapsed time=2.0612 Seconds => 7.018% for event "Feather_Kern_Euclidean:4,15!"
Elapsed time=2.0612 Seconds => 7.018% for event "Feather_Kern_Euclidean:4,13!"
Elapsed time=2.0592 Seconds => 7.011% for event "Feather_Kern_Euclidean:4,14!"
Elapsed time=2.0592 Seconds => 7.011% for event "Feather_Kern_Euclidean:4,12!"
Elapsed time=2.0470 Seconds => 6.970% for event "Feather_Kern_Euclidean:4,9!"
Elapsed time=2.0436 Seconds => 6.958% for event "Feather_Kern_Euclidean:4,8!"
Elapsed time=2.0436 Seconds => 6.958% for event "Feather_Kern_Euclidean:4,5!"
Elapsed time=2.0346 Seconds => 6.928% for event "Feather_Kern_Euclidean:4,3!"
Elapsed time=2.0320 Seconds => 6.919% for event "Feather_Kern_Euclidean:4,10!"
Elapsed time=2.0280 Seconds => 6.905% for event "Feather_Kern_Euclidean:4,4!"
Elapsed time=1.9978 Seconds => 6.802% for event "Feather_Kern_Euclidean:4,6!"
Elapsed time=1.0078 Seconds => 3.432% for event "Quantize"
Elapsed time=0.6577 Seconds => 2.239% for event "Compost"
-----------------------
Elapsed time=2.8512 Seconds => 7.007% for event "Feather_Kern_Euclidean:5,8!"
Elapsed time=2.8412 Seconds => 6.983% for event "Feather_Kern_Euclidean:5,13!"
Elapsed time=2.8402 Seconds => 6.980% for event "Feather_Kern_Euclidean:5,15!"
Elapsed time=2.8392 Seconds => 6.978% for event "Feather_Kern_Euclidean:5,14!"
Elapsed time=2.8276 Seconds => 6.949% for event "Feather_Kern_Euclidean:5,9!"
Elapsed time=2.8236 Seconds => 6.939% for event "Feather_Kern_Euclidean:5,11!"
Elapsed time=2.8236 Seconds => 6.939% for event "Feather_Kern_Euclidean:5,10!"
Elapsed time=2.8140 Seconds => 6.916% for event "Feather_Kern_Euclidean:5,6!"
Elapsed time=2.8113 Seconds => 6.909% for event "Feather_Kern_Euclidean:5,3!"
Elapsed time=2.8080 Seconds => 6.901% for event "Feather_Kern_Euclidean:5,5!"
Elapsed time=2.8080 Seconds => 6.901% for event "Feather_Kern_Euclidean:5,12!"
Elapsed time=2.7974 Seconds => 6.875% for event "Feather_Kern_Euclidean:5,7!"
Elapsed time=2.7908 Seconds => 6.859% for event "Feather_Kern_Euclidean:5,4!"
Elapsed time=1.0989 Seconds => 2.701% for event "Compost"
Elapsed time=1.0648 Seconds => 2.617% for event "Quantize"
Elapsed time=0.0842 Seconds => 0.207% for event "Threshold"
-----------------------
Elapsed time=4.0882 Seconds => 7.413% for event "Feather_Kern_Euclidean:6,11!"
Elapsed time=3.8260 Seconds => 6.937% for event "Feather_Kern_Euclidean:6,15!"
Elapsed time=3.8220 Seconds => 6.930% for event "Feather_Kern_Euclidean:6,14!"
Elapsed time=3.7812 Seconds => 6.856% for event "Feather_Kern_Euclidean:6,10!"
Elapsed time=3.7762 Seconds => 6.847% for event "Feather_Kern_Euclidean:6,13!"
Elapsed time=3.7596 Seconds => 6.817% for event "Feather_Kern_Euclidean:6,12!"
Elapsed time=3.7550 Seconds => 6.808% for event "Feather_Kern_Euclidean:6,9!"
Elapsed time=3.7440 Seconds => 6.788% for event "Feather_Kern_Euclidean:6,5!"
Elapsed time=3.7294 Seconds => 6.762% for event "Feather_Kern_Euclidean:6,6!"
Elapsed time=3.7284 Seconds => 6.760% for event "Feather_Kern_Euclidean:6,7!"
Elapsed time=3.7208 Seconds => 6.746% for event "Feather_Kern_Euclidean:6,8!"
Elapsed time=3.7093 Seconds => 6.726% for event "Feather_Kern_Euclidean:6,3!"
Elapsed time=3.6972 Seconds => 6.704% for event "Feather_Kern_Euclidean:6,4!"
Elapsed time=2.1500 Seconds => 3.898% for event "Compost"
Elapsed time=1.0250 Seconds => 1.858% for event "Quantize"
Elapsed time=0.0513 Seconds => 0.093% for event "Threshold"
----------------------------------
Elapsed time=0.0804 Minutes => 7.017% for event "Feather_Kern_Euclidean:7,15!" << 4.824 Seconds
Elapsed time=0.0800 Minutes => 6.986% for event "Feather_Kern_Euclidean:7,11!"
Elapsed time=0.0800 Minutes => 6.982% for event "Feather_Kern_Euclidean:7,13!"
Elapsed time=0.0799 Minutes => 6.978% for event "Feather_Kern_Euclidean:7,9!"
Elapsed time=0.0797 Minutes => 6.961% for event "Feather_Kern_Euclidean:7,12!"
Elapsed time=0.0797 Minutes => 6.955% for event "Feather_Kern_Euclidean:7,8!"
Elapsed time=0.0796 Minutes => 6.950% for event "Feather_Kern_Euclidean:7,7!"
Elapsed time=0.0796 Minutes => 6.949% for event "Feather_Kern_Euclidean:7,14!"
Elapsed time=0.0796 Minutes => 6.946% for event "Feather_Kern_Euclidean:7,10!"
Elapsed time=0.0793 Minutes => 6.923% for event "Feather_Kern_Euclidean:7,5!"
Elapsed time=0.0792 Minutes => 6.918% for event "Feather_Kern_Euclidean:7,3!"
Elapsed time=0.0791 Minutes => 6.904% for event "Feather_Kern_Euclidean:7,4!"
Elapsed time=0.0790 Minutes => 6.901% for event "Feather_Kern_Euclidean:7,6!"
Elapsed time=0.0361 Minutes => 3.148% for event "Compost"
Elapsed time=0.0171 Minutes => 1.489% for event "Quantize"
Elapsed time=0.0008 Minutes => 0.074% for event "Threshold"
-----------------------------
Elapsed time=0.1086 Minutes => 7.288% for event "Feather_Kern_Euclidean:8,13!" << 6.516 seconds
Elapsed time=0.1045 Minutes => 7.011% for event "Feather_Kern_Euclidean:8,14!"
Elapsed time=0.1043 Minutes => 6.997% for event "Feather_Kern_Euclidean:8,12!"
Elapsed time=0.1031 Minutes => 6.915% for event "Feather_Kern_Euclidean:8,15!"
Elapsed time=0.1025 Minutes => 6.875% for event "Feather_Kern_Euclidean:8,9!"
Elapsed time=0.1024 Minutes => 6.870% for event "Feather_Kern_Euclidean:8,8!"
Elapsed time=0.1023 Minutes => 6.861% for event "Feather_Kern_Euclidean:8,11!"
Elapsed time=0.1022 Minutes => 6.856% for event "Feather_Kern_Euclidean:8,7!"
Elapsed time=0.1021 Minutes => 6.849% for event "Feather_Kern_Euclidean:8,3!"
Elapsed time=0.1020 Minutes => 6.845% for event "Feather_Kern_Euclidean:8,6!"
Elapsed time=0.1020 Minutes => 6.841% for event "Feather_Kern_Euclidean:8,10!"
Elapsed time=0.1019 Minutes => 6.838% for event "Feather_Kern_Euclidean:8,4!"
Elapsed time=0.1017 Minutes => 6.824% for event "Feather_Kern_Euclidean:8,5!"
Elapsed time=0.0580 Minutes => 3.889% for event "Compost"
Elapsed time=0.0174 Minutes => 1.165% for event "Quantize"
Elapsed time=0.0010 Minutes => 0.067% for event "Threshold"
=================================
Kernel Feather_Kern_Euclidean:4,03! -> 2.0346 seconds
Kernel Feather_Kern_Euclidean:4,04! -> 2.0280 seconds
Kernel Feather_Kern_Euclidean:4,05! -> 2.0436 seconds
Kernel Feather_Kern_Euclidean:4,06! -> 1.9978 seconds
Kernel Feather_Kern_Euclidean:4,07! -> 2.0758 seconds
Kernel Feather_Kern_Euclidean:4,08! -> 2.0436 seconds
Kernel Feather_Kern_Euclidean:4,09! -> 2.0470 seconds
Kernel Feather_Kern_Euclidean:4,10! -> 2.0320 seconds
Kernel Feather_Kern_Euclidean:4,11! -> 2.0632 seconds
Kernel Feather_Kern_Euclidean:4,12! -> 2.0592 seconds
Kernel Feather_Kern_Euclidean:4,13! -> 2.0612 seconds
Kernel Feather_Kern_Euclidean:4,14! -> 2.0592 seconds
Kernel Feather_Kern_Euclidean:4,15! -> 2.0612 seconds
Kernel Feather_Kern_Euclidean:5,03! -> 2.8113 seconds
Kernel Feather_Kern_Euclidean:5,04! -> 2.7908 seconds
Kernel Feather_Kern_Euclidean:5,05! -> 2.8080 seconds
Kernel Feather_Kern_Euclidean:5,06! -> 2.8140 seconds
Kernel Feather_Kern_Euclidean:5,07! -> 2.7974 seconds
Kernel Feather_Kern_Euclidean:5,08! -> 2.8512 seconds
Kernel Feather_Kern_Euclidean:5,09! -> 2.8276 seconds
Kernel Feather_Kern_Euclidean:5,10! -> 2.8236 seconds
Kernel Feather_Kern_Euclidean:5,11! -> 2.8236 seconds
Kernel Feather_Kern_Euclidean:5,12! -> 2.8080 seconds
Kernel Feather_Kern_Euclidean:5,13! -> 2.8412 seconds
Kernel Feather_Kern_Euclidean:5,14! -> 2.8392 seconds
Kernel Feather_Kern_Euclidean:5,15! -> 2.8402 seconds
Kernel Feather_Kern_Euclidean:6,03! -> 3.7093 seconds
Kernel Feather_Kern_Euclidean:6,04! -> 3.6972 seconds
Kernel Feather_Kern_Euclidean:6,05! -> 3.7440 seconds
Kernel Feather_Kern_Euclidean:6,06! -> 3.7294 seconds
Kernel Feather_Kern_Euclidean:6,07! -> 3.7284 seconds
Kernel Feather_Kern_Euclidean:6,08! -> 3.7208 seconds
Kernel Feather_Kern_Euclidean:6,09! -> 3.7550 seconds
Kernel Feather_Kern_Euclidean:6,10! -> 3.7812 seconds
Kernel Feather_Kern_Euclidean:6,11! -> 4.0882 seconds
Kernel Feather_Kern_Euclidean:6,12! -> 3.7596 seconds
Kernel Feather_Kern_Euclidean:6,13! -> 3.7762 seconds
Kernel Feather_Kern_Euclidean:6,14! -> 3.8220 seconds
Kernel Feather_Kern_Euclidean:6,15! -> 3.8260 seconds
Kernel Feather_Kern_Euclidean:7,03! -> 4.752 seconds
Kernel Feather_Kern_Euclidean:7,04! -> 4.746 seconds
Kernel Feather_Kern_Euclidean:7,05! -> 4.758 seconds
Kernel Feather_Kern_Euclidean:7,06! -> 4.74 seconds
Kernel Feather_Kern_Euclidean:7,07! -> 4.776 seconds
Kernel Feather_Kern_Euclidean:7,08! -> 4.782 seconds
Kernel Feather_Kern_Euclidean:7,09! -> 4.794 seconds
Kernel Feather_Kern_Euclidean:7,10! -> 4.776 seconds
Kernel Feather_Kern_Euclidean:7,11! -> 4.8 seconds
Kernel Feather_Kern_Euclidean:7,12! -> 4.782 seconds
Kernel Feather_Kern_Euclidean:7,13! -> 4.8 seconds
Kernel Feather_Kern_Euclidean:7,14! -> 4.776 seconds
Kernel Feather_Kern_Euclidean:7,15! -> 4.824 seconds
Kernel Feather_Kern_Euclidean:8,03! -> 6.126 seconds
Kernel Feather_Kern_Euclidean:8,04! -> 6.114 seconds
Kernel Feather_Kern_Euclidean:8,05! -> 6.102 seconds
Kernel Feather_Kern_Euclidean:8,06! -> 6.12 seconds
Kernel Feather_Kern_Euclidean:8,07! -> 6.132 seconds
Kernel Feather_Kern_Euclidean:8,08! -> 6.144 seconds
Kernel Feather_Kern_Euclidean:8,09! -> 6.15 seconds
Kernel Feather_Kern_Euclidean:8,10! -> 6.12 seconds
Kernel Feather_Kern_Euclidean:8,11! -> 6.138 seconds
Kernel Feather_Kern_Euclidean:8,12! -> 6.258 seconds
Kernel Feather_Kern_Euclidean:8,13! -> 6.516 seconds
Kernel Feather_Kern_Euclidean:8,14! -> 6.27 seconds
Kernel Feather_Kern_Euclidean:8,15! -> 6.186 seconds
Has anybody else noticed that this grinchy forum host has an annoyingly short timeout period before requiring a new login?
Worse than that, the first thing the little blighter does is to DESTROY THE TEXT BODY? Be nice if it saved it! GRRRRRRRR!!!
"I'm sorry. Were you typing something? Let me DESTROY IT FOR YOU while you freshen your login". ;(
Code: Select all
# =============================================================================
sub try_masks() {
$debug = 1;
$MAX_DARK_PERCENT = 3; # 3% of the darkest of pixels
$EUCLID_RADIUS=8;
$dir = "P:/br2/tl-2014.0416/p1/c8";
#$ofn = "$dir/tl-2014.0416-215799.p1.pristine.tif"; # Original file.
#$bfn = "$dir/tl-2014.0416-215799.p1.pc.landscape.preset.tif"; # Burnt file
$ofn = "$dir/215799.zero.crop.q16.tif"; # Original file.
$bfn = "$dir/215799.pclear.q16.tif"; # Burnt file to fix
%evt2stime = (_LAST_EVENT => 'INIT', _LAST_TIME => [gettimeofday]);
$dtime = &sum_event_time("T1", \%evt2stime, $debug=1);
($bext = $bfn) =~ s/^.*\.([a-z]{3,4})$/$1/i; # Last 3 or 4 letters are EXT.
$mfn = "mask_lvl_$MAX_DARK_PERCENT.$bext"; # Mask FileName.
$oim = new Image::Magick; # Original, pre-burnt image
$bim = new Image::Magick; # Burnt Image
$mim = new Image::Magick; # Mask of burnt areas in Burnt Image
$fim = new Image::Magick; # Fixed image
$dtime = &sum_event_time("Read New and Burnt", \%evt2stime, $debug=1);
$oim = &img_fqp_imo($ofn, $debug); # Read Img, check errs, rtn IM object
$bim = &img_fqp_imo($bfn, $debug); # Read Img, check errs, rtn IM object
$qrange = $bim->QuantumRange; # Quantum Range on burnt, 65535
$max_dark = &float_round($qrange * $MAX_DARK_PERCENT / 100.0);
print("Max_dark=$max_dark, MASK fname=$mfn\n");
# Clone the MASK object from the Burnt image. Quantize it to grayscale,
# threshold it at MAX_DARK to make all darks BLACK and the rest WHITE.
# Turn Alpha on to make GA (Gray, Alpha) channels. Write to Mask File name.
$dtime = &sum_event_time("Quantize", \%evt2stime, $debug=1);
$mim = $bim->Clone(); # Copies Burnt image
$mim->Quantize(colorspace=>'gray');
$mim->Write("burnt.to.gray.tif"); # Rough mask.
$dtime = &sum_event_time("Threshold", \%evt2stime, $debug=1);
$mim->Threshold(threshold=>$max_dark);
$mim->Set(alpha=>'ON', compression=>'None');
$mim->Write("$mfn"); # Min mask, darkest N%, no expansion or feathering.
# Feather the mask with the new secret formula!
# convert black.white.mask.tif -threshold 50% -morphology Distance \
# "Euclidean:7,12!" feathered.tif # For feathering
for($ii = 3; $ii < 16; $ii++) {
$ffn = "feather.euc.$EUCLID_RADIUS.$ii.$mfn"; # Feather Filename
$kern = "Euclidean:$EUCLID_RADIUS,$ii!";
$dtime = &sum_event_time("Feather_Kern_$kern", \%evt2stime, $debug=1);
$cmd = "convert $mfn -threshold 50% -morphology Distance \"$kern\" $ffn"; # Feathering. Perf meter shows > 1 GM of memory used!
print("Feather cmd = '$cmd' ->");
$rtn = `$cmd`;
print("$rtn");
}
$dtime = &sum_event_time("Dir_to_file", \%evt2stime, $debug=1);
@m = &dir_to_file_ara($dir, 1, 'DeBuG'); # Don't search subdir
@m = grep(/mask.*.tif$/, @m);
@m = grep(!/fix\./, @m);
printf("Found %d tif mask files in dir $dir\n", scalar @m);
$ii = -1;
foreach $mask (@m) {
$ii++;
@$mim = (); # Clear MASK array
$dtime = &sum_event_time("Read Mask $ii", \%evt2stime, $debug=1);
$mim = &img_fqp_imo($mask, $debug); # Read Img, check errs, rtn IM obj
$fim = $oim->Clone(); # Copies ORIGINAL image
$dtime = &sum_event_time("Compost", \%evt2stime, $debug=1);
$err=$fim->Composite(compose=>'Over', image=>$bim, mask=>$mim); #
warn "$err" if "$err";
($path, $base, $ext) = @{&pathbaseext($mask)};
$fn = "fix.$base.$ext"; # Fix filename.
$dtime = &sum_event_time("Write fix $fn", \%evt2stime, $debug=1);
$fim->Write("$fn"); # Expect holes in burnt img
print("$ii) Fixed file = $fn\n");
#last;
}
undef $oim; undef $bim; undef $mim; undef $fim;
$dtime = &sum_event_time("Ending", \%evt2stime, $debug=1);
&show_event_time(\%evt2stime, 1); # Show sum of time spent on each event.
}