Перейти к содержимому
Поиск
Php Разработка

PHP: полный мануал с примерами, функциями и ООП

Практический мануал PHP: от переменных и читаемого кода до безопасных форм, интеграций, базы данных и ООП на примере магазина. Учебный маршрут, поиск функций, подробные примеры, разбор ошибок и исходники для скачивания.

Александр НекрасовИзменено:
Практический мануал PHP: от переменных и функций к объектной модели интернет-магазина
PHP 8.5.11468 глав6256 карточек справочника
Дерево руководства

Глава 348 · После adaptive/selective фильтров

Imagick: точечные дефекты, зернистость и локальная статистика

От окна соседей до медианы, фиксированного enhance, защищённой маркировки и цены расширения маски.

От крапинок к первому видимому результату

На каталожном макете появились отдельные крапинки и зернистость. Их хочется ослабить, сохранив ярлык и тонкую служебную маркировку. Фильтр не знает, какая точка — дефект, а какая — нужный штрих. Начнём с видимого результата и маленького окна соседей, затем сравним три разных правила.

Собственный вход 400×320: товар, шумный ярлык, SKU со штрихами, импульсы 0/255 на 128, зерно и бинарная маска с дырками
Собственный вход 400×320: товар, шумный ярлык, SKU со штрихами, импульсы 0/255 на 128, зерно и бинарная маска с дырками
Один проход despeckle рядом с исходником: сильные точки могут только ослабнуть; надпись и линию оцениваем отдельно
Один проход despeckle рядом с исходником: сильные точки могут только ослабнуть; надпись и линию оцениваем отдельно

В модели «окно 3×3» — 3 столбца по 3 пикселя, всего 9 значений. В центре контрольной точки (32,260) находится 255, вокруг восемь 128. Медиана сортирует их и выбирает пятое 128; среднее складывает и делит на 9: 1279/9≈142.111. Это модель statisticImage, не полный алгоритм despeckle или enhance. Координата x растёт вправо, y вниз; отсчёт начинается с 0.

Окно соседей → правило выбора → новое значение центра: median и mean различаются; тонкий штрих и маска показывают цену операции
Окно соседей → правило выбора → новое значение центра: median и mean различаются; тонкий штрих и маска показывают цену операции

У первого despeckle собственное правило: фиксированный проход небольшими парными повышениями тёмных и понижениями светлых относительно соседей. Он ослабляет локальные выбросы постепенно; показанная сортировка медианы описывает другой метод и не заменяет этот механизм.

Самая маленькая запись

В $image уже загружена отдельная копия. Стрелка -> вызывает метод; () содержит аргументы, ; завершает команду. У despeckleImage нет аргументов: нельзя добавить выдуманную силу, sigma или канал.

$image->despeckleImage();

Метод меняет текущий объект. Сначала $image = clone $source; создаёт независимую копию; простое = объект не копирует. В полной программе ! проверяет false, if выбирает отказ, throw new RuntimeException прекращает неудачную цепочку. Clear освобождает native-ресурсы после записи. Подготовка: объект и метод, clone, исключения.

Распакуйте весь архив примера: example.php — программа, localstats-fixture.php — показанный ниже помощник, source.png.b64 — текстовое Base64-представление точного PNG. Require подключает файл относительно __DIR__, папки программы. LoadLocalStatsSource возвращает объект Imagick: декодирует данные, проверяет SHA256 и записывает source.png. Фильтры работают с clone; SaveLocalStatsComparison собирает панели в новом PNG и печатает имя файла. Его нужно открыть просмотрщиком: stdout содержит имя, не саму картинку.

Виртуальные пиксели задают данные за рамкой: EDGE продолжает край для enhance/statistic. У CPU-despeckle собственный буфер с нулевой рамкой; нельзя обещать одинаковое влияние настройки для трёх методов. Константа Imagick::VIRTUALPIXELMETHOD_EDGE — имя правила, :: здесь читает константу.

Получить первый PNG после одного despeckleПример для указанного окружения
<?php
declare(strict_types=1);

require __DIR__ . '/localstats-fixture.php';
$source = loadLocalStatsSource();
$source->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$image = clone $source;
if (!$image->despeckleImage()) {
    throw new RuntimeException('Не удалось применить despeckleImage');
}
saveLocalStatsComparison([$source, $image], 'localstats-first.png');
$source->clear();
$image->clear();

Результат: Панели: исходник и один проход despeckle. Одиночные точки приближаются к соседнему уровню 128, но сильный импульс не обязан исчезнуть. Сравните тонкую белую линию, надпись и края товара: краткое описание «сохраняя края» не обещает неизменность каждого пикселя контура. Архив содержит example.php, localstats-fixture.php и source.png.b64. Распакуйте все три файла рядом, выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверяет SHA256 и восстанавливает точный source.png без интернета и шрифтов при запуске. PNG откройте обычным просмотрщиком. Первая панель — исходник, затем указанные варианты; размер 800×320, каждая панель 400×320 без масштабирования. Напечатанные подписи описывают исходные данные и не пересчитываются фильтрами.

Ожидаемый вывод
localstats-first.png
Полный переносимый помощник localstats-fixture.php
<?php
declare(strict_types=1);

function loadLocalStatsSource(): Imagick
{
    $encoded = file_get_contents(__DIR__ . '/source.png.b64');
    if ($encoded === false) {
        throw new RuntimeException('Не найден source.png.b64: распакуйте весь архив');
    }
    $bytes = base64_decode($encoded, true);
    if ($bytes === false || hash('sha256', $bytes) !== '73657c239600755e483369848a41d9f21495cb286490504659151b49aa8bebef') {
        throw new RuntimeException('Повреждён исходный PNG');
    }
    $path = __DIR__ . '/source.png';
    if (file_put_contents($path, $bytes) !== strlen($bytes)) {
        throw new RuntimeException('Не удалось восстановить source.png');
    }
    return new Imagick($path);
}

function saveLocalStatsComparison(array $panels, string $filename): void
{
    if ($panels === []) {
        throw new InvalidArgumentException('Нужна хотя бы одна панель');
    }
    $output = new Imagick();
    $output->newImage(400 * count($panels), 320, 'white');
    $output->setImageFormat('png');
    foreach ($panels as $index => $panel) {
        if (!$panel instanceof Imagick || $panel->getImageWidth() !== 400 || $panel->getImageHeight() !== 320) {
            throw new InvalidArgumentException('Панель должна быть Imagick 400 на 320 пикселей');
        }
        if (!$output->compositeImage($panel, Imagick::COMPOSITE_OVER, 400 * $index, 0)) {
            throw new RuntimeException('Не удалось собрать сравнение');
        }
    }
    $output->setImageDepth(8);
    $output->setOption('png:color-type', '2');
    if (!$output->writeImage(__DIR__ . '/' . $filename)) {
        throw new RuntimeException('Не удалось записать результат');
    }
    $output->clear();
    echo $filename, "\n";
}

В помощнике function объявляет операции; тип после : описывает результат, Imagick — объект изображения, void — отсутствие возвращаемого значения. Array $panels — список объектов; foreach перебирает его с индексом, count считает панели. Проверки чтения/декодирования/хеша/размера останавливают повреждённый вход. Composite размещает панели без масштабирования; depth 8 и RGB PNG фиксируют формат. Это инфраструктура примеров, не скрытая часть алгоритмов. Подробнее: функции, массивы, foreach, чтение и запись.

Три правила локальной обработки

Despeckle использует complementary Hull: по четырём направлениям выполняет парные повышения тёмных и понижения светлых относительно соседей. В точном CPU C шаг равен одному 8-битному уровню, поэтому один проход не обязан удалить сильную 0/255 точку. Это не сортировка медианы.

Enhance использует фиксированную окрестность 5×5 и заданные веса: сосед включается при достаточно малом цветовом расстоянии до центра. В точном Core distance_squared<0.069 учитывает компоненты цвета и alpha. Это не автоматическая яркость, резкость или ползунок «качества»; очень отличающийся импульс может остаться.

StatisticImage применяет статистику отдельно к обновляемым каналам каждого пикселя. Окно включает центр и перемещается по растру; результатом остаётся изображение. Медианы R,G,B выбираются отдельно: итоговый RGB не обязательно совпадает с цветом одного соседнего пикселя. Это отличается от selectiveBlur, сравнивающего интенсивности для допуска соседей.

Перед полной программой: $image, $enhanced, $median — отдельные clone из $source. Первые два вызова без аргументов; у третьего константа выбирает медиану, 3 и 3 задают окно, channel остаётся default. Скобки вызывают метод, запятые разделяют аргументы, :: без скобок читает константу.

$image->despeckleImage();
$enhanced->enhanceImage();
$median->statisticImage(Imagick::STATISTIC_MEDIAN, 3, 3);
Сравнить три правила на одном исходникеПример для указанного окружения
<?php
declare(strict_types=1);

require __DIR__ . '/localstats-fixture.php';
$source = loadLocalStatsSource();
$source->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$image = clone $source;
if (!$image->despeckleImage()) {
    throw new RuntimeException('Не удалось применить despeckleImage');
}
$enhanced = clone $source;
if (!$enhanced->enhanceImage()) {
    throw new RuntimeException('Не удалось применить enhanceImage');
}
$median = clone $source;
if (!$median->statisticImage(Imagick::STATISTIC_MEDIAN, 3, 3)) {
    throw new RuntimeException('Не удалось применить statisticImage');
}
saveLocalStatsComparison([$source, $image, $enhanced, $median], 'localstats-controls.png');
$source->clear();
$image->clear();
$enhanced->clear();
$median->clear();

Результат: Панели: исходник, despeckle, enhance, медиана 3×3. Точки, зерно, тонкая линия, буквы и маска отвечают на разные вопросы; один показатель качества эти проверки не заменяет. Архив содержит example.php, localstats-fixture.php и source.png.b64. Распакуйте все три файла рядом, выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверяет SHA256 и восстанавливает точный source.png без интернета и шрифтов при запуске. PNG откройте обычным просмотрщиком. Первая панель — исходник, затем указанные варианты; размер 1600×320, каждая панель 400×320 без масштабирования. Напечатанные подписи описывают исходные данные и не пересчитываются фильтрами.

Ожидаемый вывод
localstats-controls.png

Выбрать статистику, окно и единицы

Тип статистики — выбор числа из соседних значений. Width/height — размеры окна в пикселях; 3×3 не означает радиус 3. Здесь размеры не доли диапазона и не числа отброшенных пикселей. PNG8 отображается как 0..255; внутри проверенной Q16-сборки Q означает QuantumRange, максимум 65535. В дальнейшей схеме ярлыка 0.68×Q — порог 44563.8 native-единицы, не доля числа пикселей. Сохранение в PNG8 квантует вычисление.

Константа Imagick::Что получается из окнаДля чегоОграничение
STATISTIC_MINIMUMМинимум канала окна.Расширить чёрное в маске.Сужает белое, теряет тонкие светлые элементы.
STATISTIC_MAXIMUMМаксимум канала окна.Расширить белое, закрыть одиночную чёрную дырку.Раздувает границы, может соединить соседние области.
STATISTIC_MEANСумма / число элементов.Смягчить мелкие колебания.Сильный выброс влияет на соседей, края смешиваются.
STATISTIC_MEDIANЦентральное по порядку после сортировки, не арифметическое среднее.Удалить отдельные импульсы среди похожих соседей.Тонкая линия тоже может оказаться меньшинством; при чётном числе элементов C выбирает верхний центральный.
STATISTIC_MODEСамое частое значение канала.Выделить преобладающий дискретный уровень.При равной частоте точный C выбирает меньший уровень; на плавных оттенках частоты часто равны.
STATISTIC_NONPEAKМедиана; если она крайняя среди различных значений, берётся соседнее различное.Подавить крайний локальный уровень.Это правило выбора, не распознавание ненужного «пика».
STATISTIC_GRADIENTМаксимум минус минимум.Карта локального размаха/перепадов.Шум и полезная граница оба увеличивают размах; это не горизонтальная производная.
STATISTIC_STANDARD_DEVIATIONКорень из среднего квадрата отклонений от среднего.Карта локального разброса.Не оценка качества и не детектор только шума.
STATISTIC_ROOT_MEAN_SQUAREКорень из среднего квадратов значений.Локальный квадратичный уровень.Это уровень, не разброс: постоянный ненулевой фон даёт ненулевой результат.
STATISTIC_CONTRASTТочный Core: abs((max−min)/(max+min)), с защитой нулевого знаменателя.Исследовать версионную реализацию отношения.В 7.1.1-46 нет ×QuantumRange: Q16-результат порядка 0..1 native-единицы в PNG8 практически чёрный. Не обещайте яркую нормированную карту.

Все 10 имён доступны в проверенной сборке. Не переносите это автоматически на старый сервер. Для пользовательского выбора заведите whitelist, для окна — положительные нечётные ограниченные размеры. Чётные окна C допускает, но центр смещён: ширина 2 использует x−1 и x. Большое окно может уничтожить букву и требует ресурсов; сравнительную скорость без измерений не обещаем.

Окно 3×3 связано с масштабом этого входа. При удвоении разрешения фиксированное окно не действует автоматически на тот же физический размер детали. Цветовая маска канала и прямоугольная область — разные способы ограничения.

Разделить дефекты товара, маркировку и бумагу

Прямоугольная обработка сохраняет SKU и весь участок вне ROI точно
Прямоугольная обработка сохраняет SKU и весь участок вне ROI точно
Один enhance и цепочка enhance→threshold решают разные требования
Один enhance и цепочка enhance→threshold решают разные требования

Координаты известны из макета. Despeckle применяется к x=24..243,y=36..219; SKU находится справа вне области. Ярлык занимает x=72..227,y=140..189. Возвращая непрозрачную вырезку на clone, можно проверить каждый внешний пиксель. Это жёсткая граница ROI, не автоматическое выделение предмета или мягкая маска смешивания.

В пустой части ярлыка x=80..219,y=177..185 нет букв: чёрный после threshold там можно считать ложным дефектом по устройству входа. Это не OCR и не доказательство сохранения каждого штриха. Зерно измеряется отдельно в x=148..247,y=290..303 стандартным отклонением R — разбросом вокруг среднего; меньшее число на участке не доказывает лучшее качество всей картинки.

В сохранённых PNG8 сильные одиночные точки 255/0 после despeckle стали 239/16, после enhance остались 255/0, после медианы 3×3 стали 128. Разброс R на зернистом контрольном участке: исходник 7.21, despeckle 1.92, enhance 3.22, median 3.74, mean 2.48. У despeckle изменилось и среднее участка: 127.91→129.36. Эти числа описывают данный образец, а не рейтинг фильтров.

После одного порога в пустом участке ярлыка было 307 чёрных пикселей, после enhance и того же порога — 26. Отдельный исходник и промежуточный вариант позволяют увидеть, что именно помогло задаче; наличие оставшихся 26 точек не скрывается.

Увидеть цену медианы и расширения маски

Медиана устраняет одиночный выброс, но нужная тонкая линия тоже может исчезнуть
Медиана устраняет одиночный выброс, но нужная тонкая линия тоже может исчезнуть
Максимум заполняет малые чёрные дырки и расширяет всё белое
Максимум заполняет малые чёрные дырки и расширяет всё белое

Белый в маске означает выбранную область. MAXIMUM расширяет выбранное, MINIMUM сужает; при обратной полярности смысл изменится. Малую дырку окно заполнит, большая останется: метод не определяет, окружён ли чёрный участок белым на расстоянии десятков пикселей. Для заполнения по связности нужен другой алгоритм.

На входе есть одиночные дырки, дырки 5×5 и 9×9 и двухпиксельный зазор между белыми прямоугольниками. Даже когда дырка исчезает, граница растёт и соседние фигуры могут соединиться. Сравнивайте площадь и связность, а не только число дыр. Настоящий штрих не отличается от «шума» лишь тем, что нужен человеку.

Сохранённый центр (32,260): median 128, mean 142. Точка тонкой линии (74,258) была 255, после median стала 128, после mean — 170. В маске белая площадь выросла с 3896 до 4312 пикселей при 3×3 и до 4630 при 5×5. Одиночная дырка заполнена и двухпиксельный зазор закрыт уже при 3×3; центр большой дырки остался чёрным в обоих вариантах.

Проверить эффект, ограничения и отказ

Определите критерий до фильтра: ослабить известные точки, уменьшить зерно бумаги, сохранить SKU побайтно или заполнить малую дырку при допустимом росте области. Сохраняйте оригинал и промежуточный результат; варианты начинайте с оригинала. True означает успех операции, не пригодность для публикации.

Проверяйте формат, площадь, кадры, доступность методов/констант и права записи. Ограничьте пользовательский type whitelist-списком, окно — положительными нечётными размерами в разумном пределе. Неподходящий type или размеры не обязаны вызвать аккуратную PHP-ошибку. Окно, разрешение и копии влияют на native-память; время измеряйте в своей среде.

Восемь программ проверены на PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46 Q16. PNG8 непрозрачный RGB; при сохранении значения квантуются. Малый опыт охватывает 10 статистик, 0/1/even/прямоугольное окно, unknown-тип и alpha-шахматку; отрицательные и огромные размеры не запускались. Контрольные свойства не являются полной независимой реализацией алгоритмов.

Выбрать правило и сделать свой вариант

Выбор по требованию: фиксированный фильтр, явная статистика или защищённая ROI
Выбор по требованию: фиксированный фильтр, явная статистика или защищённая ROI
  • Изолированная точка: сравните median 3×3 и despeckle, отдельно проверьте нужную линию.
  • Зернистая бумага: сравните enhance и исходник; затем одинаковый порог.
  • Белая маска с малой дыркой: MAXIMUM, если допустим рост границ; связностный залив — отдельная задача.
  • Нужно сохранить маркировку: обработайте известную ROI и проверьте все внешние пиксели.

Упражнение: исправить только плашку маски, сохранив товар, подписи и SKU. Решение: clone; cropImage(116,64,268,246); setImagePage(0,0,0,0); statisticImage(MAXIMUM,3,3); compositeImage обратно в (268,246). Полная программа с вариантом 5×5 — в карточке statisticImage. Объясните, почему исчезнувшая дырка при выросшей белой площади не означает восстановленную истинную маску.

Дальше: похожие соседи и карта границ, пороговая маска, распределение яркостей, производный файл. Не переносите сильный фильтр на весь каталог без просмотра разных входов.

Функции и методы этой темы

Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.

Imagick::despeckleImageОслабить крапинки, проверяя настоящие штрихи и контуры.

PECL imagick 2, PECL imagick 3 · imagick

Imagick::despeckleImage(): bool

Ослабить крапинки, проверяя настоящие штрихи и контуры.

Самая маленькая запись

В $image уже загружена отдельная копия. Стрелка -> вызывает метод; () содержит аргументы, ; завершает команду. У despeckleImage нет аргументов: нельзя добавить выдуманную силу, sigma или канал.

$image->despeckleImage();

Метод меняет текущий объект. Сначала $image = clone $source; создаёт независимую копию; простое = объект не копирует. В полной программе ! проверяет false, if выбирает отказ, throw new RuntimeException прекращает неудачную цепочку. Clear освобождает native-ресурсы после записи. Подготовка: объект и метод, clone, исключения.

Полная сигнатура и аргументы

Imagick::despeckleImage(): bool

Параметров нет. Пустые скобки — правильный полный вызов. Доступность PHP Manual: PECL imagick 2, PECL imagick 3. Дополнительного минимального номера ImageMagick краткая официальная страница не задаёт; поведение ниже проверено на указанной точной сборке.

Возврат и отказ

Тип bool: true при успехе; картинка остаётся в текущем Imagick. $ok = $image->despeckleImage(...) сохранит флаг, не новый растр. В проверенной версии пустой объект даёт ImagickException; native-отказ PHP-обвязка также превращает в исключение. У statisticImage официальный блок ошибок пуст: это дополнение по исходнику и запуску. Чтение, ресурсы и запись могут отказать отдельно; true не означает художественное улучшение.

Фактические PNG: Ослабить отдельные крапинки одним фиксированным проходом
Фактические PNG: Ослабить отдельные крапинки одним фиксированным проходом
Ослабить отдельные крапинки одним фиксированным проходомПример для указанного окружения
<?php
declare(strict_types=1);

require __DIR__ . '/localstats-fixture.php';
$source = loadLocalStatsSource();
$source->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$image = clone $source;
if (!$image->despeckleImage()) {
    throw new RuntimeException('Не удалось применить despeckleImage');
}
saveLocalStatsComparison([$source, $image], 'localstats-despeckle-basic.png');
$source->clear();
$image->clear();

Результат: Панели: исходник и один проход despeckle. Одиночные точки приближаются к соседнему уровню 128, но сильный импульс не обязан исчезнуть. Сравните тонкую белую линию, надпись и края товара: краткое описание «сохраняя края» не обещает неизменность каждого пикселя контура. Архив содержит example.php, localstats-fixture.php и source.png.b64. Распакуйте все три файла рядом, выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверяет SHA256 и восстанавливает точный source.png без интернета и шрифтов при запуске. PNG откройте обычным просмотрщиком. Первая панель — исходник, затем указанные варианты; размер 800×320, каждая панель 400×320 без масштабирования. Напечатанные подписи описывают исходные данные и не пересчитываются фильтрами.

Ожидаемый вывод
localstats-despeckle-basic.png

Когда требование меняется

SKU и нижние образцы нужно сохранить точно, а дефекты на коробке ослабить. Координаты известны из макета: фильтруем вырезку 220×184 и возвращаем её в (24,36).

CropImage(width,height,x,y) вырезает прямоугольник; setImagePage(0,0,0,0) сбрасывает виртуальное смещение вырезки. CompositeImage(...,COMPOSITE_OVER,x,y) возвращает непрозрачную вырезку в исходные координаты. Числа относятся к известному макету, не поиску дефекта.

Очистить прямоугольник товара и сохранить служебную маркировкуПример для указанного окружения
<?php
declare(strict_types=1);

require __DIR__ . '/localstats-fixture.php';
$source = loadLocalStatsSource();
$source->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$image = clone $source;
$region = clone $source;
$region->cropImage(220, 184, 24, 36);
$region->setImagePage(0, 0, 0, 0);
if (!$region->despeckleImage()) {
    throw new RuntimeException('Не удалось применить despeckleImage');
}
if (!$image->compositeImage($region, Imagick::COMPOSITE_OVER, 24, 36)) {
    throw new RuntimeException('Не удалось вернуть область');
}
$region->clear();
saveLocalStatsComparison([$source, $image], 'localstats-despeckle-region.png');
$source->clear();
$image->clear();

Результат: Справа меняются только x=24..243,y=36..219. Все внешние пиксели, SKU с тонкими штрихами и нижние плашки сохранены точно. Рамка вырезки — новая граница задачи; внутри результат не обязан совпасть с обработкой всего исходника. Архив содержит example.php, localstats-fixture.php и source.png.b64. Распакуйте все три файла рядом, выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверяет SHA256 и восстанавливает точный source.png без интернета и шрифтов при запуске. PNG откройте обычным просмотрщиком. Первая панель — исходник, затем указанные варианты; размер 800×320, каждая панель 400×320 без масштабирования. Напечатанные подписи описывают исходные данные и не пересчитываются фильтрами.

Ожидаемый вывод
localstats-despeckle-region.png

Потери, каналы и альтернативы

Не передавайте radius/sigma/channel в despeckle/enhance: таких PHP-параметров нет. У statistic канал задаёт обновляемые составляющие; в малом опыте CHANNEL_RED сохранил G/B, RGB-маска сохранила переменную alpha. Default median, despeckle и enhance изменили тестовую alpha-шахматку. Непрозрачный RGB-вход не доказывает сохранение прозрачного края, ICC/CMYK/HDR или многокадрового файла.

Импульсы, зерно, JPEG ringing и тонкие линии различаются задачей, но могут выглядеть похоже численно. Для сглаживания с допуском есть selective/adaptive фильтры, для обычного усреднения Gaussian blur. Исторические medianFilterImage/reduceNoiseImage deprecated с 3.4.4; их полный разбор относится к отдельным карточкам, здесь используется statisticImage.

Связанные методы: enhanceImage · statisticImage.

Imagick::enhanceImageПроверить фиксированный фильтр для зернистости и подготовки ярлыка к бинаризации.

PECL imagick 2, PECL imagick 3 · imagick

Imagick::enhanceImage(): bool

Проверить фиксированный фильтр для зернистости и подготовки ярлыка к бинаризации.

Самая маленькая запись

В $image уже загружена отдельная копия. Стрелка -> вызывает метод; () содержит аргументы, ; завершает команду. У enhanceImage нет аргументов: нельзя добавить выдуманную силу, sigma или канал.

$image->enhanceImage();

Метод меняет текущий объект. Сначала $image = clone $source; создаёт независимую копию; простое = объект не копирует. В полной программе ! проверяет false, if выбирает отказ, throw new RuntimeException прекращает неудачную цепочку. Clear освобождает native-ресурсы после записи. Подготовка: объект и метод, clone, исключения.

Полная сигнатура и аргументы

Imagick::enhanceImage(): bool

Параметров нет. Пустые скобки — правильный полный вызов. Доступность PHP Manual: PECL imagick 2, PECL imagick 3. Дополнительного минимального номера ImageMagick краткая официальная страница не задаёт; поведение ниже проверено на указанной точной сборке.

Возврат и отказ

Тип bool: true при успехе; картинка остаётся в текущем Imagick. $ok = $image->enhanceImage(...) сохранит флаг, не новый растр. В проверенной версии пустой объект даёт ImagickException; native-отказ PHP-обвязка также превращает в исключение. У statisticImage официальный блок ошибок пуст: это дополнение по исходнику и запуску. Чтение, ресурсы и запись могут отказать отдельно; true не означает художественное улучшение.

В подписи схемы Q — QuantumRange, максимум внутреннего значения канала: в проверенной Q16-сборке 65535. Поэтому 0.68×Q — порог 44563.8 native-единицы, а не 68% числа пикселей. Этот порог относится к следующей операции thresholdImage; у enhanceImage параметров нет.

Фактические PNG: Проверить фиксированный фильтр на мелкой зернистости
Фактические PNG: Проверить фиксированный фильтр на мелкой зернистости
Проверить фиксированный фильтр на мелкой зернистостиПример для указанного окружения
<?php
declare(strict_types=1);

require __DIR__ . '/localstats-fixture.php';
$source = loadLocalStatsSource();
$source->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$image = clone $source;
if (!$image->enhanceImage()) {
    throw new RuntimeException('Не удалось применить enhanceImage');
}
saveLocalStatsComparison([$source, $image], 'localstats-enhance-basic.png');
$source->clear();
$image->clear();

Результат: Справа один enhance. На ровном зернистом участке разброс уменьшается; очень контрастная точка может остаться. Просмотрите фактуру и слабую деталь +8 вместе с фоном. Метод не выбирает художественное качество автоматически. Архив содержит example.php, localstats-fixture.php и source.png.b64. Распакуйте все три файла рядом, выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверяет SHA256 и восстанавливает точный source.png без интернета и шрифтов при запуске. PNG откройте обычным просмотрщиком. Первая панель — исходник, затем указанные варианты; размер 800×320, каждая панель 400×320 без масштабирования. Напечатанные подписи описывают исходные данные и не пересчитываются фильтрами.

Ожидаемый вывод
localstats-enhance-basic.png

Когда требование меняется

Шум светлой бумаги даёт лишние чёрные точки после бинаризации. Сравним один порог напрямую и после enhance; обе обработки начинаются с независимой копии одного ярлыка.

Сначала отдельно подготавливается $cleaned, затем обе версии получают одинаковый thresholdImage. Imagick::getQuantumRange() — статический вызов метода класса: :: со скобками вызывает метод без отдельного объекта. Он возвращает массив; ['quantumRangeLong'] выбирает максимум. В Q16 это 65535; умножение на 0.68 даёт 44563.8 native-единицы порога, не 68% числа пикселей. || означает «или»: отказ любой вставки завершает цепочку. Подробнее: пороговая бинаризация.

Подготовить шумный бумажный ярлык к пороговой маскеПример для указанного окружения
<?php
declare(strict_types=1);

require __DIR__ . '/localstats-fixture.php';
$source = loadLocalStatsSource();
$source->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$image = clone $source;
$label = clone $source;
$label->cropImage(156, 50, 72, 140);
$label->setImagePage(0, 0, 0, 0);
$label->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$cleaned = clone $label;
if (!$cleaned->enhanceImage()) {
    throw new RuntimeException('Не удалось применить enhanceImage');
}
$quantum = Imagick::getQuantumRange()['quantumRangeLong'];
if (!$label->thresholdImage($quantum * 0.68)) {
    throw new RuntimeException('Не удалось применить thresholdImage');
}
if (!$cleaned->thresholdImage($quantum * 0.68)) {
    throw new RuntimeException('Не удалось применить thresholdImage');
}
$prepared = clone $source;
if (!$image->compositeImage($label, Imagick::COMPOSITE_OVER, 72, 140) || !$prepared->compositeImage($cleaned, Imagick::COMPOSITE_OVER, 72, 140)) {
    throw new RuntimeException('Не удалось вернуть ярлык');
}
$label->clear();
$cleaned->clear();
saveLocalStatsComparison([$source, $image, $prepared], 'localstats-enhance-label-mask.png');
$source->clear();
$image->clear();
$prepared->clear();

Результат: Панели: исходник; ярлык после threshold(0.68×QuantumRange); ярлык после enhance и того же threshold. В заведомо пустом участке 140×9 чёрных точек стало меньше; читаемость букв оценивайте отдельно. Вне ярлыка x=72..227,y=140..189 всё сохранено точно; это маска ярлыка, не распознавание текста. Архив содержит example.php, localstats-fixture.php и source.png.b64. Распакуйте все три файла рядом, выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверяет SHA256 и восстанавливает точный source.png без интернета и шрифтов при запуске. PNG откройте обычным просмотрщиком. Первая панель — исходник, затем указанные варианты; размер 1200×320, каждая панель 400×320 без масштабирования. Напечатанные подписи описывают исходные данные и не пересчитываются фильтрами.

Ожидаемый вывод
localstats-enhance-label-mask.png

Потери, каналы и альтернативы

Не передавайте radius/sigma/channel в despeckle/enhance: таких PHP-параметров нет. У statistic канал задаёт обновляемые составляющие; в малом опыте CHANNEL_RED сохранил G/B, RGB-маска сохранила переменную alpha. Default median, despeckle и enhance изменили тестовую alpha-шахматку. Непрозрачный RGB-вход не доказывает сохранение прозрачного края, ICC/CMYK/HDR или многокадрового файла.

Импульсы, зерно, JPEG ringing и тонкие линии различаются задачей, но могут выглядеть похоже численно. Для сглаживания с допуском есть selective/adaptive фильтры, для обычного усреднения Gaussian blur. Исторические medianFilterImage/reduceNoiseImage deprecated с 3.4.4; их полный разбор относится к отдельным карточкам, здесь используется statisticImage.

Связанные методы: despeckleImage · statisticImage.

Imagick::statisticImageВыбрать правило соседей: медиану для импульсов или максимум для белой маски.

PECL imagick 3 >= 3.3.0 · imagick

Imagick::statisticImage(int $type, int $width, int $height, int $channel = Imagick::CHANNEL_DEFAULT): bool

Выбрать правило соседей: медиану для импульсов или максимум для белой маски.

Самая маленькая запись

Imagick::STATISTIC_MEDIAN — именованная целочисленная константа выбора медианы: :: без скобок читает константу класса. Следующие 3 и 3 — ширина и высота окна в пикселях, не радиус, проценты или размер PNG. Запятые отделяют аргументы; channel пропущен, default Imagick::CHANNEL_DEFAULT.

$image->statisticImage(Imagick::STATISTIC_MEDIAN, 3, 3);

Метод меняет текущий объект. Сначала $image = clone $source; создаёт независимую копию; простое = объект не копирует. В полной программе ! проверяет false, if выбирает отказ, throw new RuntimeException прекращает неудачную цепочку. Clear освобождает native-ресурсы после записи. Подготовка: объект и метод, clone, исключения.

Полная сигнатура и аргументы

Imagick::statisticImage(int $type, int $width, int $height, int $channel = Imagick::CHANNEL_DEFAULT): bool
АргументЕдиницы, обязательность и default
$typeОбязательный int из доступных STATISTIC_*: все 10 типов ниже. Это операция над значениями каналов, не анализ, возвращающий PHP-массив.
$width / $heightОбязательные int: ширина и высота окрестности в пикселях. 3×3 содержит 9 значений каждого канала, включая центр. Прямоугольное 3×5 допустимо.
$channelНеобязательный int, default Imagick::CHANNEL_DEFAULT. Маска ограничивает изменяемые каналы; флаги объединяются побитовым |: CHANNEL_RED | CHANNEL_GREEN | CHANNEL_BLUE. Это не выбор ROI.
Константа Imagick::Что получается из окнаДля чегоОграничение
STATISTIC_MINIMUMМинимум канала окна.Расширить чёрное в маске.Сужает белое, теряет тонкие светлые элементы.
STATISTIC_MAXIMUMМаксимум канала окна.Расширить белое, закрыть одиночную чёрную дырку.Раздувает границы, может соединить соседние области.
STATISTIC_MEANСумма / число элементов.Смягчить мелкие колебания.Сильный выброс влияет на соседей, края смешиваются.
STATISTIC_MEDIANЦентральное по порядку после сортировки, не арифметическое среднее.Удалить отдельные импульсы среди похожих соседей.Тонкая линия тоже может оказаться меньшинством; при чётном числе элементов C выбирает верхний центральный.
STATISTIC_MODEСамое частое значение канала.Выделить преобладающий дискретный уровень.При равной частоте точный C выбирает меньший уровень; на плавных оттенках частоты часто равны.
STATISTIC_NONPEAKМедиана; если она крайняя среди различных значений, берётся соседнее различное.Подавить крайний локальный уровень.Это правило выбора, не распознавание ненужного «пика».
STATISTIC_GRADIENTМаксимум минус минимум.Карта локального размаха/перепадов.Шум и полезная граница оба увеличивают размах; это не горизонтальная производная.
STATISTIC_STANDARD_DEVIATIONКорень из среднего квадрата отклонений от среднего.Карта локального разброса.Не оценка качества и не детектор только шума.
STATISTIC_ROOT_MEAN_SQUAREКорень из среднего квадратов значений.Локальный квадратичный уровень.Это уровень, не разброс: постоянный ненулевой фон даёт ненулевой результат.
STATISTIC_CONTRASTТочный Core: abs((max−min)/(max+min)), с защитой нулевого знаменателя.Исследовать версионную реализацию отношения.В 7.1.1-46 нет ×QuantumRange: Q16-результат порядка 0..1 native-единицы в PNG8 практически чёрный. Не обещайте яркую нормированную карту.

Политика приложения: разрешённый type из whitelist, положительные нечётные width/height с пределом, например 1..31. Это наша проверка, не обещание ошибок Imagick. Обвязка передаёт signed int в native size_t; отрицательные размеры не передавайте. В проверенной сборке 0×0 действует как 1×1, even 2×2 принимается со смещением окна от −floor(width/2), unknown 9999 попадает в MEAN. Не используйте это как валидацию пользовательского ввода.

PHP Manual: PECL imagick ≥3.3.0; точный wrapper компилирует метод при ImageMagick ≥6.8.3. Базовые 8 констант регистрируются при версии >6.8.3; ROOT_MEAN_SQUARE — при ≥6.9.0; CONTRAST — при ≥7.0.12. На другом сервере набор может отличаться: defined('Imagick::STATISTIC_CONTRAST') и method_exists(Imagick::class, 'statisticImage') проверяют наличие константы/метода, не качество результата. Imagick::class здесь даёт строковое имя класса Imagick; это не создание объекта и не вызов фильтра.

Возврат и отказ

Тип bool: true при успехе; картинка остаётся в текущем Imagick. $ok = $image->statisticImage(...) сохранит флаг, не новый растр. В проверенной версии пустой объект даёт ImagickException; native-отказ PHP-обвязка также превращает в исключение. У statisticImage официальный блок ошибок пуст: это дополнение по исходнику и запуску. Чтение, ресурсы и запись могут отказать отдельно; true не означает художественное улучшение.

Фактические PNG: Сравнить медиану и среднее для импульсного шума
Фактические PNG: Сравнить медиану и среднее для импульсного шума
Сравнить медиану и среднее для импульсного шумаПример для указанного окружения
<?php
declare(strict_types=1);

require __DIR__ . '/localstats-fixture.php';
$source = loadLocalStatsSource();
$source->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$image = clone $source;
if (!$image->statisticImage(Imagick::STATISTIC_MEDIAN, 3, 3)) {
    throw new RuntimeException('Не удалось применить statisticImage');
}
$mean = clone $source;
if (!$mean->statisticImage(Imagick::STATISTIC_MEAN, 3, 3)) {
    throw new RuntimeException('Не удалось применить statisticImage');
}
saveLocalStatsComparison([$source, $image, $mean], 'localstats-statistic-median-mean.png');
$source->clear();
$image->clear();
$mean->clear();

Результат: Панели: исходник, MEDIAN 3×3, MEAN 3×3. Из восьми 128 и одного 255 медиана равна 128, математическое среднее 1279/9≈142.111; PNG8 квантует вычисленный результат. Медиана убирает изолированную точку, но способна стереть нужную однопиксельную линию. Среднее распределяет влияние выброса по соседям. Архив содержит example.php, localstats-fixture.php и source.png.b64. Распакуйте все три файла рядом, выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверяет SHA256 и восстанавливает точный source.png без интернета и шрифтов при запуске. PNG откройте обычным просмотрщиком. Первая панель — исходник, затем указанные варианты; размер 1200×320, каждая панель 400×320 без масштабирования. Напечатанные подписи описывают исходные данные и не пересчитываются фильтрами.

Ожидаемый вывод
localstats-statistic-median-mean.png

Когда требование меняется

Белый обозначает выбранное, чёрный — фон. MAXIMUM берёт самый светлый уровень окна: малая чёрная дырка внутри белого исчезает, но белая граница растёт. Сравниваем 3×3 и 5×5 от исходной маски.

MAXIMUM 3×3 и 5×5: малая дырка исчезает, белая область растёт
MAXIMUM 3×3 и 5×5: малая дырка исчезает, белая область растёт

Маска — непрозрачная чёрно-белая плашка, не alpha-канал. Обе операции берут независимые копии исходной маски: 5×5 не применяется поверх 3×3. COMPOSITE_OVER возвращает плашку в (268,246).

Закрыть малую чёрную дырку ценой расширения белой маскиПример для указанного окружения
<?php
declare(strict_types=1);

require __DIR__ . '/localstats-fixture.php';
$source = loadLocalStatsSource();
$source->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$image = clone $source;
$mask = clone $source;
$mask->cropImage(116, 64, 268, 246);
$mask->setImagePage(0, 0, 0, 0);
$mask->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$widerMask = clone $mask;
if (!$mask->statisticImage(Imagick::STATISTIC_MAXIMUM, 3, 3)) {
    throw new RuntimeException('Не удалось применить statisticImage');
}
if (!$widerMask->statisticImage(Imagick::STATISTIC_MAXIMUM, 5, 5)) {
    throw new RuntimeException('Не удалось применить statisticImage');
}
$wider = clone $source;
if (!$image->compositeImage($mask, Imagick::COMPOSITE_OVER, 268, 246) || !$wider->compositeImage($widerMask, Imagick::COMPOSITE_OVER, 268, 246)) {
    throw new RuntimeException('Не удалось вернуть маску');
}
$mask->clear();
$widerMask->clear();
saveLocalStatsComparison([$source, $image, $wider], 'localstats-statistic-mask.png');
$source->clear();
$image->clear();
$wider->clear();

Результат: Панели: исходник, MAXIMUM 3×3, MAXIMUM 5×5 только в плашке маски. Одиночная дырка заполнена, большие уменьшаются; белая площадь растёт, зазор может закрыться. Это локальное расширение, а не заполнение всех дыр по связности. Вне маски всё сохранено точно. Архив содержит example.php, localstats-fixture.php и source.png.b64. Распакуйте все три файла рядом, выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверяет SHA256 и восстанавливает точный source.png без интернета и шрифтов при запуске. PNG откройте обычным просмотрщиком. Первая панель — исходник, затем указанные варианты; размер 1200×320, каждая панель 400×320 без масштабирования. Напечатанные подписи описывают исходные данные и не пересчитываются фильтрами.

Ожидаемый вывод
localstats-statistic-mask.png

Потери, каналы и альтернативы

Не передавайте radius/sigma/channel в despeckle/enhance: таких PHP-параметров нет. У statistic канал задаёт обновляемые составляющие; в малом опыте CHANNEL_RED сохранил G/B, RGB-маска сохранила переменную alpha. Default median, despeckle и enhance изменили тестовую alpha-шахматку. Непрозрачный RGB-вход не доказывает сохранение прозрачного края, ICC/CMYK/HDR или многокадрового файла.

Импульсы, зерно, JPEG ringing и тонкие линии различаются задачей, но могут выглядеть похоже численно. Для сглаживания с допуском есть selective/adaptive фильтры, для обычного усреднения Gaussian blur. Исторические medianFilterImage/reduceNoiseImage deprecated с 3.4.4; их полный разбор относится к отдельным карточкам, здесь используется statisticImage.

Связанные методы: despeckleImage · enhanceImage.

Источники и обсуждения

Код и руководство с собой

Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.

Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.

Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.