我想编写自己的焦点堆叠软件,但无法找到合适的解释任何算法来提取堆栈中每个图像的焦点对准部分。
对于那些不熟悉焦点堆叠的人,this Wikipedia article可以很好地解释这个想法。
有人能指出我找到算法的正确方向吗?即使是搜索的一些关键词也会有所帮助。
答案 0 :(得分:15)
我意识到这已经超过一年了但是对于任何有兴趣的人......
我在机器视觉方面有相当多的经验,我就是这样做的:
对其中一个通道(可能是绿色)上的每个图像执行高斯模糊:
最简单的高斯核是:
1 2 1
2 4 2
1 2 1
我们的想法是遍历每个像素并查看紧邻的像素。循环的像素乘以4,相邻像素乘以与上面内核对应的任何值。
您可以使用以下公式制作更大的高斯核:
EXP( - (((X * X)/ 2 / C / C +(Y * Y)/ 2 / C / C)))
其中c是模糊的力量
在每个高斯模糊图像上执行拉普拉斯边缘检测内核但不应用阈值
最简单的拉普拉斯算子是:
-1 -1 -1
-1 8 -1
-1 -1 -1
与高斯相同,将内核滑过整个图像并生成结果。
计算更大内核的公式如下:
( - 1 / PI / C / C / C / C)*(1-(X * X + Y * Y)/ 2 / C / C)* EXP( - (X * X + Y * Y) / 2 / C / C)
取高斯拉普拉斯结果的绝对值。这将根据内核的大小和强度来量化边缘的强度。
现在创建一个空白图像,遍历每个像素并找到LoG中最强的边缘(即图像堆栈中的最高值),并从相应的图像中获取该像素的RGB值。
以下是我创建的MATLAB示例:
http://www.magiclantern.fm/forum/index.php?topic=11886.0
您可以随意使用它。它将创建一个名为Outsharp.bmp的文件,这就是你所追求的。
为了更好地输出图像,您可以: - 补偿图像之间亮度水平的差异(即直方图匹配或简单的水平调整) - 创建自定义算法以抑制图像噪声 - 生成后手动调整堆栈 - 在焦点贴图上应用高斯模糊(确保将结果除以16),以便更好地合并各个图像
祝你好运!