图像处理,识别较大图像中的小特征

信息处理 图像处理 傅里叶变换 opencv 卷积
2022-02-19 11:20:37

我正在尝试编写一个图像处理程序来识别油中的气泡。有人建议我尝试计算图像和典型气泡图像的卷积。即: ifft(fft(a).fft(b)) 在气泡附近会有高峰值。

其中:
ifft:逆傅立叶变换
fft:傅立叶变换
a:图像
b:内核图像(气泡)

这是解决这个问题的好方法吗?此外,为了使点积起作用,我需要图像具有相同的尺寸。情况不太可能如此。

3个回答

向您提出的建议称为模板匹配如果您不介意重复使用代码(并使用 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 变换的参考。