Nano Hash - криптовалюты, майнинг, программирование

Фоновое изображение темное или светлое?

Я делаю преобразование ODP-> HTML с помощью PHP. У меня проблемы со следующим:

Используйте свойство style: use-window-font-color, чтобы указать, должен ли цвет переднего плана окна использоваться в качестве цвета переднего плана для светлого фона и белого для темного цвета фона.

(Спецификация OpenDocument версии 1.0, 15.4.4)

Если у меня есть фоновое изображение, как мне проверить, светлое оно или темное?

У тебя есть идеи?

Заранее спасибо, Леву

30.04.2011

Ответы:


1

Я подумал, что это довольно интересная проблема для решения, поэтому я быстро разработал сценарий для ее решения. следуя другим предложениям

<?php

    // TODO supply your own filenames
    $filenames = array(
        'testpics/client-bella-vi.jpg',
        'testpics/istockphoto_8577991-concept-of-business-people-crowd.jpg',
        'testpics/medium-gray.jpg');

    // loop though each file
    foreach ($filenames as $filename) {

        echo "$filename<br/>";

        $luminance = get_avg_luminance($filename,10);
        echo "AVG LUMINANCE: $luminance<br />";

        // assume a medium gray is the threshold, #acacac or RGB(172, 172, 172)
        // this equates to a luminance of 170
        if ($luminance > 170) {
            echo "Black Text<br />";
        } else {
            echo 'White Text<br />';
        }

        echo "<br />";
    }
    exit;

    // get average luminance, by sampling $num_samples times in both x,y directions
    function get_avg_luminance($filename, $num_samples=10) {
        $img = imagecreatefromjpeg($filename);

        $width = imagesx($img);
        $height = imagesy($img);

        $x_step = intval($width/$num_samples);
        $y_step = intval($height/$num_samples);

        $total_lum = 0;

        $sample_no = 1;

        for ($x=0; $x<$width; $x+=$x_step) {
            for ($y=0; $y<$height; $y+=$y_step) {

                $rgb = imagecolorat($img, $x, $y);
                $r = ($rgb >> 16) & 0xFF;
                $g = ($rgb >> 8) & 0xFF;
                $b = $rgb & 0xFF;

                // choose a simple luminance formula from here
                // http://stackoverflow.com/questions/596216/formula-to-determine-brightness-of-rgb-color
                $lum = ($r+$r+$b+$g+$g+$g)/6;

                $total_lum += $lum;

                // debugging code
     //           echo "$sample_no - XY: $x,$y = $r, $g, $b = $lum<br />";
                $sample_no++;
            }
        }

        // work out the average
        $avg_lum  = $total_lum/$sample_no;

        return $avg_lum;
    }
11.05.2011
  • Что бы вы порекомендовали для количества образцов изображений около 600x400? Думаю, 10 на самом деле не работает .. PS отличный ответ !! 02.09.2015
  • Например, farm6.staticflickr.com/5478/14085542631_6649f0a995_b.jpg и идет как 107 он очень легкий и, вероятно, не будет работать с белым шрифтом. и farm4.staticflickr.com/3912/15197127275_74754c631f_b.jpg будет как 97 и он довольно темно? (это при работе с 100 сэмплами) 02.09.2015
  • Это немного проб и ошибок, но для начала ваше изображение имеет размер 1024x683 = 700000 пикселей или около того, разделите это на 100, и у вас будет 1 образец на 7000 пикселей. Образец должен был бы приземлиться только на нескольких из этих огней в гавани, и он бы выбросил среднее значение. Я бы немного увеличил его, попробовал 1000 образцов и посмотрел, что у вас получится. Определите время и посмотрите, что приемлемо для ваших производственных нужд, 03.09.2015
  • Другой вариант, не уверен, быстрее он или нет, - сначала размыть изображение. 03.09.2015
  • Ладно круто. Что насчет того, если мы немного отредактируем вашу функцию и сделаем два диапазона 0 - (ширина фотографии) и 0 - (высота фотографии), а затем случайным образом выберем пиксели. Сохранить пиксель и сделать оператор if, чтобы не использовать его снова? Неужели это даст более точный результат? 03.09.2015
  • Дайте ему взрыв, мне было бы интересно увидеть результаты, то, что там есть, отлично работает для меня, но ваше предложение случайных пикселей звучит как действительное 04.09.2015
  • Я пробовал случайный, но я также подумал о добавлении теста, чтобы увидеть, не слишком ли большой фактический пиксель, скажем почти полностью белый, это признак того, что может быть большое белое пятно? 05.09.2015
  • Похоже, вы начинаете становиться довольно специфичным для своего приложения, вы можете исключить пиксели с яркостью выше x и ниже x, но что тогда произойдет, если кто-то запустит его на белом изображении? Вероятно, будет лучше, если вы увеличите размер каждой выборки и возьмете медианное значение. Так, например, вместо того, чтобы просто проверять 1 пиксель, также проверьте 8 (или более) ближайших соседей и возьмите медиану, а не среднее. Просто из любопытства, если вы выбрали каждый пиксель изображения, вы получите ожидаемый результат? 06.09.2015
  • Я еще не тестировал это ... Ха-ха! ааа, это очень хорошая идея, я попробую! Фактическое приложение выполняет поиск в учетной записи tumblr, выбирая из нее все учетные записи flickr, а затем проверяет яркость, и если она становится <100, я устанавливаю размытие и загружаю на свой сервер. Это требует большой нагрузки на сервер и обычно приводит к тайм-ауту, если я устанавливаю для проверки пикселей более 100! И, очевидно, невозможно сказать, сколько фотографий он проверит, прежде чем выплюнет одну. 06.09.2015
  • Другая мысль: а что, если вы попробуете использовать медианное значение всего образца, а не среднее значение, тогда несколько ярких пятен не так сильно повлияют на результат. Если у вас тайм-аут, похоже, вам нужно запустить свою задачу как задание cron или из строки cmd, чтобы она могла работать бесконечно. 06.09.2015
  • Крон все еще будет тайм-аут? Но строка cmd звучит как хорошая идея !! Да, я сейчас займусь этим !! Вы хотите, чтобы я отправил вам код после? 06.09.2015
  • Вы можете опубликовать свое решение здесь в качестве ответа, чтобы другие могли ссылаться на него. cron не должен тайм-аут, это просто система, вызывающая php-скрипт, как если бы вы вызывали его через строку cmd. 06.09.2015

  • 2

    вы могли бы использовать некоторый алгоритм обработки изображений, который проверял бы яркость пикселей и вычислял среднюю яркость изображения.

    этот документ поможет вам начать:

    http://www.kweii.com/site/color_theory/2007_LV/BrightnessCalculation.pdf

    08.05.2011
  • я вижу там много разных формул для расчета яркости, какую из них мне использовать? Люма? 08.05.2011
  • это зависит от ваших конкретных потребностей, но я думаю, что luma или любой другой может решить вашу проблему. 08.05.2011
  • просто выберите и адаптируйте алогитм, который, по вашему мнению, будет наиболее легким для понимания. 08.05.2011
  • мне не нужно полностью разбираться в алгоритме, но результат должен быть идеальным :) 08.05.2011
  • Для ваших целей любые алгоритмы обработки яркости дадут идеальные и четкие результаты. Я просто предложил выбрать для вас более понятный алгоритм, потому что это упростит его реализацию или даже изменение, если вам нужно. 08.05.2011

  • 3

    Если вы хотите использовать GD, попробуйте использовать imagecolorat для выборки пикселей изображение. Вы можете определить RGB цвета, как показано на странице руководства PHP.

    Затем возьмите образцы RGB и определите их яркость, используя базовую формулу яркости..

    Определите порог того, что вы считаете светлым по сравнению с темным, и классифицируйте его соответственно.

    11.05.2011
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..