Расширенная обработка изображений средствами PHP

В PHP есть замечательная библиотека GD для примитивной обработки несложной графики. Но библиотека предоставляет лишь базовые функции обработки изображений.

Представляю вашему вниманию класс, который реализует более расширеные функции для работы с изображениями.

Автор класса 29 летний Артур Гранижевский из Польши.

Лицензия: LGPL

В настоящее время классом реализовано:

  • Использование преобразований Хафа для обнаружения косых углов и устранения перекоса изображений
  • Распознавание цвета фона изображения
  • Распознавания текста в изображениях (OCR), как пример, использование для распознавания капчи
  • Кадрирование изображения с реальным сохранением пропорций
  • Удаление шума из изображения
  • Поворот и масштабирование изображения с автоматическим распознаванием и заливкой цветом её основного фона
  • Генерация гистограммы
  • Шумоподавление
  • Расчет яркости (интенсивности) пикселя, оттенок, насыщенность и chromacity из цветов RGB в трех различных цветовых режимах (HSL, HSI, HSV)
  • Изменение оттенка изображения
  • Изменение яркости изображения
  • Изменение насыщенности изображения
  • Создание High-Definition-Range (HDR) изображений
  • Использование самых современных программируемых пиксельных шейдеров
  • Применение экспериментального эффекта размытия с настраиваемым размером ядра
  • Слияние двух изображений с использованием восьми различных режимов смешивания:
    • помимо (addition)
    • разделить (divide)
    • вычитание (subtract)
    • затемнить (darken)
    • облегчить (lighten)
    • разность (difference)
    • умножение (multiply)
    • прозрачность (opacity)

Скачать GD2Imaging.class.php

От слов к делу:

Удаление шума с картинки

1
2
3
4
5
6
<?php
require_once('../gd2imaging.php');
$image = new Image('noise.PNG');
$image->useMedian();// Использование по умолчанию 3x3 матрицы
$image->show();
?>
1
2
3
4
5
6
<?php
require_once('../gd2imaging.php');
$image = new Image('noise.PNG');
$image->useMedian(7, 7);// Использование 7x7 матрицы
$image->show();
?>

Трансформация Хафа

01
02
03
04
05
06
07
08
09
10
<?php
require_once('../gd2imaging.php');
$image = new Image('test4.PNG');
$image->getSkewAngle(
    8, // Определять до 8 различных углов
    256, // использование 256x256 матрицы
    true // рисовать линии Хафа (режим отладки)
);
$image->show();
?>

Автоматический разворот текста горизонтально

01
02
03
04
05
06
07
08
09
10
<?php
require_once('../gd2imaging.php');
$image = new Image('test4.PNG');
$image->deskew();
// повернуть на 90 градусов после deskew,
// потому что текст должен располагаться горизонтально, а не вертикально
// (метод не определяет направление текста)
$image->rotate(90);
$image->show();
?>

Поворот изображения и автоматическое распознавание фона изображения с заливкой фона

01
02
03
04
05
06
07
08
09
10
11
<?php
require_once('../gd2imaging.php');
$image = new Image('blue.png');
// поворачиваем изображение на 45 градусов
// и автоматически определяем цвет фона
// в данном случае получаем синий цвет фона
$image->rotate(45);
$image->show();
// вы можете считать значение цвета фона в переменную
$color = $image->getBackgroundColor();
?>

Получение гистограммы изображения

1
2
3
4
5
6
<?php
require_once('../gd2imaging.php');
$image = new Image('plain.jpg');
$histogram = $image->getHistogram();
$histogram->show();
?>

Распознавание текста

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
require_once('../gd2imaging.php');
// Загрузка изображения с алфавитом
$charsImage = new Image('alphabet.png');
// установка размеров отдельных букв
$charSize = new Dimensions(26, 25);
// создание квантизатора
$quantizator = new Quantizator();
foreach(range('A', 'Z') as $index => $char) {
    // обработка изображения текущим символом (буквой)
    $charImage = $charsImage->getSubImage(new Point($index * 26, 0), $charSize);
    // добавление вектора дляколлекции
    $quantizator->addGlyph($charImage->getVector(), $char);
}
// загрузка изображения с текстом для чтения
$image = new Image('text.png');
$text = "";
$lastObject = null;
// попытка найти все объекты(буквы) на картинке
foreach($image->findObjects() as $object) {
    // поиск пробелов
    if($lastObject &amp;&amp; $object->getPosition()->x - $lastObject->getPosition()->x > $object->getDimensions()->width * 1.5) {
        $text .= ' ';
    }
    $lastObject = $object;
    $search = $object->resize($charSize, true)->getVector();
    $result = $quantizator->findNearestEuklid($search);
    $text .= $result[0];
}
echo "Найдено: <strong>".$text."</strong><br>";
?>

Чтение каптчи

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
// загрузка изображения с алфавитом
$charsImage = new Image('alphabet.png');
// установка размеров букв алфавита
$charSize = new Dimensions(26, 25);
// Создание квантизатора
$quantizator = new Quantizator();
foreach(array_merge(range('A', 'Z'), range(1, 9)) as $index => $char) {
    // обработка изображения текущим символом
    $charImage = $charsImage->getSubImage(new Point($index * 26, 0), $charSize);
    // добавление вектора в коллекцию
    $quantizator->addGlyph($charImage->getVector(), $char);
}
// загрузка изображения капчи
$image = new Image('captcha.gif');
// инвертировать цвета каптчи и удаление всего шума с него
$image->toNegative()->useMedian();
$text = '';
$lastObject = null;
// попытка найти символы на капче
foreach($image->findObjects() as $object) {
    $lastObject = $object;
    $search = $object->resize($charSize)->getVector();
    $result = $quantizator->findNearestEuklid($search);
    $text .= $result[0];
}
echo 'Каптча: <strong>'.$text.'</strong><br>';
?>

Изменение цветового тона

1
2
3
4
5
6
<?php
require_once('../gd2imaging.php');
$image = new Image('bird.png');
$image->setHue(180); // 180 градусов
$image->show();
?>

Изменение насыщенности

1
2
3
4
5
6
7
8
9
<?php
require_once('../gd2imaging.php');
$image = new Image('hawaii.jpg');
// Засвечивание на 140%
$image->setLuminance(1.4);
// Устанавливаем насыщенность на 220%
$image->setSaturation(2.2);
$image->show();
?>

Ну вот вроде бы и все. Остальное можно смело найти в исходниках класса самостоятельно.

http://maxyc.ru/php/rasshirennaya-obrabotka-izobrazheniy-sredstvami-php.html/comment-page-1#comment-1730

Оставьте комментарий