Готовый плагин не так интересен, как его внутренняя реализация. Впрочем, Вы бы могли представить результат его работы на примере изображения из рабочего задания: картинка до, картинка после.
Я предложил готовый плагин лишь потому, что в теме участвовали люди, которые программируют на С/С++ и др. языках в полноценном смысле. одним словом-знающие.
А модуль CodeLab, собственно на чем и была реализована задача, никто даже не упомянул.
Тем не менее я готов поделиться, может кому пригодится...
// Name: Edge 4.0
// Submenu: Advanced
// Author: PapooAss
// Title: Edge 4.0
// Version: 4.0
// Desc: 
// Keywords: 
// URL: 
// Help:
#region UICode
IntSliderControl Amount1 = 0; // [-100,100] Голубой-Красный
IntSliderControl Amount2 = 0; // [-100,100] Пурпурный-Зеленый
IntSliderControl Amount3 = 0; // [-100,100] Желтый-Синий
#endregion
private byte Clamp2Byte(int iValue) //процедура , которая возвращает "0" если получается отрицательное значение переменной и "255" если больше 255
{
    if (iValue<0) return 0;
    if (iValue>255) return 255;
    return (byte)iValue;
}//взята из Урока
    
    
void Render(Surface dst, Surface src, Rectangle rect)
{
    ColorBgra CurrentPixel;
    ColorBgra VerifyPixel;
    int R,G,B;
    int Rv, Gv, Bv;
    
    for (int y = rect.Top; y < rect.Bottom; y++) 
    {
        if (IsCancelRequested) return;
        for (int x = rect.Left; x < (rect.Right - 1); x++) //стандартный перебор -1 по координатам Х
        {
            CurrentPixel = src[x,y]; //присвоили переменной CurrentPixel текущий пиксель [x,y]
            VerifyPixel = src[(x+1),y]; //присвоили переменной VerifyPixel текущий пиксель [x+1,y]
           if (CurrentPixel.Bgra != VerifyPixel.Bgra) //сравниваем эти переменные. (!=)-означает НЕ равно 
           {
               // сдвиг гаммы цвета основного пикселя 
               R = (int)CurrentPixel.R;
               G = (int)CurrentPixel.G;
               B = (int)CurrentPixel.B;
               
               R = R + Amount1;
               G = G -(Amount1 / 2);
               B = B -(Amount1 / 2);
               
               G = G + Amount2;
               R = R - (Amount2 / 2);
               B = B - (Amount2 / 2);
               
               B = B + Amount3;
               R = R - (Amount3 / 2);
               G = G - (Amount3 / 2);
               
               // сдвиг гаммы цвета вспомогательного пикселя
               Rv = (int)VerifyPixel.R;
               Gv = (int)VerifyPixel.G;
               Bv = (int)VerifyPixel.B;
               
               Rv = Rv + Amount1;
               Gv = Gv -(Amount1 / 2);
               Bv = Bv -(Amount1 / 2);
               
               Gv = Gv + Amount2;
               Rv = Rv - (Amount2 / 2);
               Bv = Bv - (Amount2 / 2);
               
               Bv = Bv + Amount3;
               Rv = Rv - (Amount3 / 2);
               Gv = Gv - (Amount3 / 2);
               
               // Собираем цвет заново по каналам  R, G, and B с привлечением процедуры Clamp2Byte
                CurrentPixel = ColorBgra.FromBgra(Clamp2Byte(B),Clamp2Byte(G),Clamp2Byte(R),CurrentPixel.A);
                VerifyPixel = ColorBgra.FromBgra(Clamp2Byte(Bv),Clamp2Byte(Gv),Clamp2Byte(Rv),CurrentPixel.A);
           dst[x,y] = CurrentPixel; //Записали собранный пиксель по координатам [x,y]
           dst[(x+1),y] = VerifyPixel; //записали собранный пиксель по координатам [x+1,y]
           }
         }
    }
}
Картинка ДО
Картинка ПОСЛЕ