5

我想做一些与计算机成像有关的工作。我正在寻找一种方法来读取数据的单个像素,以编程方式分析它们并更改它们。什么是最好的语言(Python、c++、Java...)?最好的文件格式是什么?

我不想要任何超级花哨的软件/API……我正在寻找最基本的东西。

4

10 回答 10

7

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

于 2008-09-27T03:58:51.863 回答
4

使用Python等高级语言来操作大型多维或复杂的像素信息数组是非常东方的。有一个名为PIL(Python Imaging Library)的库非常有用,它可以让您进行一般的过滤器和转换(更改亮度、柔化、去饱和度、裁剪等)以及操作原始像素数据。

它是我迄今为止使用过的最简单和最简单的图像库,并且可以扩展为您感兴趣的任何事情(例如,在非常少的代码中进行边缘检测)。

于 2008-09-27T04:35:59.963 回答
3

我学习了人工智能和计算机视觉,因此我非常了解该领域使用的那种工具。

基本上:只要你知道它在幕后是如何工作的,你就可以使用任何你想要的东西。

现在根据您想要实现的目标,您可以使用:

  • C 语言,但是在实现算法时,您将在错误检查和内存管理上浪费大量时间。所以从理论上讲,这是完成这类工作的最快语言,但如果你的算法在计算上不高效(就复杂性而言)或者如果你在错误检查上浪费了太多时间,这显然是不值得的。所以我建议首先用另一种语言实现你的应用程序,然后你总是可以用 C 绑定优化你的代码的一小部分。
  • Octave/MatLab:非常高效的语言,几乎和 C 一样多,你可以做出非常优雅和简洁的算法。如果你喜欢矢量化、矩阵和线性运算,你应该这样做。但是,您将无法使用这种语言开发整个应用程序,它更专注于算法,但是您以后总是可以使用另一种语言开发界面。
  • Python:多合一优雅且易于使用的语言,用于谷歌和 Facebook 等大规模应用程序。你几乎可以用 Python 做任何你想做的事情,任何类型的应用程序。如果您想制作一个完整的应用程序(与客户端交互和所有,而不仅仅是算法),或者如果您想使用现有库快速起草原型,它将完美适应,因为 Python 有大量高质量的库,例如开放式简历。但是,如果您只想制作算法,则最好使用 Octave/MatLab。

被选为解决方案的答案非常偏颇,您应该小心这种过时的评论。

如今,硬件比湿件(人类)便宜,因此,您应该使用能够更快产生结果的语言,即使它以几个 CPU 周期或内存空间为代价。

此外,很多人倾向于认为,只要你用 C/C++ 实现你的软件,你就是在创造速度的圣杯:这不是真的。首先,因为算法的复杂性比你使用的语言更重要(一个糟糕的算法永远不会打败一个更好的算法,即使是用宇宙中最慢的语言实现),其次是因为现在高级语言做了很多事情为您提供缓存和速度优化,这可以使您的程序运行得比在 C/C++ 中更快。

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

于 2012-10-29T16:11:07.987 回答
2

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

于 2008-09-27T04:03:52.040 回答
1

(这可能不适用于只想要基本知识的 OP——但既然提出了速度问题,我确实需要写这个,只是为了记录。)

如果您真的需要速度,最好忘记在逐像素级别上工作,而是看看您需要执行的操作是否可以矢量化。例如,对于您的 C/C++ 代码,您可以使用出色的英特尔 IPP 库(不,我不为英特尔工作)。

于 2008-09-27T04:13:15.153 回答
1

如果您正在寻找图像上的数值工作(想想矩阵)并且您进入 Python,请查看http://www.scipy.org/PyLab - 这基本上是在 python 中执行 matlab 的能力,我的朋友对此发誓。

于 2008-09-27T04:14:59.750 回答
1

这在一定程度上取决于你想要做什么。

如果运行时速度是您的问题,那么 c++ 是最好的方法。

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

如果您确实选择了 c++ 选项(或者想到了 python),我会再次建议使用库来帮助您解决读取和写入文件的启动问题。我以前在libgd上取得过成功

于 2008-09-27T04:44:42.127 回答
1

你最懂什么语言?对我来说,这是真正的问题。如果您要花费数月和数月的时间来学习一种特定的语言,那么使用 Python 或 Java 并没有真正的优势,只是因为它们(有待证明)的开发速度。我特别精通 C++,例如,我认为对于这个特定的任务,我可以像 Java 程序员一样快速。借助一些好的库(想到 OpenCV),您可以在几行 C++ 代码中创建任何您需要的东西,真的。

于 2008-11-09T00:26:28.920 回答
1

简短回答:C++ 和 OpenCV

于 2010-09-22T19:16:12.363 回答
0

简短的回答?我会说 C++,你在处理原始内存块方面比 Python 或 Java 更灵活。

于 2008-09-27T03:51:24.050 回答