Comments 34
И пусть после этого хоть кто-то скажет что среди РНР программистов одна школота…
+29
Точно школота, потому как imagecopyresampled именно для этого и существует.
Я вот не понимаю, зачем интерпретатор так мучить циклами с вычислениями?! Писал бы на компиляторе — ни слова бы не возразил, но на пхп такие вещи делать — просто кощунство.
Автор, если не сложно, покажи время работы скрипта — очень любопытно.
Я вот не понимаю, зачем интерпретатор так мучить циклами с вычислениями?! Писал бы на компиляторе — ни слова бы не возразил, но на пхп такие вещи делать — просто кощунство.
Автор, если не сложно, покажи время работы скрипта — очень любопытно.
-8
Вообще-то суть скрипта (как я понял) не только в увеличении картинки, а именно в реализации конкретного алгоритма.
+1
На самом деле PHP уже давно байткод интерпретатор. Для конкретной задачи производительности хватало, с учетом кеширования. Почему без встроенных функций GD и Imagick написал ниже. habrahabr.ru/blogs/php/111402/#comment_3553499
+2
По времени работы: на домашнем компьютере 2 Мпикс картинка генерируется чуть менее 5 секунд.
+2
Все же интересно, картинку каких замеров мы видим?
0
А почему не Labview?
+1
В том семестре в курсе моделирования тоже делал интерполяцию на PHP. И вообще, уже вошло в обиход разовые бытовые задачки делать на нем, а также набросочные. Т.к. быстро и удобно можно получить результат, не заморачиваясь на внешний вид
0
Круто, здорово, зачем?
-5
это здорово
наверное весь день потратили
но ещё есть куда расти :)
наверное весь день потратили
но ещё есть куда расти :)
$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');
+5
Подобный вариант рассматривался, но этот же массив данных использовался еще для построения карт изолиний. Не спорю, что можно было бы реализовать попиксельное преобразование результата Imagic'а, но любопытство взяло верх.
+1
изолинии можно получить из этой карты :)
кстати сейчас заметил что говнокодец в функции toColorString был съеден хаброй, причём мощно выжрал, хотя я уже понял почему,damit,habrahabr!
если нужен рабочий вариант-в ЛС
я к тому что если бы этот код был хоть капельку сложен я бы не стал его писать(лень), а вы потратили кучу времени на радостные велики :)
кстати сейчас заметил что говнокодец в функции toColorString был съеден хаброй, причём мощно выжрал, хотя я уже понял почему,damit,habrahabr!
если нужен рабочий вариант-в ЛС
я к тому что если бы этот код был хоть капельку сложен я бы не стал его писать(лень), а вы потратили кучу времени на радостные велики :)
0
Если не сложно не могли бы поделиться алгоритмом получения изолиний из готового изображения? Пробовал поиском граничных точек, сначала делал выборку по вертикали, потом по горизонтали, получалась довольно замыленная линия, требующая постпроцессинга для сглаживания. Сам в последствии выбрал и реализовал классический алгоритм: с помощью вышеуказанного алгоритма вычислял узловые точки с шагом примерно 5 пикселей, потом находил ребра с пересечениями и достраивал линии с помощью билинейной интерполяции.
0
Где же вы были, когда я месяц назад лабораторную писал =) Хотя там довелось еще реализовать и бикубический эрмитов сплайн. Однако, когда это все заработало да еще и изображение позумило — радости было немерено.
0
А у вас вроде не совсем честная интерполяция. При интерполяции кубическими сплайнами там накладывается условие на непрерывность самой функции, её первой и второй производной. У вас получается, что функция непрерывна, а также её первая производная. А по второй производной непрерывности нет, по-моему.
+3
когда идёт речь об обработке экспериментальных данных, каких-то результатов замеров. Используют методы аппроксимации. Иначе одно ошибочное, случайное измерение и результат будет неожиданным.
0
Отчасти согласен, однако и этот подход не лишен недостатков. Аппроксимация бессмысленна, если точки слабо влияют друг на друга или не влияют вовсе, если существуют локальные пики, которые может сгладить аппроксимация. Для более точного расчета, например, распределения химических веществ в природных средах строится модель для каждого вещества, с учетом метеопараметров, параметров рельефа и специфики заданного вещества. В онлайне такие вещи не считаются, потому что даже на очень мощных компьютерах сколь-нибудь достоверная модель может рассчитываться несколько минут и даже часов (в зависимости от площади территории). Для визуализации регулярных отчетов, данные по которым проверяют специалисты в ручную — может сгодиться и интерполяция.
0
Извините, я ошибаюсь, или все-таки можно в функции createColormap все сделать в одном цикле?
0
Я только не понял, неужто бикубическую интерполяцию нужно писать САМОМУ да еще и на PHP 0_o? Неужто нет готовой математической библиотеки? Или почему не использовать ресайз картинки из ImageMagick? Там вроде есть фильтр с бикубической интерполяцией?
0
>Я только не понял, неужто бикубическую интерполяцию нужно писать САМОМУ да еще и на PHP
Ответ очевиден: автор просто не знает других языков.
Ответ очевиден: автор просто не знает других языков.
-5
Хех ну ваша статья на 90% состоит из перевода этой статьи www.paulinternet.nl/?page=bicubic (вы на нее в начале ссылку дали), даже картинки не перезалили + практически «дословный» порт кода из статьи с Java на PHP.
Единственное что от себя добавили — практическое применение (на мой взгляд довольно страшненькое). Слабовато как то…
Единственное что от себя добавили — практическое применение (на мой взгляд довольно страшненькое). Слабовато как то…
+1
Как вы заметили я указал ссылку на первоисточник и сразу уточнил, что здесь будет разбор статьи и ни слова не сказано о том, что алгоритм был реализован с нуля. Теоретическая часть статьи введена для тех, кому интересна работа самого алгоритма. К сожалению, русскоязычного подробного описания реализации данного алгоритма я не нашел, поэтому за основу был взят вышеуказанный материал, от себя прокомментировав важные, как мне показалось, моменты. Практическую реализацию подготовил специально для публикации, стараясь обеспечить легкость чтения кода. Если вы считаете, что приведенный пример можно существенно улучшить, то поделитесь, я к обоснованной критике всегда относился с уважением.
0
OMG. Неужели вы не знаете, что бикубическая интерполяция — это кубическая интерполяция по одной переменной, после которой следует кубическая интерполяция по другой переменной. Аналогично для трикубической нтерполяции. И никакие матрицы 4x4 не нужны.
0
Код «вырвиглаз», хоть и причёсан. Интересно, автор — сколько понадобилось времени его сделать + отловить непроизвольные ошибки?
0
А в чем «вырвиглазность»? Хотя должен признать — сам пример специфичен, работа с матрицей 4х4 не очень хорошо воспринимается взглядом. Код примера был написан и отлажен примерно за час-полтора, вычислительные функции хранились давно, все «подводные камни», например, необходимость экстраполяции на 1 шаг по краям, были известны до этого.
0
Sign up to leave a comment.
Бикубическая интерполяция, теория и практическая реализация