Форум программистов

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Форум программистов (https://programmersforum.ru/index.php)
-   Моделирование, изометрия, photoshop, 3d редакторы (https://programmersforum.ru/forumdisplay.php?f=97)
-   -   Расчет контраста для канала изображения (https://programmersforum.ru/showthread.php?t=309210)

4elovek_37 31.05.2017 11:19

Расчет контраста для канала изображения
 
Здравствуйте! Нужно рассчитать контраст для заданного канала изображения, полученного со спутника (вообще, для спутников должен поставляться т.н. "Паспортный контраст", но нередко он неизвестен и я пытаюсь посчитать его самостоятельно).

В интернете практически не нашел информации об оценке контраста изображения в целом, а не локального контраста. Из найденного (к, сожалению, ссылки нет под рукой) подошло вот это:

СКО * 2 / MaxVal,
где СКО - среднеквадратичное отклонение, MaxVal - максимальное значение пиксела на изображении

С учетом возможности использования знаковых типов данных, а также возможности неполного использования этих типов, получил примерно вот это:
Код:

/// ...
        double dLimit, dRealMaxGrad, dRealMinGrad;
    int power;
 
    dLimit = sqrt(dMax);//dMax - max для типа данных
    for(power = 0; power <= dLimit; ++power)
    {
        dRealMaxGrad = pow(2.0, power) - 1;
        if(stats->max > dRealMaxGrad)
            continue;
        else
            break;
    }
 
    if(stats->min < 0)
    {
        dLimit = sqrt(abs(dMin));//dMin - min для типа данных
        for(power = 0; power <= dLimit; ++power)
        {
            dRealMinGrad = pow(2.0, power);
            if(abs(stats->min) > dRealMinGrad)
                continue;
            else
                break;
        }
    }
    double dContrast_first = stats->stddev * 2 / (dRealMaxGrad + dRealMinGrad);// итоговая формула

Значения оценки получаются в принципе адекватными, но ожиданиям не соответствуют. К примеру, для снимков, где Паспортный контраст ~ 0.20 - 0.30 я получаю оценку в 0.11. Как это интерпретировать я пока не знаю. К тому же, при прогоне на R канале RGB изображения, выглядящего как черный квадрат на белом фоне, способ дал 0.22, что не может быть правдой.

Попробовал изобрести велосипед и считать по-своему: Mid-Range от градиентов с 8 соседними пикселами для каждого пиксела, затем считать Mid-Range от полученных значений для каждой строки, и затем считать Mid-Range от полученного столбца. После этого нормировать полученное значение путем деления на (dRealMaxGrad + dRealMinGrad).
Результаты, полученные данным способом, лежат ближе к ожидаемым (к примеру, для упомянутого изображения получил 0,25), но не слишком стабильны, и самое главное, у меня нет математического обоснования, почему этот метод правильный. А использовать на основе "ну, вроде получилось" - плохая идея.

Кто-нибудь сталкивался с подобной задачей, может быть подскажете гарантированных способов получить контраст для канала?

И не менее важный вопрос - у кого-нибудь не завалялось изображений с заранее известным контрастом?


04:11.