有人认为恢复模糊的图像是不可能的,因为会丢失信息。但我对这个问题进行了很多思考,并认为如果输出图像的大小与输入图像的大小相同,那实际上是可能的!这样,输出就有足够的像素/信息来恢复原始像素/信息。
首先,解释一下什么是卷积以及如何使用卷积来模糊图像,以及它如何使用模糊的图像。卷积是一种数学运算,当应用于图像时,可以将其视为应用于它的过滤器。
在这个动画中,我们可以看到一个图像与过滤器/内核卷积的例子。原始图像是蓝色矩阵,内核是滑动的深蓝色矩阵,输出是蓝绿色矩阵。
卷积是通过将重叠的内核和图像相乘,然后对乘积求和来获得的。以下等式可能会有所帮助:给定图像x和内核k,卷积的结果将为y。
和
如果我们已经知道图像上的卷积是如何工作的,也许这个方程组并不太可怕;如果我们不知道,别担心,我们不必记住它,这就是程序的工作!一个有用的表示形式是将卷积解释为矩阵乘法,从上面的等式中可以很容易的写出来:
等价于矩阵方程
通过这种表示,似乎知道A和y,那么x可以通过求解上面的方程来计算。但是,由于A 的列数多于行数,因此该系统尚未确定,这意味着我们不能只获得一个解。
首先说,为了能够反转卷积,输入和输出大小必须相同。在矩阵形式中,这将对应于 A 是正方形(行和列的书面相同),从而我们可以将其求逆并将x计算为:
现在,我们的输入是 4x4,输出是 2x2。我们如何获得与输入相同大小的输出?一种方法是向输入图像中添加填充,例如 0 填充:
这样,输出将像原始输入一样是 4x4。详细地说,对于这种带有填充的卷积的简单情况,输出尺寸可以计算为:
如果我们希望输入和输出具有相同的大小,那么填充必须是:
这产生了一个重要条件:内核大小必须是奇数,因为填充是一个整数值。
这种卷积也可以表示为上述矩阵的乘积,但是我不会不厌其烦地阅读它,因为尺寸会大得多。可以写出与 y 的每个项相关联的卷积方程,然后将其构造为如上所述矩阵乘法。
请注意,尽管填充的输入是 6x6,对应于 36 个元素,但这些元素中只有 4x4 是唯一且未知的变量。因此,方程中的 x 只能是 16x1,而不是 36x1。
要求解 x 并反转卷积,只需知道 A 和 y 。要构造 A ,需要知道用于卷积的内核和所使用的填充类型。
现在,如何使用?可以通过卷积来模糊图像。例如,高斯模糊是通过将图像与内核/滤波器卷积来获得的,该内核/滤波器的中心具有高斯分布,最大值在中心,其值总和为 1。
我首先使用高斯模糊对图像进行模糊处理。我用高斯核对原始图像进行了卷积,并使用了复制填充(原始图像之外的值设置为最接近的边界值,而不是 0)。
左边是原图,右边是模糊图像。
因为我们知道使用的内核,所以我们能够构造矩阵 A 然后求解 x 。结果如预期:重建的图像与原始图像完全相同。
左边是模糊的图像,右边是重建的图像。
现在,这种 100% 重建是可能的,因为使用的内核和填充是已知的。如果我们使用的内核与用于模糊原始图像的内核不完全相同,会发生什么?
不使用精确内核时,左侧图像模糊,右侧重建图像。
如果假设使用复制填充时填充为 0 ,该怎么办呢?
在不假设精确填充的情况下,左侧图像模糊,右侧重建图像。
正如我们所见,如果我们不知道使用的内核和填充,那么我们就无法重建原始图像。从这个意义上说,它几乎可以看作是一个加密问题:如果我们知道“密钥”,那么我们便能够重建原始消息而不回造成任何损失或额外的噪音。
重建原始图像也是一项非常艰巨的任务,因为矩阵 A 会根据原始图像的大小增长非常快。如果原始图像是 4x4,那么 A 将是 16x16 ——元素数量以 N² 缩放。
希望小伙伴们喜欢这个简短的解释并发现它很有趣。我确实做到了,这是了解更多关于 Julia、卷积、图像处理和线性代数的好方法。
我认为我们现在不必担心人们不会恢复模糊的图像了。
左边是模糊的图像,右边是重建的图像。