Как преобразовать изображение в черно-белое в PHP

Как преобразовать изображение в черно-белое в PHP?

Не просто превратить его в оттенки серого, а сделать каждый пиксель черным или белым?


person AnnanFay    schedule 31.10.2008    source источник


Ответы (6)


Просто округлите оттенки серого до черного или белого.

float gray = (r + g + b) / 3
if(gray > 0x7F) return 0xFF;
return 0x00;
person Jasper Bekkers    schedule 31.10.2008
comment
Зеленый канал воспринимается более ярким, чем два других, лучшее уравнение для шкалы серого: 0,299R + 0,587G + 0,114B. - person Null303; 31.10.2008
comment
Мы округляем до чисто черного и чистого белого, поэтому эти веса не будут иметь большого значения :-) - person Jasper Bekkers; 31.10.2008
comment
Джаспер, похоже, они действительно имеют значение, потому что ваше преобразование в черный или белый цвет основано на пороге, проверенном по значению серого. - person Philipp Lenssen; 09.04.2012
comment
Все, что я говорю, это то, что полученное изображение не должно быть таким другим. Очевидно, они будут другими (и добавленный скалярный продукт не добавит много времени вычислений). Как бы то ни было, веса в значительной степени произвольны. В любом случае имейте в виду, что нас на самом деле не интересует фактическое значение яркости, а только черный или белый результат. В таком случае это кажется самым простым решением проблемы. Отметьте это, если вам интересно (или вы хотите еще больше усложнить эту проблему); dcgi.felk.cvut.cz/home/cadikm/color_to_gray_evaluation - person Jasper Bekkers; 13.04.2012
comment
См. en.wikipedia.org/wiki/ для источник коэффициентов для каждого цветового канала. PHP imagefilter с IMG_FILTER_GRAYSCALE, как предлагается в другом ответе здесь, делает это автоматически, поэтому вам не нужно самостоятельно манипулировать каждым пикселем в коде PHP. - person caw; 21.02.2019

Использование библиотеки php gd:

imagefilter($im, IMG_FILTER_GRAYSCALE);
imagefilter($im, IMG_FILTER_CONTRAST, -100);

Проверьте комментарии пользователей по ссылке выше, чтобы увидеть больше примеров.

person Joel Wietelmann    schedule 31.10.2008
comment
на самом деле использовать imagefilter ($ im, IMG_FILTER_CONTRAST, -1000); Обратите внимание на 1000 вместо 100 - person Mark Lalor; 24.08.2010
comment
@Mark у вас есть ссылка или вы знаете, зависит ли она от версии? Я не нашел ничего точного в Интернете, хотя я нашел несколько человек, которые говорят, что это от -100 до 100. - person AnnanFay; 29.03.2012
comment
Эм, не уверен, и у меня нет php, настроенного на банкомате, чтобы проверить это. - person Mark Lalor; 17.04.2012
comment
Я могу подтвердить. Должен быть -1000 вместо -100. - person Goose; 13.07.2015

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

person jonnii    schedule 31.10.2008
comment
Найдите функцию, соответствующую командной строке: convert source.jpg -colors 2 destination.jpg - person activout.se; 31.10.2008

Если вы собираетесь сделать это самостоятельно, вам потребуется реализовать алгоритм дизеринга. Но как @jonni говорит, было бы намного проще использовать существующий инструмент?

person toolkit    schedule 31.10.2008

Эта функция работает как шарм

    public function ImageToBlackAndWhite($im) {

    for ($x = imagesx($im); $x--;) {
        for ($y = imagesy($im); $y--;) {
            $rgb = imagecolorat($im, $x, $y);
            $r = ($rgb >> 16) & 0xFF;
            $g = ($rgb >> 8 ) & 0xFF;
            $b = $rgb & 0xFF;
            $gray = ($r + $g + $b) / 3;
            if ($gray < 0xFF) {

                imagesetpixel($im, $x, $y, 0xFFFFFF);
            }else
                imagesetpixel($im, $x, $y, 0x000000);
        }
    }

    imagefilter($im, IMG_FILTER_NEGATE);

}
person Amed    schedule 12.01.2013

Для каждого пикселя вы должны преобразовать цвет в оттенки серого - что-то вроде $ серый = $ красный * 0,299 + $ зеленый * 0,587 + $ синий * 0,114; (это весовые коэффициенты NTSC; существуют и другие подобные весовые коэффициенты. Это имитирует различную реакцию глаза на разные цвета).

Затем вам нужно выбрать значение отсечения - обычно это половина максимального значения пикселя, но в зависимости от изображения вы можете предпочесть более высокое значение (сделать изображение темнее) или меньшее (сделать изображение ярче).

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

Имейте в виду, что выполнение этого в PHP будет очень медленным - вам понадобится гораздо больше времени, чтобы найти библиотеку, которая это обеспечивает.

person Hugh Bothwell    schedule 01.11.2008
comment
Выполнение этих вещей в PHP не так медленно, я сделал полную библиотеку редактирования изображений на PHP с удалением эффекта красных глаз, фильтрами размытия, масками, фильтрами наложения и так далее, и производительность была не такой высокой. плохой. (Недостаточно для использования в реальном времени, но определенно достаточно быстро для большинства приложений). - person Jasper Bekkers; 01.11.2008