【发布时间】:2010-09-13 15:55:41
【问题描述】:
我想做一些与计算机成像有关的工作。我正在寻找一种方法来读取数据的单个像素,以编程方式分析它们并更改它们。最好的语言是什么(Python、c++、Java...)?最好的文件格式是什么?
我不想要任何超级花哨的软件/API...我正在寻找最基本的东西。
【问题讨论】:
标签: image image-processing pixel
我想做一些与计算机成像有关的工作。我正在寻找一种方法来读取数据的单个像素,以编程方式分析它们并更改它们。最好的语言是什么(Python、c++、Java...)?最好的文件格式是什么?
我不想要任何超级花哨的软件/API...我正在寻找最基本的东西。
【问题讨论】:
标签: image image-processing pixel
我研究了人工智能和计算机视觉,因此我非常了解该领域使用的工具类型。
基本上:你可以使用任何你想要的东西,只要你知道它是如何在幕后工作的。
现在根据您想要实现的目标,您可以使用:
被选为解决方案的答案非常偏颇,这种过时的评论你要小心。
如今,硬件比湿件(人类)便宜,因此,您应该使用能够更快产生结果的语言,即使它以几个 CPU 周期或内存空间为代价。
另外,很多人倾向于认为,只要你用 C/C++ 实现你的软件,你就是在创造速度的圣杯:这是不正确的。首先,因为算法的复杂性比你使用的语言更重要(一个糟糕的算法永远不会打败一个更好的算法,即使是用宇宙中最慢的语言实现),其次是因为现在高级语言做了很多事情为您提供缓存和速度优化,这可以使您的程序运行得比在 C/C++ 中更快。
当然,您总是可以在 C/C++ 中完成上述所有操作,但是您愿意浪费多少时间来重新发明轮子?
【讨论】:
如果您需要速度(您可能总是需要图像处理的速度),您肯定必须使用原始像素数据。 Java 有一些真正的缺点,因为您不能直接访问内存,这使得像素访问与直接访问内存相比非常慢。 C++ 绝对是生产使用图像处理的首选语言。但是,例如,您也可以使用 C#,因为它允许在特定区域使用不安全的代码。 (看看 bitmapdata 类的 scan0 指针属性。) 我已经成功地将 C# 用于图像处理应用程序,它们肯定比它们的 java 对应物快得多。 我不会为此目的使用任何脚本语言或 java。
【讨论】:
简答:C++ 和 OpenCV
【讨论】:
你最懂什么语言?对我来说,这是真正的问题。 如果您要花费数月和数月的时间学习一种特定的语言,那么使用 Python 或 Java 并没有真正的优势,只是因为它们(有待证明)的开发速度。 我特别精通 C++,例如,我认为对于这个特定的任务,我可以像 Java 程序员一样快速。借助一些好的库(想到 OpenCV),您可以在几行 C++ 代码中创建您需要的任何东西,真的。
【讨论】:
这在一定程度上取决于你想要做什么。
如果运行速度是您的问题,那么 c++ 是最好的选择。
但是,如果开发速度是一个问题,我会建议查看 java.lang.您说您想要对像素进行低级操作,java 将为您完成。但另一件事可能是一个问题是各种文件格式的处理。 Java 确实有一些非常好的 API 来处理读取和写入各种图像格式到文件(特别是 java2d 库。您选择忽略更高级别的 API)
如果您确实选择了 c++ 选项(或者想到了 python),我再次建议使用库来帮助您解决读取和写入文件的启动问题。我以前在libgd 上取得过成功
【讨论】:
使用高级语言(如 Python)来处理大型多维或复杂的像素信息数组(即图片)是非常东方的做法。有一个名为 PIL (the Python Imaging Library) 的库非常有用,它可以让您进行常规滤镜和转换(更改亮度、柔化、去饱和度、裁剪等)以及处理原始像素数据。
它是我迄今为止使用的 easiest and simplest 图像库,可以扩展以执行您感兴趣的任何事情(例如,edge detection 在非常少的代码中)。
【讨论】:
(这可能不适用于只想要基本基础的 OP ——但既然提出了速度问题,我确实需要写这个,只是为了记录。)
如果您真的需要速度,最好忘记逐像素级别的工作,而是看看您需要执行的操作是否可以是vectorized。例如,对于您的 C/C++ 代码,您可以使用出色的 Intel IPP library(不,我不为英特尔工作)。
【讨论】:
如果您希望对图像进行数值处理(想想矩阵)并且您使用 Python,请查看 http://www.scipy.org/PyLab - 这基本上是在 python 中执行 matlab 的能力,我的朋友对此发誓。
【讨论】:
C/C++ 不仅会更快,而且您发现的大多数图像处理示例代码也将使用 C 语言,因此更容易合并您找到的内容。
【讨论】:
简短回答?我会说 C++,你在处理原始内存块方面比 Python 或 Java 更灵活。
【讨论】: