你提出的问题在原则上是可能的——理论上,具有足够多隐藏单元的人工神经网络可以学习任意函数以将输入映射到输出。然而,正如评论和其他答案所提到的,你的具体问题可能存在许多技术问题,这可能使它不实用。我将这些问题归类为(a) 映射复杂性,(b) 模型复杂性,(c) 缩放复杂性和(d) 实现复杂性。它们都有一定的关联,但希望这是一个有用的方式来分解问题。
映射复杂性
正如Springfield762所提到的,有许多可能将一个图像映射到另一个图像的函数。如果你的输入图像和输出图像之间的关系相对简单——比如每个像素的强度增加一个常量值——那么人工神经网络就能够很容易地学习这个映射。可能还有许多其他变换也同样容易学习,例如扭曲、翻转、旋转或平移图像——基本上任何仿射变换都很容易学习。其他非线性变换也可能可行,例如对每个像素的强度进行平方。
总的来说,输入和输出图像之间的关系越复杂,就越难让模型为你学习这个映射。
模型复杂性
从输入到输出的映射越复杂,你的人工神经网络模型就越复杂才能够捕捉到这种映射。过去10年中,已经证明具有许多隐藏层的模型在以前被认为是不可能完成的任务上表现得非常好,但通常这些最先进的模型有数百万甚至数十亿个参数,并且需要在GPU硬件上训练数周。一个简单的模型可以捕捉许多简单的映射,但如果你有一个复杂的输入输出映射要学习,你将需要一个大而复杂的模型。
缩放复杂性
Yves在评论中提到,将模型扩展到典型的图像大小可能很困难。如果你的图像相对较小(目前的技术水平是对100x100像素左右的图像进行建模),那么你可能只需要将一堆原始像素数据投入到人工神经网络模型中,然后看看会发生什么。但如果你使用来自你闪亮的尼康数码单反相机的6000x4000像素的图像,处理这些图像将会非常困难。你最好压缩你的图像数据(PCA是一种常见的技术),然后试图在压缩空间中学习映射。
此外,较大的图像将具有更多可能的映射空间,因此你需要更多的较大图像作为训练数据,而不是如果你有小图像时所需的那么少。
Springfield762还提到了这一点:如果输入和输出图像之间的映射很简单,那么你只需要几个例子就可以成功地学习映射。但是,如果你有一个复杂的映射,那么你需要更多的训练数据才有机会正确地学习映射。
实现复杂性
很少有工具可以让您只需将图像数据投入 ANN 模型中就能得到一个映射。最起码,您需要编写一些代码来预处理图像数据。此外,如果您有大量的大型图像,您可能需要编写代码来处理从磁盘加载数据等操作。(虽然有很多用于此类问题的“大数据”工具,但都需要一定的设置工作)
现在有很多开源的 ANN 工具包。FANN(已经提到过)是 C++ 中的一个流行工具,并带有其他语言的绑定。 Caffe 也很受欢迎,同样是使用 C++ 实现并带有绑定。似乎有很多工具包使用 Python 和 Theano 或其他 GPU 加速库 - Keras、Lasagne、Hebel、Pylearn2、neon 和 Theanets(我写的)。许多人使用 Lua 编写的 Torch。Matlab 至少有一个神经网络工具箱。我对其他生态系统不太熟悉,但 Java 似乎有 Deeplearning4j,C# 有 Accord,甚至 R 也有 darch。
但是,使用这些神经网络工具包,您仍然需要编写一些代码来加载数据,将其处理为适当的输入格式,构建(或加载)网络模型,训练模型等操作。