检测哪个图像更清晰
image-processing
9
0

我正在寻找一种方法来检测两个(相似)图像中哪个更清晰。

我在想这可能是使用某种程度的整体清晰度并生成一个分数(假设的示例:image1的清晰度得分为9,image2的清晰度得分为7;因此image1的清晰度更高)

我已经对锐度检测/评分算法进行了一些搜索,但只遇到会增强图像锐度的搜索。

有没有人做过这样的事情,或者有任何有用的资源/线索?

我将在Web应用程序的上下文中使用此功能,因此首选PHP或C / C ++。

参考资料:
Stack Overflow
收藏
评论
共 6 个回答
高赞 时间 活跃

一种简单实用的方法是使用边缘检测(更多边缘==更清晰的图像)。

使用PHP GD快速而又肮脏地动手

function getBlurAmount($image) {
    $size = getimagesize($image);
    $image = imagecreatefromjpeg($image);
    imagefilter($image, IMG_FILTER_EDGEDETECT);    
    $blur = 0;
    for ($x = 0; $x < $size[0]; $x++) {
        for ($y = 0; $y < $size[1]; $y++) {
            $blur += imagecolorat($image, $x, $y) & 0xFF;
        }
    }
    return $blur;
}

$e1 = getBlurAmount('http://upload.wikimedia.org/wikipedia/commons/thumb/5/51/Jonquil_flowers_at_f32.jpg/800px-Jonquil_flowers_at_f32.jpg');
$e2 = getBlurAmount('http://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Jonquil_flowers_at_f5.jpg/800px-Jonquil_flowers_at_f5.jpg');

echo "Relative blur amount: first image " . $e1 / min($e1, $e2) . ", second image " . $e2 / min($e1, $e2);

(模糊程度较小的图像更清晰)。更有效的方法是使用Sobel运算符检测代码中的边缘。 PHP示例 (用C ++重写应该可以大大提高性能)。

收藏
评论

收藏
评论

如在此Matlab中心页面中所示 ,可以通过平均梯度大小来估算清晰度。

我在Python中使用它作为

from PIL import Image
import numpy as np

im = Image.open(filename).convert('L') # to grayscale
array = np.asarray(im, dtype=np.int32)

gy, gx = np.gradient(array)
gnorm = np.sqrt(gx**2 + gy**2)
sharpness = np.average(gnorm)

可以使用更简单的numpy.diff而不是numpy.gradient计算相似的数字。结果数组大小需要在此处进行调整:

dx = np.diff(array)[1:,:] # remove the first row
dy = np.diff(array, axis=0)[:,1:] # remove the first column
dnorm = np.sqrt(dx**2 + dy**2)
sharpness = np.average(dnorm)
收藏
评论

检查对比度传递函数(CTF)

这是一个实现
这是一个解释

收藏
评论

本文介绍了一种使用DWT计算模糊因子的方法。看起来挺直的,但不是检测清晰度,而是检测模糊度。似乎它首先检测到边缘(简单的卷积),然后使用DWT对其进行累积和评分。

收藏
评论

简单的方法是测量对比度-像素值之间差异最大的图像最清晰。例如,您可以计算像素值的方差(或标准偏差),无论哪个产生较大的获胜数。这会寻求最大的整体对比度,但这可能不是您想要的-特别是,它倾向于使用具有最大景深的照片。

根据您的需要,您可能更喜欢使用诸如FFT之类的工具来查看显示频率最高的内容。这样一来,您可以使某些部分的景物非常清晰(而其他部分的景物则更少),而景深更大,因此更多的图像是相当清晰的,但是最大清晰度却较低(通常是由于以较小的孔径衍射)。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号