Photo-Reactor Recipes

Upcoming mother of all image editors

Re: Photo-Reactor Recipes

Postby JEL » Tue Jun 11, 2013 8:13 am

EDIT: I recommend you use the "35mm Film-Simulator" effect I posted below this post instead of "RestoreBlownHiLites". The film-sim has an improved version of the "RestoreBlownHiLites" within it.
----------------------------------

"RestoreBlownHiLites"

This VFX is used on photos that have blown high-lights.

It will attempt to restore color as well as make the high-light roll-off look pleasing and 'film-like'.

It should work well with default-settings on most images.

by JEL 20130611
Attachments
RestoreBlownHiLites.zip
(20.5 KiB) Downloaded 658 times
Last edited by JEL on Fri Jun 14, 2013 10:15 am, edited 1 time in total.
DAP (AOPs): http://jelstudio.dk/DAP/
PhotoReactor (flows, effects and scripts): http://jelstudio.dk/PhotoReactor/
JEL
 
Posts: 294
Joined: Fri Jan 06, 2012 9:35 pm

Re: Photo-Reactor Recipes

Postby JEL » Fri Jun 14, 2013 9:47 am

JEL's 35mm Film-Simulator 2013 v1 (20130614)

This flow is only possible thanks to the wonderful Photo-Reactor :)

I couldn't even begin to do this in Gimp or Photoshop (I've tried, never got anything I was satisfied with)

It is a photo-effect, not an art-effect.

It is used to enhance photos taken with digital cameras. In my own opinion it does an absolutely amazing job at it :)

You can throw almost any image at it and it will come out with something that looks good. It's especially good for portraits, but don't hold back on it with other types of photos (even extremely under-exposed photos can sometimes be saved by it, as well as moderately over-exposed). This also means it's good for batch-operations (unless your taste in looks is completely different from mine, then it's likely that more than 9 out of 10 will be keepers)

It isn't suitable as video-effect, since it changes the light based on the content of the image (so a video-sequence, unless very static, would likely flicker badly)

I hope you'll find it as useful as I do myself :)
JEL
Attachments
JEL'sFilmSim2013v1(20130614).zip
(30.04 KiB) Downloaded 675 times
DAP (AOPs): http://jelstudio.dk/DAP/
PhotoReactor (flows, effects and scripts): http://jelstudio.dk/PhotoReactor/
JEL
 
Posts: 294
Joined: Fri Jan 06, 2012 9:35 pm

Re: Photo-Reactor Recipes

Postby Rachel » Mon Jun 17, 2013 9:33 pm

I tried it, very moody. I am looking forward to all the photo-effects that will come out of photo reactor. I love the arty potential but sometimes you need image editing!
Attachments
PICT0196a_Finalweb.jpg
PICT0196a_Finalweb.jpg (137.05 KiB) Viewed 12070 times
Rachel
 
Posts: 1920
Joined: Fri Nov 19, 2010 3:56 pm
Location: Oak Ridge, North Carolina

Re: Photo-Reactor Recipes

Postby JEL » Wed Jun 19, 2013 5:35 pm

Rachel wrote:I tried it, very moody.


I hope that's a good thing ;)
DAP (AOPs): http://jelstudio.dk/DAP/
PhotoReactor (flows, effects and scripts): http://jelstudio.dk/PhotoReactor/
JEL
 
Posts: 294
Joined: Fri Jan 06, 2012 9:35 pm

Re: Photo-Reactor Recipes

Postby JEL » Tue Jun 25, 2013 12:21 am

3 scripts ready for use in the Reactor-Script block:

The first sample the 3 primary colors and their value.

The second sample the 3 primary colors but not their value (this script is limited to 8bit, which is only relevant to know if/when PR goes 16bit)

The third sample the 3 primary colors AND their 3 complementary colors (giving max weight to the 3 primaries) and their value.

Code: Select all
//Sample the primary colors
//JEL2013


void primaries(image &img)
{
     int width = img.width;
   int height = img.height;
   
   for (int y=0; y<height; y++)
   {
      for (int x=0; x<width; x++)
      {
   
         // one way to get color from pixel
         pixel color = img.Pixel(x,y);
         
         if(color.r > color.g && color.r > color.b)
         {
            color.r = color.r;
            color.g = 0;
            color.b = 0;
         }

         if(color.g > color.r && color.g > color.b)
         {
            color.r = 0;
            color.g = color.g;
            color.b = 0;
         }

         if(color.b > color.r && color.b > color.g)
         {
            color.r = 0;
            color.g = 0;
            color.b = color.b;
         }

         // average the colors
         // int intensity = (color.r+color.g+color.b)/3;
         // int intensity = color.r;
         
   
         // safest and fastest way to set color to pixels (clamps the value to 0..255)
         img.SetRGB(x, y, color.r, color.g, color.b);
         
         
      }
   
   }

}



void main()
{
   // get the image from input socket
   image img(INPUT);
   
   
   // sample function call
   primaries(img);
   
   
   // send the image to output
   img.SetOutput();
   
}


Code: Select all
//Sample the primary colors
//JEL2013


void primaries(image &img)
{
     int width = img.width;
   int height = img.height;
   
   for (int y=0; y<height; y++)
   {
      for (int x=0; x<width; x++)
      {
   
         // one way to get color from pixel
         pixel color = img.Pixel(x,y);
         
         if(color.r > color.g && color.r > color.b)
         {
            color.r = 255;
            color.g = 0;
            color.b = 0;
         }

         if(color.g > color.r && color.g > color.b)
         {
            color.r = 0;
            color.g = 255;
            color.b = 0;
         }

         if(color.b > color.r && color.b > color.g)
         {
            color.r = 0;
            color.g = 0;
            color.b = 255;
         }

         // average the colors
         // int intensity = (color.r+color.g+color.b)/3;
         // int intensity = color.r;
         
   
         // safest and fastest way to set color to pixels (clamps the value to 0..255)
         img.SetRGB(x, y, color.r, color.g, color.b);
         
         
      }
   
   }

}



void main()
{
   // get the image from input socket
   image img(INPUT);
   
   
   // sample function call
   primaries(img);
   
   
   // send the image to output
   img.SetOutput();
   
}


Code: Select all
//Sample the primary and complementary colors
//JEL2013


void desaturate(image &img)
{
     int width = img.width;
   int height = img.height;
   
   for (int y=0; y<height; y++)
   {
      for (int x=0; x<width; x++)
      {
   
         // one way to get color from pixel
         pixel color = img.Pixel(x,y);
         
         if(color.r > color.g && color.r > color.b)
         {
            if(color.g > (color.r / 2) || color.b > (color.r / 2))
            {
               if(color.g > (color.r / 2) && color.b < (color.r / 2))
               {
                  color.r = color.r;
                  color.g = color.g;
                  color.b = 0;
               }
               if(color.b > (color.r / 2) && color.g < (color.r / 2))
               {
                  color.r = color.r;
                  color.g = 0;
                  color.b = color.b;
               }
               if(color.g > (color.r / 2) && color.b > (color.r / 2))
               {
                  color.r = color.r;
                  color.g = 0;
                  color.b = 0;
               }
            }
            else
            {
               color.r = color.r;
               color.g = 0;
               color.b = 0;
            }
         }

         if(color.g > color.r && color.g > color.b)
         {
            if(color.r > (color.g / 2) || color.b > (color.g / 2))
            {
               if(color.r > (color.g / 2) && color.b < (color.g / 2))
               {
                  color.r = color.r;
                  color.g = color.g;
                  color.b = 0;
               }
               if(color.b > (color.g / 2) && color.r < (color.g / 2))
               {
                  color.r = 0;
                  color.g = color.g;
                  color.b = color.b;
               }
               if(color.r > (color.g / 2) && color.b > (color.g / 2))
               {
                  color.r = 0;
                  color.g = color.g;
                  color.b = 0;
               }
            }
            else
            {
               color.r = 0;
               color.g = color.g;
               color.b = 0;
            }
         }

         if(color.b > color.r && color.b > color.g)
         {
            if(color.r > (color.b / 2) || color.g > (color.b / 2))
            {
               if(color.r > (color.b / 2) && color.g < (color.b / 2))
               {
                  color.r = color.r;
                  color.g = 0;
                  color.b = color.b;
               }
               if(color.g > (color.b / 2) && color.r < (color.b / 2))
               {
                  color.r = 0;
                  color.g = color.g;
                  color.b = color.b;
               }
               if(color.r > (color.b / 2) && color.g > (color.b / 2))
               {
                  color.r = 0;
                  color.g = 0;
                  color.b = color.b;
               }
            }
            else
            {
               color.r = 0;
               color.g = 0;
               color.b = color.b;
            }
         }

         // average the colors
         // int intensity = (color.r+color.g+color.b)/3;
         // int intensity = color.r;
         
   
         // safest and fastest way to set color to pixels (clamps the value to 0..255)
         img.SetRGB(x, y, color.r, color.g, color.b);
         
         
      }
   
   }

}



void main()
{
   // get the image from input socket
   image img(INPUT);
   
   
   // sample function call
   desaturate(img);
   
   
   // send the image to output
   img.SetOutput();
   
}
DAP (AOPs): http://jelstudio.dk/DAP/
PhotoReactor (flows, effects and scripts): http://jelstudio.dk/PhotoReactor/
JEL
 
Posts: 294
Joined: Fri Jan 06, 2012 9:35 pm

Re: Photo-Reactor Recipes

Postby JEL » Wed Jun 26, 2013 2:48 am

1 extra primary-color sampler script (ready for use in the Reactor-Script block)

It samples the 3 primary colors, and their value, and then purifies them.

In photos and video this script is probably more useful than the 3 previous (you can achieve some very good color-grading with this one in your flow :) )
This 'flow' will also work on video.

EDIT:
The color-noise that was present in the previous version of this script (in this post) has been cleaned up :)
Now it is completely noise-free.

Code: Select all
//Sample the primary colors
//JEL2013

//c = (a>b) ? a : b; //returns whichever is greater, a or b.

void primaries(image &img)
{
     int width = img.width;
   int height = img.height;
   
   for (int y=0; y<height; y++)
   {
      for (int x=0; x<width; x++)
      {
   
         // one way to get color from pixel
         pixel color = img.Pixel(x,y);
         int intensityR = 0;
         int intensityG = 0;
         int intensityB = 0;

         if(color.r > color.g && color.r > color.b)
         {
            intensityR = color.r - ((color.b > color.g) ? color.b : color.g);
         }
         else
         {
            intensityR = 0;
         }

         if(color.g > color.r && color.g > color.b)
         {
            //color.r = color.r - (color.g * 0.5) - (color.b * 0.5);
            intensityG = color.g - ((color.r > color.b) ? color.r : color.b);
            //color.g = 0; //(color.g == color.r) ? color.r : 0;
            //color.b = 0; //(color.b == color.r) ? color.r : 0;
            //color.g = (color.b < color.g) ? color.b : color.g;
            //color.b = (color.g < color.b) ? color.g : color.b;
         }
         else
         {
            intensityG = 0;
         }

         if(color.b > color.g && color.b > color.r)
         {
            intensityB = color.b - ((color.r > color.g) ? color.r : color.g);
         }
         else
         {
            intensityB = 0;
         }

         if(color.g > color.r && color.g > color.b)
         {
            //color.g = color.g - ((color.b > color.r) ? color.b : color.r);
            //color.r = (color.r == color.g) ? color.g : 0;
            //color.b = (color.b == color.g) ? color.g : 0;
            //color.r = (color.b < color.r) ? color.b : color.r;
            //color.b = (color.r < color.b) ? color.r : color.b;
         }

         if(color.b > color.r && color.b > color.g)
         {
            //color.b = color.b - (color.r * 0.5) - (color.g * 0.5);
            //color.b = color.b - ((color.r > color.g) ? color.r : color.g);
            //color.r = (color.r == color.b) ? color.b : 0;
            //color.g = (color.g == color.b) ? color.b : 0;
            //color.r = (color.g < color.r) ? color.g : color.r;
            //color.g = (color.r < color.g) ? color.r : color.g;
         }

         // average the colors
         // int intensity = (color.r+color.g+color.b)/3;
         // int intensity = color.r;
         
   
         // safest and fastest way to set color to pixels (clamps the value to 0..255)
         img.SetRGB(x, y, intensityR, intensityG, intensityB);
         
         
      }
   
   }

}



void main()
{
   // get the image from input socket
   image img(INPUT);
   
   
   // sample function call
   primaries(img);
   
   
   // send the image to output
   img.SetOutput();
   
}
DAP (AOPs): http://jelstudio.dk/DAP/
PhotoReactor (flows, effects and scripts): http://jelstudio.dk/PhotoReactor/
JEL
 
Posts: 294
Joined: Fri Jan 06, 2012 9:35 pm

Re: Photo-Reactor Recipes

Postby JEL » Sat Jun 29, 2013 6:11 am

JEL's 120mm Film-Simulator 2013 v1 (20130629)

It is a photo-effect, not an art-effect.

It is used to enhance photos taken with digital cameras.

In my own opinion this version is superior to the 35mm version I did, but I didn't want to call it version2 since it does things a bit differently from the 35mm version.
it doesn't quite replace the 35mm version, since each give a slightly different feel to the output-image. So I guess you should just choose whichever you think looks better with your photos :)
The 120mm version is slightly less neutral than the 35mm version. It modifies your image a bit more than the 35mm version does. However, in my own opinion the results are in almost all cases more pleasing (but that's obviously a matter of personal taste :) ) with only a few cases where the 35mm version gave the better image.

Be aware that the effect updates the look based on what you can see in the preview-screen, so if you zoom in (by using 1:1 for example) the look may change quite a lot. Zoom out fully to check the colors and tone, and only zoom in to 1:1 when checking how grainy the image will become.

It isn't suitable as video-effect, since it changes the light based on the content of the image (so a video-sequence, unless very static, would likely flicker badly)

i hope you'll find this version an improvement :)
JEL
Attachments
JEL'sFilmSim120mm(20130629v1).zip
(17.55 KiB) Downloaded 555 times
DAP (AOPs): http://jelstudio.dk/DAP/
PhotoReactor (flows, effects and scripts): http://jelstudio.dk/PhotoReactor/
JEL
 
Posts: 294
Joined: Fri Jan 06, 2012 9:35 pm

Re: Photo-Reactor Recipes

Postby Rachel » Sat Jun 29, 2013 8:12 am

Jel, thanks for your work on this. I tried it and liked how it improved my image. I am not sure how to work the controls though. It looks like one can turn off and on different effects. I like the simplicity but I wanted to make sure I am not missing anything!
Attachments
P1100619a_jel-pipweb.jpg
P1100619a_jel-pipweb.jpg (92.12 KiB) Viewed 11404 times
Rachel
 
Posts: 1920
Joined: Fri Nov 19, 2010 3:56 pm
Location: Oak Ridge, North Carolina

Re: Photo-Reactor Recipes

Postby JEL » Sun Jun 30, 2013 6:39 am

Hi Rachel :) Thanks :)

Yes, you're right, they are on/off switches to give the effect a bit of flexibility :)
DAP (AOPs): http://jelstudio.dk/DAP/
PhotoReactor (flows, effects and scripts): http://jelstudio.dk/PhotoReactor/
JEL
 
Posts: 294
Joined: Fri Jan 06, 2012 9:35 pm

Re: Photo-Reactor Recipes

Postby JEL » Sat Jul 06, 2013 5:00 pm

JEL's Medal Maker 2013
(20130706)

This is a virtual effect for Photo-Reactor ( http://mediachance.com/reactor/index.html )
--------------------------------------------


Create a medal with a picture on it.
(medal included in virtual box)



STEP#1:
Make sure to set main-image to empty-image with a width of 300 and a height of 500.

If you have already loaded an image, then uncheck and then recheck the 'Create empty image' check-box (in the menu to the right when you have selected the box 'main image')


STEP#2:
Load your portrait (or your pet, or something else) and select between gold, silver or bronze.
(This is all done in the menu to the right, when you have selected the Winner's Medal' box. Alternatively you can unwrap the virtual effect box and work in the flow-window)



JEL
20130706
Attachments
GoldMedal20130706.zip
This is the effect box
(107.67 KiB) Downloaded 461 times
GoldMedal.jpg
This is what the effect looks like (This medal features Arkie)
GoldMedal.jpg (50.32 KiB) Viewed 11164 times
DAP (AOPs): http://jelstudio.dk/DAP/
PhotoReactor (flows, effects and scripts): http://jelstudio.dk/PhotoReactor/
JEL
 
Posts: 294
Joined: Fri Jan 06, 2012 9:35 pm

PreviousNext

Return to Photo Reactor

Who is online

Users browsing this forum: No registered users and 2 guests

cron