Anyone can read 1977 codes here?

as @garagecoder suggests, computin the histogram is probably the key here.
But what do you want to do with the values below or above a certain occurence threshold. What value should be used to replace the old one ?

These become the values used for cut(). A partial work on this:

> gmic sp cat to_gray +pixelsort +,yx +area. 0,0 +label.. a[-3--1] c colormap. 0 sh. 2 pixelsort.. +,x,. rm.

The first channel is the value of image, the second channel is the occurence, and the third channel is the label value of the image. If the occurence is greater or equal to 5% starting from the left, then corresponding image pixel value becomes the cut value 1. If the occurence is greater or equal to 5% starting from the right, then the corresponding image pixel value becomes the cut value 2. So, with those found value, it is the cut values.

I have done something similar for tone re-mapping (the ranking and smoothing). The challenge is making it fast. E.g., colormap on large colourful images takes a while to process.

The speed issue is why I brought it up. I also think something like this could also apply to the math parser on a vector as well.

Beautiful name! If you replace ā€œmā€ with ā€œoā€ then you get my first name :slight_smile:

Iā€™m interested. Could you tell us a bit more about it? Design and goals ?

It has similarities with IM syntaxā€¦ Is it its own thing or using IM?

I guess that maybe, it is intended to be an extension to the IM syntax, that will be available for future versions of IM. That is really interesting.

1 Like

To avoid massive off-topicing, I have replied in a new thread, Alfim: Augmented Language For ImageMagick

1 Like

@afre I think this is the fastest I could make occurrence-based cutting.

Code to Try
rep_percentile_gray_cut:
m "generate_array_of_pixel_value_and_occurance: 
 unroll x
 sort

 1,1,1,2

 start_point:=im#-2-1

 eval.. \">begin(v=$start_point;p=-1;o=1;);
  if(i!=v,
   v=i;
   o=1;
   p++;
   da_push(#-1,[v,o]);
  ,
   o++;
   I[#-1,p]=[v,o];
   0;
  );
  end(
   resize(#-1,1,da_size(#-1)-1,1,2);
  );\"
  rm..
 "

init_lowval_freq_thres,init_highval_freq_thres={$1},{$2}

repeat $! l[$>]
 if s>1 +to_gray fi
 generate_array_of_pixel_value_and_occurance.

 sh. 1
 lowval_freq_thres:=$init_lowval_freq_thres*iM#-1
 highval_freq_thres:=$init_highval_freq_thres*iM#-1

 rm.

 eval "
  begin(
   const my=h#-1-1;
   const lv=$lowval_freq_thres;
   const hv=$highval_freq_thres;
   search_lv=search_hv=1;
   out_a=out_b=0;
   p=0;
  );
  
  repeat(h#-1,
  
   if(search_lv,
    if(i(#-1,0,p,0,1)>=lv,
     out_a=i(#-1,0,p,0,0);
     search_lv=0;
    );
   );
   
   if(search_hv,
    inv_p=my-p;
    if(i(#-1,0,inv_p,0,1)>=lv,
     out_b=i(#-1,0,inv_p,0,0);
     search_hv=0;
    );    
   );
   
   if(!search_lv&&!search_hv,break(););
   
   p++;
   
  );

  [out_a,out_b];"

  cut.. ${}
  rm.
endl done

Could you give me a sample command? All I am getting is a zero image.

$ sp +rep_percentile_gray_cut 5%,6%

The percentage is used to define threshold.

I neglected to add the % sign. This command may be confusing to users; e.g.,

gmic sp tiger rep_percentile_gray_cut 5%,6%
gmic sp tiger rep_percentile_gray_cut 5%,95%

yield the same result.

I finally got around to adding the Serendiptous Circle to Gā€™MIC. Doesnā€™t work too well with large images from the GUI side of thing, but Iā€™ll have to say oh well to that since thereā€™s no full-size preview or a way to access the original image size.

Itā€™s a little tricky to work with, but the main gist is that once you understand the common expression, you can make anything on the Serendiptous Circle article.

1 Like