我正在尝试编写一个图像处理程序来识别油中的气泡。有人建议我尝试计算图像和典型气泡图像的卷积。即: ifft(fft(a).fft(b)) 在气泡附近会有高峰值。
其中:
ifft:逆傅立叶变换
fft:傅立叶变换
a:图像
b:内核图像(气泡)
这是解决这个问题的好方法吗?此外,为了使点积起作用,我需要图像具有相同的尺寸。情况不太可能如此。
我正在尝试编写一个图像处理程序来识别油中的气泡。有人建议我尝试计算图像和典型气泡图像的卷积。即: ifft(fft(a).fft(b)) 在气泡附近会有高峰值。
其中:
ifft:逆傅立叶变换
fft:傅立叶变换
a:图像
b:内核图像(气泡)
这是解决这个问题的好方法吗?此外,为了使点积起作用,我需要图像具有相同的尺寸。情况不太可能如此。
向您提出的建议称为模板匹配。如果您不介意重复使用代码(并使用 C++),您可以在OpenCV 库中找到一个实现。
一个更简单的替代方案(我将从开始)是使用广义 Hough 变换,但这需要首先通过检测图像中的边缘进行一些预处理。
模板匹配在某些情况下效果很好,但有一些注意事项:
1)您可能需要先对图像进行预美白,然后才能成功运行。
2)您的 FFT 和 IFFT 应该具有适当的长度,以避免由于涉及的循环卷积而产生混叠。
请参阅第 1 项的此示例:

我们试图找到的补丁是歌手的鼻子。这是一个玩具示例,因为我使用了图像中的确切像素(而不是“模板”),但它说明了问题。
左下角的图像显示了当您使用模板匹配(如您在问题中描述的那样)而不进行任何处理时会发生什么。问题是根本没有定位:很难辨别生成的表面中的真正“峰值”。
右下角的图像显示了发生相同操作时会发生什么,但是(非常简单)将diff操作应用于正在搜索的图像和模板的预白化。有点难看,因为山峰又小又大,但在正确的地方有一个红色的山峰。
此图像显示了底部两个图像的“侧视图”。

您必须计算内核图像“b”与任何可能位置的相同大小的整个原始图像的子图像之间的相关性。如果某个位置的相关性非常高 - 您在该位置发现了气泡。如果内核图像的大小很大 - 使用 FFT 计算相关性。如果内核很小 - 使用直接计算相关性可能会更好。最好使用归一化相关。这种计算需要非常多的计算机能力。因此,快速进行计算非常重要。有经典文章 - JP Lewis “Fast Normalized Cross-Correlation。搜索这篇文章的引用。wiki 中的文章也非常有用 - http://en.wikipedia.org/wiki/Template_matching#Speeding_up_the_Process
我确认了 sansuiso 的答案——OpenCV库有很好的模板匹配实现。如果气泡的大小完全不同,最好使用另一种算法 - 请参阅sansuiso回答中关于广义 Hough 变换的参考。