有没有一种程序化的方法可以检测照片是否聚焦?

7
如果我正在构建一个使用多张照片来说明服务的网络服务,那么实际上检测照片是否清晰将非常有用。这个能否通过程序实现?(更好的是,是否有这样一种例程的开源实现?)

也许添加你正在工作的编程语言也许添加你正在工作的编程语言。 - Oskar Kjellin
3
我认为这个问题使用什么语言并不重要,这更像是一个数学问题。(当然,除非所选的语言在数字计算方面过于缓慢) - Matti Virkkunen
1
@Matti 但他也在寻找一个开源实现,这可能更适合某些语言。另外,有些框架更适合此。 - Oskar Kjellin
该网络服务使用 Ruby on Rails 构建,但如果我要实现它,将作为后台任务,并且可以使用在 Linux 系统上运行的几乎任何编程语言进行编写(通过调用子进程或使用类似 RubyInline 的工具将 C 代码编译成 Ruby 类)。 - Tom Morris
2个回答

4

如何确定它是否聚焦?当然,您可以识别对象,但更普遍的是,因为它具有细节。通常情况下,细节意味着在短范围内像素的颜色发生了剧烈变化。我相信您可以通过谷歌找到很多边缘检测算法。没有过多考虑:

edgePixelCount = 0;

for each pixel in image
{
    mixed = pixel.red + pixel.blue + pixel.green;
    for each adjacentPixel in image.adjacentPixels(pixel)
    {
        adjacentMixed = 
           adjacentPixel.red + 
           adjacentPixel.blue + 
           adjacentPixel.green;
        if ( abs ( adjacentMixed - mixed ) > EDGE_DETECTION_THRESHOLD )
        {
             edgePixelCount++;
             break;
        }
    }
}

if (edgePixelCount > NUMBER_OF_EDGE_PIXELS_THRESHOLD)
{
     focused = true;
}

注意:您可能需要使用一些距离的“相邻像素”,而不仅仅是直接边缘像素。即使在焦点上,高分辨率图像也经常具有渐变效果。

1
我曾经实现了一个边缘检测算法,但由于一个偏移量错误,它实际上将原始图像添加到了边缘中。当应用于前景中的同学照片时,同学看起来像90岁,而背景中的其他人则没有变化。 - Chris
非常好的答案。我可能会对图像运行边缘检测,看看它是否能够检测出模糊的照片,并挑选出其中的底部 x% ,以便我们可以重新拍摄它们。 - Tom Morris

3

研究真正的边缘检测方法-使用拉普拉斯滤波器、高斯滤波器、LoG(高斯拉普拉斯)等。 这些方法比PatrickV的简单(尽管优雅)方法更加可调整以适应您特定的情况。


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