比较倾斜角度的图像

9
我有一个问题,如下所示,上面的是原始图像,下面的被向左旋转了90度。有没有一种方法来计算角度的变化?我已经尝试过Hough变换,可以检测到位置,但无法检测到角度的变化。是否有其他方法来检测角度的变化?

我该怎么修复它??我从未注意到这个问题。 - user288231
您需要通过勾选来选择最佳答案。 - Agnius Vasiliauskas
假设它确实解决了你的问题 - Justin
2个回答

5
我曾经使用对称相位匹配滤波器完成过类似的任务,具体是指指纹识别时允许旋转和缩放。不幸的是,这个算法非常复杂,需要熟悉如何计算FFT以及相关的数学知识。我并没有用C#实现它,而是用MATLAB(还有可合成的Verilog,但那是另一个故事了)。我建议首先使用MATLAB或类似的数学软件包来确保你掌握了正确的算法。
希望有人已经在.NET图像处理库中实现了这个算法。
我使用的论文是下面这篇。它更注重数学而非算法,因此将其转换为代码需要一些工作:
Qin-Sheng Chen; Defrise, M.; Deconinck, F.的论文"Symmetric phase-only matched filtering of Fourier-Mellin transforms for image registration and recognition,"介绍了一种新的方法来匹配2D图像和翻译、旋转、缩放参考图像。该方法包括两个步骤:为每个要匹配的图像计算傅里叶-梅林不变(FMI)描述符以及匹配FMI描述符。FMI描述符是平移不变的,并将旋转和缩放表示为参数空间中的平移。使用对称相位仅匹配滤波(SPOMF)实现FMI描述符的匹配。与处理图像平移时相位仅匹配滤波(POMF)的性能相同或类似。这种新技术的显着优点是其准确高效地匹配旋转和缩放的图像的能力。创新之处在于将SPOMF应用于FMI描述符,这保证了在存在噪声的情况下具有高区分能力和出色的鲁棒性。本文描述了新方法的原理及其针对图像检测问题或图像注册问题的离散实现。针对医学成像、遥感、指纹识别和多目标识别等各种应用提供了实际结果。

我愿意尝试在Matlab中使用它,但我对此还很陌生。你介意提供一些文档或库来帮助我吗?谢谢。 - user288231
@user288231 - 我实际上已经丢失了所有关于这个的文档/代码。那是几年前在学校里,我从来没有认为它那么重要。我很幸运还记得足够多的内容找到了这篇论文...抱歉!我提供的IEEE论文还不错(但你需要成为会员)。 - Justin

0

您还可以通过恒定角度循环旋转第二张图像,并在每次迭代中计算两个图像之间的RMSE。匹配角度将是RMSE最小值的位置。

这里是一个powershell脚本,它使用ImageMagick实现了这个想法:

# convert images to equal sizes for pixel by pixel comparision
convert.exe p1.png -resize 73x73! p1.png
convert.exe p2.png -resize 73x73! p2.png

# initialize variables
$min_rmse = 1.0
$degrees_rotated = -1.0

# rotate second image by 10 degrees in each iteration
# and after that measure RMSE between first image and second rotated image
for ($i=0; $i -le 350; $i+=10) {
    convert.exe p2.png -rotate $i tmp.png
    convert.exe tmp.png -resize 73x73! tmp.png
    $rmse = compare.exe -metric rmse p1.png tmp.png diff.png 2>&1
    $rmse = ([string] $rmse).split(" ")[1]
    $rmse = $rmse.replace("(","")
    $rmse = [double] $rmse.replace(")","")

    # find rotation angle where RMSE is minimal
    if ($rmse -lt $min_rmse) {
        $min_rmse = $rmse
        $degrees_rotated = $i
    }
}

Write-Host "two images are most similar when second image is rotated by $degrees_rotated deg (rmse is $min_rmse)"
Write-Host "Press any key to exit ..." 
$host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

希望这能有所帮助。
附言: 根据维基百科,两个向量之间的均方根误差(RMSE)可以用两种不同的方式计算。我不知道ImageMagick中实现了哪一种方法作为< pre>compare.exe -metric rmse命令,但可以通过询问IM开发人员或通过试错法确定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接