2008-09-27 157 views
5

我想用计算机图像的基本知识做一些工作。我正在寻找一种方法来读取单个像素的数据,以编程方式分析它们,并改变它们。什么是最好的语言(Python,C++,Java ...)?什么是最好的文件格式?图像识别

我不想要任何超级花哨的软件/ API ......我在寻找最基本的基础知识。

回答

7

如果你需要速度(你可能总是想要图像处理速度),你一定要使用原始像素数据。 Java有一些真正的缺点,因为无法直接访问内存,与直接访问内存相比,像素访问速度很慢。 C++绝对是生产用图像处理的首选语言。但是,例如,您也可以使用C#,因为它允许在特定区域使用不安全的代码。 (看看bitmapdata类的scan0指针属性。) 我已经成功地将C#用于图像处理应用程序,它们肯定比它们的java对应程序快得多。 我不会为此目的使用任何脚本语言或Java。

0

简答题?我会说C++,与Python或Java相比,您在处理原始块的内存方面拥有更大的灵活性。

2

C/C++不仅会更快,而且您发现的大多数图像处理示例代码也将以C语言编写,因此将您找到的内容整合起来会更容易。

1

(这可能不适用于仅谁想要的裸基础知识OP - 但现在的速度问题被提出来了,我确实需要写这个,只是备案)

如果真的需要速度,最好忘记逐像素级别的工作,而是看看您需要执行的操作是否可以是vectorized。例如,对于您的C/C++代码,您可以使用优秀的Intel IPP library(不,我不适用于英特尔)。

1

如果你正在寻找在你的图像(思维矩阵)和你到Python的数值工作检查http://www.scipy.org/PyLab - 这基本上是在Python中做matlab的能力,我的伙伴发誓它。

4

对于使用高级语言(如Python)操纵像素信息的大型多维或复杂阵列来说,这是非常重要的。有一个名为PIL (the Python Imaging Library的库)非常有用,它可以让你执行一般的滤镜和转换(改变亮度,软化,去饱和,裁剪等),并操纵原始像素数据。

这是我使用过的日期为easiest and simplest的图像库,可以扩展以执行任何您感兴趣的操作(例如,很少代码中的edge detection)。

1

这取决于你想要做什么。

如果运行速度是你的问题,那么C++是最好的选择。

如果开发速度是一个问题,但我会建议看看java。你说你想要低级别的像素操作,java会为你做。但另一件可能成为问题的事情是处理各种文件格式。 Java确实有一些非常好的API来处理读写各种图像格式的文件(特别是java2d库)。你选择忽略更高级别的API)

如果你确实去了C++选项(或者python来考虑它),我会再次建议使用库来帮助你解决启动时阅读的问题和写文件。我以前曾经成功过libgd

1

你认识哪一种语言最好?对我来说,这是真正的问题。 如果你要花几个月时间学习一种特定的语言,那么使用Python或Java仅仅是为了他们(被证明)的开发速度没有真正的优势。 我特别精通C++,我认为对于这个特殊的任务,我可以像Java程序员那样快速。借助一些优秀的库(OpenCV),您可以根据几行C++代码创建任何需要的东西,真的。

1

简短的回答:C++和OpenCV

1

我研究人工智能和计算机视觉,所以我知道相当不错了在该领域中使用的工具种类。基本上:只要你知道如何在场景后面工作,你可以使用任何你想要的东西。

现在取决于你想要达到的,您可以使用什么:

  • C语言,但实现你的算法时,你会失去很多的时间在错误检查和内存管理。所以从理论上讲,这是做这种工作最快的语言,但如果你的算法在计算上不是很高效(在复杂性方面),或者如果你在错误检查中失去了太多时间,这显然是不值得的。所以我建议先用另一种语言实现你的应用程序,然后你可以随时使用C绑定来优化你的代码的一小部分。
  • Octave/MatLab:非常高效的语言,几乎和C一样多,你可以制作出非常优雅和简洁的算法。如果你正在进行矢量化,矩阵和线性操作,你应该去做。但是,您将无法使用此语言开发整个应用程序,它更侧重于算法,但随后您可以随后使用其他语言开发界面。
  • Python:一体化优雅且易于使用的语言,用于巨大规模的应用程序,例如Google和Facebook。您可以使用Python,任何类型的应用程序来完成您想要的任何事情。如果你想创建一个完整的应用程序(使用客户端交互和所有的算法),或者如果你想快速使用现有的库来绘制一个原型,那么它将会被完美地调整,因为Python有一大组高质量的库,比如OpenCV。但是,如果你只想制作算法,你最好使用Octave/MatLab。

被选为解决方案的答案是非常偏袒的,你应该小心这种古老的评论。如今,硬件比湿件(人类)便宜,因此,应该使用能够更快产生结果的语言,即使代价只有几个CPU周期或内存空间。另外,很多人往往会认为只要你用C/C++实现你的软件,你就会使速度达到圣格拉尔:这是不正确的。首先,因为算法的复杂性比你使用的语言更重要(即使用宇宙中最慢的语言来实现,算法不好也算不上更好的算法),其次,因为高级语言现在做的很多的缓存和速度优化,这可以使您的程序运行速度比C/C++更快。

当然,您可以随时在C/C++中完成上述所有内容,但您愿意浪费多少时间重新发明轮子?