image - 比较具有不同分辨率的 QR 码中的图像清晰度
问题描述
我想计算与相机不同距离拍摄的 QR 码的裁剪图像的图像清晰度分数。目标是确定哪个距离对应于完美的相机焦距,从而产生最清晰的图像。
工作流程如下:
在图像中心以不同距离拍摄一组 QR 码图像,从 QR 码到相机的距离例如 100 mm 开始,以 50 mm 为步长增加距离,直到最大距离为达到 500 毫米。
裁剪包含 QR 码的图像部分,因此每个距离都会生成具有不同图像形状的裁剪 QR 码图像(例如 500 x 500 用于 100 mm 的距离和 100 x 100 用于 500 mm 的距离)
计算每个距离的图像清晰度分数,并在不同距离之间进行比较
确定哪个距离产生最清晰的图像
到目前为止我已经尝试过:
通过使用 Sobel、difference_of_gaussian 或 Laplacian 滤波器计算梯度图像,并将方差计算为锐度分数。然而,基于滤波器的方法总是依赖于具有定义内核大小的滤波器,因此内核形状为 3x3 的 Sobel 滤波器会以不同于低分辨率图像的方式改变更高分辨率的图像,因此它们无法相互比较, 正确的?
像https://github.com/vaugusto92/kanjar-nr-iqa/blob/master/kanjar.py一样计算 FFT 分数,但是,结果在分数图中显示了多个峰值,这没有意义。最佳焦点应位于 260-280 毫米距离之间,只有一个明显的峰值
将图像的 1/熵计算为清晰度分数,但是,这非常依赖于光,并且图像的照明可能会有所不同。
调整图像大小,使它们都具有相同的分辨率。但这确实会以一种或另一种方式导致信息丢失。
在二维码中间裁剪一个 100x100 的框并计算其中的索贝尔方差。下图显示了这种方法。
像 Sobel-variance 这样的一些方法似乎给出了很好的结果,因为它们在单个距离(240)处给出了一个明显的峰值,但是,我不相信这是最好的方法,因为最佳焦点得分不在距离我希望它在 280 毫米左右。
我很感激任何新的意见或想法。
[在 140 毫米距离处裁剪输入图像][1] [在 300 毫米距离处裁剪输入图像][2] [距离上的 Sobel 方差得分][3] [1/距离上的熵得分][4] [ FFT-Score over the distances][5] [在此处输入图像描述][6]
[1]: https://i.stack.imgur.com/u6Qbo.png [2]: https://i.stack.imgur.com/DJQ3K.png [3]: https://i.stack. imgur.com/RKPtB.png [4]: https ://i.stack.imgur.com/u1uHj.png [ 5]: https ://i.stack.imgur.com/tTz58.png [ 6]: https ://i.stack.imgur.com/AsJuL.png
解决方案
推荐阅读
- node.js - 我目前正在安装“npm install --save dev webpack webpack-dev-server”,但我遇到了这个问题
- php - 致命错误:在 Laravel 7.0 的第 29 行的 Foundation\Application.php 中找不到接口“Symfony\Component\HttpKernel\HttpKernelInterface”
- typescript - 在打字稿中,计算后无法引用类型
- linux - 查看重定向到 dev/null 的进程输出 - 撤消重定向
- python - Pyplot 在绘制 1d 列与 nd 列时绘制不同的线型和标记样式
- mysql - 带有自我声明序列列的 MYSQL QUERY
- typescript - Typescript 条件类型无法正确缩小嵌套属性的类型
- java - Mockito 正确地模拟了服务,但它不适用于删除模拟
- ubuntu - 如何根据“Base”中的新安装更新 conda 的虚拟环境?
- python - Pandas DataFrame 中的列表到字符串转换