Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以编程方式查找抖动或失焦的图像_Java_Android_Opencv_Image Processing - Fatal编程技术网

Java 以编程方式查找抖动或失焦的图像

Java 以编程方式查找抖动或失焦的图像,java,android,opencv,image-processing,Java,Android,Opencv,Image Processing,大多数现代移动相机都有一系列称为图像稳定的技术,以减少由于相机镜头或相关硬件的运动而在照片中产生的抖动效果。但仍有相当多的移动相机拍摄出不稳定的照片。是否有可靠的算法或方法可以在移动设备上实现,特别是在Android上,用于查找给定输入图像是否不稳定?我不希望算法能够稳定输入图像,但是无论图像是否不稳定,算法/方法都应该可靠地返回一个确定的布尔值。它不一定是Java,但也可以是C/C++,这样就可以通过本机工具包构建它,并将API公开给顶层。下图描述了预期结果。此外,此问题涉及单个图像问题,因此

大多数现代移动相机都有一系列称为图像稳定的技术,以减少由于相机镜头或相关硬件的运动而在照片中产生的抖动效果。但仍有相当多的移动相机拍摄出不稳定的照片。是否有可靠的算法或方法可以在移动设备上实现,特别是在Android上,用于查找给定输入图像是否不稳定?我不希望算法能够稳定输入图像,但是无论图像是否不稳定,算法/方法都应该可靠地返回一个确定的布尔值。它不一定是Java,但也可以是C/C++,这样就可以通过本机工具包构建它,并将API公开给顶层。下图描述了预期结果。此外,此问题涉及单个图像问题,因此在这种情况下,基于多帧的解决方案将不起作用。它是专门关于图像的,而不是视频


失焦图像不会暗示这一点吗 a) 边缘模糊,因此与图像中的亮度相比,任何基于梯度的操作符的值都较低 b) 边缘模糊,因此任何基于曲率的操作符都将具有较低的值 c) 对于抖动的图片,像素将与抖动方向上的其他像素相关(平移或旋转)

我用gimp拍摄了你的照片,用Sobel表示a),用Laplacian表示b(可在openCV中获得),在上面的部分得到了更暗的图像


我想校准普通图像的阈值是相当困难的。

您处理的是视频流还是单个图像

如果是视频流:最好的方法是计算每两个相邻帧之间的差值。并用差异标记每个像素。当这些像素的数量很低时,你就处在一个不摇晃的帧中。请注意,此方法不检查图像是否对焦,而仅用于消除图像中的运动模糊。 您的实现应该包括以下内容

  • 对于每个帧“i”-将图像规格化(使用灰度,使用浮点时将平均值规格化为0,标准偏差规格化为1)
  • 保存上一个视频帧
  • 在每个新视频帧上,计算图像之间的像素差异,并计算差异超过某个阈值的像素数量。如果这样的像素数量太高(比如说>图像的5%),这意味着前一帧和当前帧之间的移动很大,并且您期望运动模糊。当一个人紧紧握住手机时,你会看到改变的像素数量急剧下降
  • 若你们的图像不是用浮点表示的,而是用定点表示的(比如说0..255),那个么你们可以在减法之前减少图像的数量,以减少噪声
  • 只要你正在拍摄动态图像,只需放下这些帧并向用户显示一条信息“紧紧握住你的手机”。一旦你得到一个稳定的图像,处理它,但要记住前一个,并为每个视频帧做减法
  • 上面的算法应该足够强大(我在我的一个项目中使用了它,它就像魔术一样工作)

    对于单个图像:上述算法不能解决未聚焦图像,并且与单个图像无关

  • 为了解决焦点问题,我建议计算图像边缘和计数 具有强边缘的像素数量(高于 阈值)。一旦获得大量边缘像素(比如>5%) 对于图像),您说图像处于焦点。这个算法还远远不够完美,可能会犯很多错误,这取决于图像的纹理。我建议使用X、Y和对角线边缘,但在边缘检测之前平滑图像以减少噪声
  • 更强大的算法是获取所有边缘(导数)并计算其直方图(图像中有多少像素具有此特定边缘强度)。这是通过首先计算边缘图像,然后计算边缘图像的直方图来完成的。现在可以分析直方图的形状(边缘强度的分布)。例如,仅取具有最强边缘的前5%像素,并计算其边缘强度的方差
  • 重要事实:在未聚焦的图像中,您期望大多数像素具有非常低的边缘响应,少数像素具有中等边缘响应,而具有强边缘响应的像素几乎为零。在具有完美焦距的图像中,大多数像素的边缘响应较低,但中等响应与强响应之间的比率会发生变化。您可以在直方图形状中清楚地看到它。这就是为什么我建议只使用边缘响应最强的像素的几%,并且只使用它们。其余的都是噪音。即使是一个简单的算法,将具有强响应的像素数量除以具有中等边缘的像素数量,也会非常好
  • 视频中的焦点问题

  • 如果您有一个视频流,那么您可以使用上述算法进行有问题的焦点检测,但不要使用恒定阈值,只需在视频运行时更新它们即可。最终,它们将收敛到比预定义常量更好的值
  • 最后一点:单个图像中的焦点检测问题是一个非常棘手的问题。有很多学术论文(使用傅里叶变换小波和其他“大算法炮”)。但是这个问题仍然很难解决,因为当你看到模糊的图像时,你无法知道是相机产生了聚焦错误的模糊,还是原始现实已经模糊了(例如,白色墙壁非常模糊,在黑暗中拍摄的照片即使在完美对焦的情况下也会变得模糊,水面、桌面的照片也会变得模糊)。 不管怎样,堆栈溢出中很少有线程与