Расширенная обработка изображений средствами 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

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

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

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

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

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

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

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

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

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

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

<?php
require_once('../gd2imaging.php');
$image = new Image('plain.jpg');
$histogram = $image->getHistogram();
$histogram->show();
?>

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

<?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>";
?>

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

<?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>';
?>

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

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

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

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

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

  1. Алексей

    А где взять изображение с алфавитом?) ну или какое оно должно быть?

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

Примечание - Вы можете использовать эти HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>