【问题标题】:Image Recognition图像识别
【发布时间】:2010-09-13 15:55:41
【问题描述】:

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

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

【问题讨论】:

    标签: image image-processing pixel


    【解决方案1】:

    我研究了人工智能和计算机视觉,因此我非常了解该领域使用的工具类型。

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

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        简答:C++ 和 OpenCV

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

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

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

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

            【讨论】:

              【解决方案6】:

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

              它是我迄今为止使用的 easiest and simplest 图像库,可以扩展以执行您感兴趣的任何事情(例如,edge detection 在非常少的代码中)。

              【讨论】:

                【解决方案7】:

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

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

                【讨论】:

                  【解决方案8】:

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

                  【讨论】:

                    【解决方案9】:

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

                    【讨论】:

                      【解决方案10】:

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

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2013-10-28
                        • 2019-07-06
                        • 2017-04-18
                        • 1970-01-01
                        • 2016-08-10
                        • 2019-01-26
                        • 2016-09-14
                        • 2013-10-07
                        相关资源
                        最近更新 更多