Вопрос

Я бы хотел немного поработать с деталями компьютерной визуализации.Я ищу способ считывать отдельные пиксели данных, анализировать их программно и изменять.Какой язык лучше всего использовать для этого (Python, c ++, Java ...)?Какой формат файла лучше всего использовать?

Мне не нужно никакого супер навороченного программного обеспечения / API...Я ищу самые элементарные вещи.

Это было полезно?

Решение

Если вам нужна скорость (вероятно, вы всегда будете стремиться к скорости при обработке изображений), вам определенно придется работать с необработанными пиксельными данными.Java имеет некоторые реальные недостатки, поскольку вы не можете получить прямой доступ к памяти, что делает доступ к пикселям довольно медленным по сравнению с прямым доступом к памяти.C ++, безусловно, является предпочтительным языком для обработки изображений в производственных целях.Но вы можете, например, также использовать C #, поскольку он допускает небезопасный код в определенных областях.(Взгляните на свойство указателя scan0 класса bitmapdata .) Я успешно использовал C # для приложений обработки изображений, и они определенно намного быстрее своих аналогов на Java.Я бы не стал использовать какой-либо язык сценариев или java для такой цели.

Другие советы

Очень просто манипулировать большими многомерными или сложными массивами пиксельной информации, представляющими собой изображения, используя языки высокого уровня, такие как Питон.Там есть библиотека под названием PIL (библиотека изображений Python) это весьма полезно и позволит вам выполнять общие фильтры и преобразования (изменять яркость, смягчать, обесцвечивать, обрезать и т.д.), А также манипулировать необработанными пиксельными данными.

Это тот самый самый легкий и незатейливый библиотека изображений, которой я пользовался на сегодняшний день, может быть расширена для выполнения всего, что вас интересует (обнаружение границ например, в очень небольшом количестве кода).

Мало того, что C / C ++ будет быстрее, но и большая часть кода для обработки изображений, который вы найдете там, также будет на C, так что вам будет легче интегрировать найденные элементы.

если вы хотите численно поработать над своими изображениями (например, matrix) и вам нравится Python, ознакомьтесь http://www.scipy.org/PyLab - по сути, это возможность создавать matlab на python, мой приятель клянется этим.

(Возможно, это неприменимо к оператору, который хотел знать только основы - но теперь, когда был поднят вопрос о скорости, мне действительно нужно написать это, просто для протокола.)

Если вы в самом деле нужна скорость, лучше забыть о работе на попиксельном уровне и лучше посмотреть, могут ли операции, которые вам нужно выполнить, быть векторизованный.Например, для вашего кода на C / C ++ вы могли бы использовать отличный Библиотека Intel IPP (нет, я не работаю на Intel).

Это немного зависит от того, что вы пытаетесь сделать.

Если ваша проблема заключается в скорости выполнения, то c ++ - лучший способ.

Однако, если скорость разработки является проблемой, я бы предложил обратить внимание на java.Вы сказали, что вам нужны низкоуровневые манипуляции с пикселями, которые java сделает за вас.Но другая вещь, которая может быть проблемой, - это обработка различных форматов файлов.В Java действительно есть несколько очень хороших API для работы с чтением и записью различных форматов изображений в файл (в частности, библиотека java2d.Вы предпочитаете игнорировать более высокие уровни API)

Если вы выберете вариант c ++ (или python, если подумать) Я бы снова предложил использовать библиотеку, которая поможет вам решить проблемы с чтением и записью файлов при запуске.Ранее я добивался успеха с libgd

Какой язык вы знаете лучше всего?Для меня это настоящий вопрос.Если вы собираетесь тратить месяцы на изучение одного конкретного языка, то нет никакого реального преимущества в использовании Python или Java только из-за их (подлежащей проверке) скорости разработки.Я особенно хорошо разбираюсь в C ++ и думаю, что для решения этой конкретной задачи я могу быть таким же быстрым, как, например, Java-программист.На самом деле, с помощью какой-нибудь хорошей библиотеки (на ум приходит OpenCV) вы можете создать все, что вам нужно, всего за пару строк кода на C ++.

Краткий ответ:C ++ и OpenCV

Я изучал искусственный интеллект и Компьютерное зрение, поэтому довольно хорошо знаю, какие инструменты используются в этой области.

В основном:вы можете использовать все, что захотите, если знаете, как это работает за сценой.

Теперь, в зависимости от того, чего вы хотите достичь, вы можете либо использовать:

  • Язык C, но вы потеряете много времени на проверку ошибок и управление памятью при реализации ваших алгоритмов.Таким образом, теоретически, это самый быстрый язык для выполнения такого рода работ, но если ваши алгоритмы не являются вычислительно эффективными (с точки зрения сложности) или если вы теряете слишком много времени на проверку ошибок, это явно не стоит того.Поэтому я бы посоветовал сначала реализовать ваше приложение на другом языке, а затем вы всегда сможете оптимизировать небольшие части своего кода с помощью привязок C.
  • Октава/MatLab:очень эффективный язык, почти такой же, как C, и вы можете создавать очень элегантные и лаконичные алгоритмы.Если вы увлекаетесь векторизацией, матричными и линейными операциями, вам следует придерживаться этого.Однако вы не сможете разработать целое приложение на этом языке, оно больше ориентировано на алгоритмы, но позже вы всегда сможете разработать интерфейс, используя другой язык.
  • Питон:элегантный и доступный язык "все в одном", используемый в гигантски масштабируемых приложениях, таких как Google и Facebook.Вы можете делать практически все, что захотите, с помощью Python, любого приложения.Он будет идеально адаптирован, если вы хотите создать полноценное приложение (с взаимодействием с клиентом и всеми, а не только алгоритмами), или если вы хотите быстро создать прототип с использованием существующих библиотек, поскольку Python имеет очень большой набор высококачественных библиотек, таких как OpenCV.Однако, если вы хотите создавать только алгоритмы, вам лучше использовать Octave / MatLab.

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

В настоящее время аппаратное обеспечение дешевле программного обеспечения (людей), и поэтому вам следует использовать языки, на которых вы сможете быстрее получать результаты, даже если это будет стоить нескольких циклов процессора или места в памяти.

Кроме того, многие люди склонны думать, что до тех пор, пока вы реализуете свое программное обеспечение на C / C ++, вы создаете Святой Грааль скорости:это просто неправда.Во-первых, потому что сложность алгоритмов имеет гораздо большее значение, чем язык, который вы используете (плохой алгоритм никогда не превзойдет лучший алгоритм, даже если реализован на самом медленном языке во вселенной), а во-вторых, потому что языки высокого уровня в настоящее время выполняют за вас большую часть кэширования и оптимизации скорости, и это может заставить вашу программу работать даже быстрее, чем на C / C ++.

Конечно, вы всегда можете сделать все вышеперечисленное на C / C ++, но сколько своего времени вы готовы потратить впустую, чтобы заново изобрести велосипед?

Короткий ответ?Я бы сказал, что на C ++ у вас гораздо больше гибкости в манипулировании необработанными фрагментами памяти, чем на Python или Java.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top