Распознавание изображений - PullRequest
5 голосов
/ 27 сентября 2008

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

Я не хочу никаких необычных программ / API ... Я ищу простые основы.

Ответы [ 10 ]

7 голосов
/ 27 сентября 2008

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

4 голосов
/ 27 сентября 2008

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

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

2 голосов
/ 27 сентября 2008

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

1 голос
/ 29 октября 2012

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

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

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

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

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

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

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

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

1 голос
/ 22 сентября 2010

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

1 голос
/ 09 ноября 2008

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

1 голос
/ 27 сентября 2008

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

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

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

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

1 голос
/ 27 сентября 2008

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

1 голос
/ 27 сентября 2008

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

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

0 голосов
/ 27 сентября 2008

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

...