图像过滤器如何真正扫描图像?
我假设通过图像过滤器扫描,您的意思是图像与内核卷积。在这种情况下,该方法更类似于您在第二张图片中显示的内容。
从概念上讲,NxM 内核乘以图像中的 NxM 像素块,结果相加为一个值——这是二维结果数组中的第一个值。
然后通过将窗口向右偏移一个像素来获取下一个 NxM 像素块,内核乘以该块,结果求和,这是结果数组中的第二个值(顶行,左起第二个)。
这一直持续到您到达行的末尾,然后您向下偏移一个像素并从行的开头重新开始。然后,此结果是结果数组第二行中的第一个结果。
等等。
当然,它不一定要按顺序完成,如果你不逐步执行这样的顺序重叠,许多优化或并行编程技术可能会表现得更好,但从概念上讲,这就是正在发生的事情——取一个块,卷积,获得一个像素输出,将其放入该偏移量的结果中。
还有一个如何处理边缘的问题——如果您希望卷积结果与输入图像的大小相同,您需要假设实际图像边界之外的像素值。零是一个常见的假设。
考虑边缘,并参考评论中的问题,您启动内核的位置取决于您到底想要什么。首先,不同的内核可能有不同的“起源”——通常内核计算的结果参考内核的中心,但这不是必需的(如果内核是偶数个单元,则不会发生) .
然后需要在输出的大小和数据的有效性之间进行权衡。如果您想要与输入图像大小相同的输出图像,那么在图像中的 (1,1) 处开始内核的 (3,3),假设基于 1 的索引,将为您提供该结果。挑战在于为不与图像重叠的内核部分使用什么值。例如,如果您使用内核对像素邻域进行平均,并且您假设图像外部的值为 0,则结果图像的最边缘像素将变暗,因为您正在使用现有数据对这些零进行平均。这可能是合理无害的。
但是,如果您假设图像之外的值,其他内核可能会在边界处提供错误数据。例如,在拍摄天空照片时假设图像外部为零可能会导致“幻影”边缘出现在边缘检测内核中,这可能会导致稍后在处理管道中出现问题。在这种情况下,您可能更喜欢在图像的 (3,3) 处从内核的 (3,3) 开始,然后您的结果图像将窄 4 个像素,短 4 个像素。


