[AI CC-CC2022] RECOLOR ENGINE v2 by S.H.

Ну во первых задача не целочисленная и функция вполне себе равномерно непрерывная. Было бы идеально, если бы экстремум был один, но, к сожалению, скорее всего, там дофига локальных паразитных экстремумов, изза которых алгоритм может работать нестабильно, что мы, собственно и наблюдаем.
 
чо значит нецелочисленная?

с = 100,ипрочая?
м=100, ипрочая?
 
чо значит нецелочисленная?

с = 100,ипрочая?
м=100, ипрочая?
Т.е. по твоему, вариантов C98.537659546M99.2317598764 нет и не будет никогда? Или тебя смущает, что пересчет ведется по профилю, заданному таблично? Но из этого следует только то, что функция кусочно-гладкая, что совершенно не мешает алгоритмизировать.
 
от чо ты от меня хошь? повторяю. по целочисленным множествам твой пример запросто вываливается из ограничений функции.
 
Сходимость к локальному экстремуму за пределами области определения? И такое ловилось. Четвертьвека назад тоже умные люди жили, на фортране и подобных раритетах много полезных библиотек запилили
 
да я сам их пилил)))
 
Ты ж ПТУшник с незаконченным средним?
 
да!
 
Предлагаешь тупо пербирать 256*256*256? Это антинаучно
 
Мы тут, главное не взывать по пустякам.
Редизайнил скрипт для большей понятности, заодно ошибку убрал.
Код:
//  Recolor engine v2.0
//  Original idea and Scripting by Stanislav Hoffman(SPB) - S.N. - April 2017


var doc = app.activeDocument;
var mSel = doc.selection;

var  c,  m,  y; // Два набора значений CMY, первый это лучший найденный на текущий момент
var tc, tm, ty; // второй будет проверяться на лучшее приближение delta E


function convertColor(src, dest, clrArr)
{
    return app.convertSampleColor(ImageColorSpace[src], clrArr, ImageColorSpace[dest], ColorConvertPurpose.defaultpurpose);
}

function AddV(n,a){
    r=Math.round(n+a);
    if (r>100) {r=100}
    if (r<0) {r=0}
    return r;
}

function deltaE(lab,labs){
    DE76=Math.sqrt(
    Math.pow(labs[0]-lab[0],2)+
    Math.pow(labs[1]-lab[1],2)+
    Math.pow(labs[2]-lab[2],2));
    return DE76;
};

function CalcNewCMY(z){
    tc = c;
    tm = m;
    ty = y;
    if (z==0){tc=AddV(c,1)}
    if (z==1){tc=AddV(c,-1)}
    if (z==2){tm=AddV(m,1)}
    if (z==3){tm=AddV(m,-1)}
    if (z==4){ty=AddV(y,1)}
    if (z==5){ty=AddV(y,-1)}
}



for (i=0; i < mSel.length; i++)
{
    if (mSel.filled == true){
      
        var color = mSel.fillColor;

        var labs = convertColor("CMYK", "LAB", [color.cyan,color.magenta,color.yellow,color.black]);
        color.black = 0;
      
        c = color.cyan;
        m = color.magenta;
        y = color.yellow;
      
        var goo = true;
        var DD, lab;
        var maxDD = 10000000000;
      
        while (goo){
            goo = false;
            for (z=0; z<6; z++){
                CalcNewCMY(z);
                lab = convertColor("CMYK", "LAB", [tc, tm, ty, 0]);
                DD = deltaE(lab, labs);
                if (maxDD>DD){maxDD = DD; goo = true; c = tc; m = tm; y = ty}
            }
        }
        color.cyan    = c;
        color.magenta = m;
        color.yellow  = y;
    }
}
 
Последнее редактирование:
Мы тут, главное не взывать по пустякам.
Редизайнил скрипт для большей понятности, заодно ошибку убрал.
Код:
//  Recolor engine v2.0
//  Original idea and Scripting by Stanislav Hoffman(SPB) - S.N. - April 2017


var doc = app.activeDocument;
var mSel = doc.selection;

var  c,  m,  y; // Два набора значений CMY, первый это лучший найденный на текущий момент
var tc, tm, ty; // второй будет проверяться на лучшее приближение delta E


function convertColor(src, dest, clrArr)
{
    return app.convertSampleColor(ImageColorSpace[src], clrArr, ImageColorSpace[dest], ColorConvertPurpose.defaultpurpose);
}

function AddV(n,a){
    r=Math.round(n+a);
    if (r>100) {r=100}
    if (r<0) {r=0}
    return r;
}

function deltaE(lab,labs){
    DE76=Math.sqrt(
    Math.pow(labs[0]-lab[0],2)+
    Math.pow(labs[1]-lab[1],2)+
    Math.pow(labs[2]-lab[2],2));
    return DE76;
};

function CalcNewCMY(z){
    tc = c;
    tm = m;
    ty = y;
    if (z==0){tc=AddV(c,1)}
    if (z==1){tc=AddV(c,-1)}
    if (z==2){tm=AddV(m,1)}
    if (z==3){tm=AddV(m,-1)}
    if (z==4){ty=AddV(y,1)}
    if (z==5){ty=AddV(y,-1)}
}



for (i=0; i < mSel.length; i++)
{
    if (mSel.filled == true){
     
        var color = mSel.fillColor;

        var labs = convertColor("CMYK", "LAB", [color.cyan,color.magenta,color.yellow,color.black]);
        color.black = 0;
     
        c = color.cyan;
        m = color.magenta;
        y = color.yellow;
     
        var goo = true;
        var DD, lab;
        var maxDD = 10000000000;
     
        while (goo){
            goo = false;
            for (z=0; z<6; z++){
                CalcNewCMY(z);
                lab = convertColor("CMYK", "LAB", [tc, tm, ty, 0]);
                DD = deltaE(lab, labs);
                if (maxDD>DD){maxDD = DD; goo = true; c = tc; m = tm; y = ty}
            }
        }
        color.cyan    = c;
        color.magenta = m;
        color.yellow  = y;
    }
}
Спасибо за правки, в понедельник протестирую и сравню результат.
 
В обновленной версии результаты чуть стабильней.
рестайлинг.JPG
 
Мы тут, главное не взывать по пустякам.
Редизайнил скрипт для большей понятности, заодно ошибку убрал.
Код:
//  Recolor engine v2.0
//  Original idea and Scripting by Stanislav Hoffman(SPB) - S.N. - April 2017


var doc = app.activeDocument;
var mSel = doc.selection;

var  c,  m,  y; // Два набора значений CMY, первый это лучший найденный на текущий момент
var tc, tm, ty; // второй будет проверяться на лучшее приближение delta E


function convertColor(src, dest, clrArr)
{
    return app.convertSampleColor(ImageColorSpace[src], clrArr, ImageColorSpace[dest], ColorConvertPurpose.defaultpurpose);
}

function AddV(n,a){
    r=Math.round(n+a);
    if (r>100) {r=100}
    if (r<0) {r=0}
    return r;
}

function deltaE(lab,labs){
    DE76=Math.sqrt(
    Math.pow(labs[0]-lab[0],2)+
    Math.pow(labs[1]-lab[1],2)+
    Math.pow(labs[2]-lab[2],2));
    return DE76;
};

function CalcNewCMY(z){
    tc = c;
    tm = m;
    ty = y;
    if (z==0){tc=AddV(c,1)}
    if (z==1){tc=AddV(c,-1)}
    if (z==2){tm=AddV(m,1)}
    if (z==3){tm=AddV(m,-1)}
    if (z==4){ty=AddV(y,1)}
    if (z==5){ty=AddV(y,-1)}
}



for (i=0; i < mSel.length; i++)
{
    if (mSel.filled == true){
    
        var color = mSel.fillColor;

        var labs = convertColor("CMYK", "LAB", [color.cyan,color.magenta,color.yellow,color.black]);
        color.black = 0;
    
        c = color.cyan;
        m = color.magenta;
        y = color.yellow;
    
        var goo = true;
        var DD, lab;
        var maxDD = 10000000000;
    
        while (goo){
            goo = false;
            for (z=0; z<6; z++){
                CalcNewCMY(z);
                lab = convertColor("CMYK", "LAB", [tc, tm, ty, 0]);
                DD = deltaE(lab, labs);
                if (maxDD>DD){maxDD = DD; goo = true; c = tc; m = tm; y = ty}
            }
        }
        color.cyan    = c;
        color.magenta = m;
        color.yellow  = y;
    }
}
У меня скрипт не работает. Никаких признаков выполнения кода. Запускаю, разумеется, с выделенными объектами.
 
Последнее редактирование:
Господа, пищите, пжлста, профиль под которым запускается скрипт для объективности тестов.
Может,
U.S. Web Coated (SWOP) v2
взять за "стандарт" ?
 
чёрт... форум обрезал только что пример кода с индексом выделения в сообщении выше! т.е. убрал квадратные скобки и всё, что в нём было.
 
Господа, пищите, пжлста, профиль под которым запускается скрипт для объективности тестов.
Может,
U.S. Web Coated (SWOP) v2
взять за "стандарт" ?

нужно брать активный в настоящий момент профиль, а не просто с потолка. иначе в этом вообще смысла нет.