Как стать автором
Обновить

Комментарии 34

И пусть после этого хоть кто-то скажет что среди РНР программистов одна школота…
Точно школота, потому как imagecopyresampled именно для этого и существует.
Я вот не понимаю, зачем интерпретатор так мучить циклами с вычислениями?! Писал бы на компиляторе — ни слова бы не возразил, но на пхп такие вещи делать — просто кощунство.

Автор, если не сложно, покажи время работы скрипта — очень любопытно.
Вообще-то суть скрипта (как я понял) не только в увеличении картинки, а именно в реализации конкретного алгоритма.
На самом деле PHP уже давно байткод интерпретатор. Для конкретной задачи производительности хватало, с учетом кеширования. Почему без встроенных функций GD и Imagick написал ниже. habrahabr.ru/blogs/php/111402/#comment_3553499
По времени работы: на домашнем компьютере 2 Мпикс картинка генерируется чуть менее 5 секунд.
Все же интересно, картинку каких замеров мы видим?
В данном примере — случайные данные, в рабочем приложении использовалось для изображения карт рассеивания и распределения веществ в разных природных средах.
А почему не Labview?
Требовалось построение в реальном времени, с сайта. Проект был полностью готов, в него добавили только карты рассеивания и построение изолиний. Производительность вполне устраивала, результаты кешировались.
В том семестре в курсе моделирования тоже делал интерполяцию на PHP. И вообще, уже вошло в обиход разовые бытовые задачки делать на нем, а также набросочные. Т.к. быстро и удобно можно получить результат, не заморачиваясь на внешний вид
о_О, Вы называете это быстро?
Попробуйте Python, правда.
Круто, здорово, зачем?
это здорово
наверное весь день потратили
но ещё есть куда расти :)

$simpleData = array(
    array(0, 0.1, 0.15, 0.2, 0.15, 0.1, 0),
    array(0, 0.1, 0.5, 1, 0.9, 0.1, 0),
    array(0, 0.1, 0.7, 1, 0.9, 0.1, 0),
    array(0, 0.1, 0.6, 0.7, 0.5, 0.1, 0),
    array(0, 0.2, 0.8, 0.6, 0.15, 0.08, 0.1),
    array(0.08, 0.2, 0.15, 0.2, 0.15, 0.1, 0.1),
    array(0.1, 0.8, 0.1, 0.1, 0.1, 0, 0)
);

$image = new imagick();
$image->newImage(7,7,'black');
$draw = new ImagickDraw();

function toColorString($height)
{
        $height*=1000;
        if($heightsetColorValue(imagick::COLOR_GREEN,$c);
                $draw->setFillColor($pixel);
                $draw->point($x,$y);
        }
}

$image->drawImage($draw);
$image->setImageInterpolateMethod(imagick::INTERPOLATE_BICUBIC);
$image->resizeImage(300,300,0,1);
$iterator = $image->getPixelIterator();
foreach($iterator as $y=>$pixels)
{
        foreach($pixels as $x=>$pixel)
        {
                $pixel->setColor( toColorString($pixel->getColorValue(imagick::COLOR_GREEN)) );
        }
        $iterator->syncIterator();
}

$image->writeImage('out.png');
Подобный вариант рассматривался, но этот же массив данных использовался еще для построения карт изолиний. Не спорю, что можно было бы реализовать попиксельное преобразование результата Imagic'а, но любопытство взяло верх.
изолинии можно получить из этой карты :)
кстати сейчас заметил что говнокодец в функции toColorString был съеден хаброй, причём мощно выжрал, хотя я уже понял почему,damit,habrahabr!
если нужен рабочий вариант-в ЛС
я к тому что если бы этот код был хоть капельку сложен я бы не стал его писать(лень), а вы потратили кучу времени на радостные велики :)
Если не сложно не могли бы поделиться алгоритмом получения изолиний из готового изображения? Пробовал поиском граничных точек, сначала делал выборку по вертикали, потом по горизонтали, получалась довольно замыленная линия, требующая постпроцессинга для сглаживания. Сам в последствии выбрал и реализовал классический алгоритм: с помощью вышеуказанного алгоритма вычислял узловые точки с шагом примерно 5 пикселей, потом находил ребра с пересечениями и достраивал линии с помощью билинейной интерполяции.
НЛО прилетело и опубликовало эту надпись здесь
Где же вы были, когда я месяц назад лабораторную писал =) Хотя там довелось еще реализовать и бикубический эрмитов сплайн. Однако, когда это все заработало да еще и изображение позумило — радости было немерено.
А у вас вроде не совсем честная интерполяция. При интерполяции кубическими сплайнами там накладывается условие на непрерывность самой функции, её первой и второй производной. У вас получается, что функция непрерывна, а также её первая производная. А по второй производной непрерывности нет, по-моему.
Да, гладкость бикубической интерполяции на самом деле ниже чем у кубической. Непрерывность второй производной не обеспечивается. Обеспечивается непрерывность первых частных производных и смешанной частной производной.
когда идёт речь об обработке экспериментальных данных, каких-то результатов замеров. Используют методы аппроксимации. Иначе одно ошибочное, случайное измерение и результат будет неожиданным.
Отчасти согласен, однако и этот подход не лишен недостатков. Аппроксимация бессмысленна, если точки слабо влияют друг на друга или не влияют вовсе, если существуют локальные пики, которые может сгладить аппроксимация. Для более точного расчета, например, распределения химических веществ в природных средах строится модель для каждого вещества, с учетом метеопараметров, параметров рельефа и специфики заданного вещества. В онлайне такие вещи не считаются, потому что даже на очень мощных компьютерах сколь-нибудь достоверная модель может рассчитываться несколько минут и даже часов (в зависимости от площади территории). Для визуализации регулярных отчетов, данные по которым проверяют специалисты в ручную — может сгодиться и интерполяция.
Извините, я ошибаюсь, или все-таки можно в функции createColormap все сделать в одном цикле?
4 цикла исключительно для наглядности реализации цветовых переходов. Еще одна особенность: когда я делал полупрозрачную палитру, для каждого цвета выставлял немного различающиеся значения для альфа-канала, для улучшения восприятия градиента.
Я только не понял, неужто бикубическую интерполяцию нужно писать САМОМУ да еще и на PHP 0_o? Неужто нет готовой математической библиотеки? Или почему не использовать ресайз картинки из ImageMagick? Там вроде есть фильтр с бикубической интерполяцией?
>Я только не понял, неужто бикубическую интерполяцию нужно писать САМОМУ да еще и на PHP
Ответ очевиден: автор просто не знает других языков.
Хех ну ваша статья на 90% состоит из перевода этой статьи www.paulinternet.nl/?page=bicubic (вы на нее в начале ссылку дали), даже картинки не перезалили + практически «дословный» порт кода из статьи с Java на PHP.

Единственное что от себя добавили — практическое применение (на мой взгляд довольно страшненькое). Слабовато как то…
Как вы заметили я указал ссылку на первоисточник и сразу уточнил, что здесь будет разбор статьи и ни слова не сказано о том, что алгоритм был реализован с нуля. Теоретическая часть статьи введена для тех, кому интересна работа самого алгоритма. К сожалению, русскоязычного подробного описания реализации данного алгоритма я не нашел, поэтому за основу был взят вышеуказанный материал, от себя прокомментировав важные, как мне показалось, моменты. Практическую реализацию подготовил специально для публикации, стараясь обеспечить легкость чтения кода. Если вы считаете, что приведенный пример можно существенно улучшить, то поделитесь, я к обоснованной критике всегда относился с уважением.
OMG. Неужели вы не знаете, что бикубическая интерполяция — это кубическая интерполяция по одной переменной, после которой следует кубическая интерполяция по другой переменной. Аналогично для трикубической нтерполяции. И никакие матрицы 4x4 не нужны.
Вы невнимательно прочитали. В статье описаны оба подхода. Коэффициенты, нужны для оптимизации расчетов, например, Если у вас шаг сетки 100 пикселей, то решением «в лоб» придется выполнить примерно в 10 000 раз больше операций.
Код «вырвиглаз», хоть и причёсан. Интересно, автор — сколько понадобилось времени его сделать + отловить непроизвольные ошибки?
А в чем «вырвиглазность»? Хотя должен признать — сам пример специфичен, работа с матрицей 4х4 не очень хорошо воспринимается взглядом. Код примера был написан и отлажен примерно за час-полтора, вычислительные функции хранились давно, все «подводные камни», например, необходимость экстраполяции на 1 шаг по краям, были известны до этого.
Вырвиглавность именно в количестве символов/слов/понятности в строке, слабо ассоциирующемся с нормальным пониманием кода. Просто я мало видел тиках задач на PHP. Cool, enjoy your work, bro!
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории