图片清晰度评价-java实现

什么是javaCV?,百度百科:

JavaCV 是一款开源的视觉处理库,基于GPLv2协议,对各种常用计算机视觉库封装后的一组jar包,封装了OpenCV、libdc1394、OpenKinect、videoInput和ARToolKitPlus等计算机视觉编程人员常用库的接口。
JavaCV通过其中的utility类方便的在包括Android在内的Java平台上调用这些接口。

特点
另外JavaCV还带有硬件加速的全屏幕图像显示(CanvasFrame),易于在多个内核中执行并行代码(并行),用户友好的几何和色彩的相机和投影仪校准(GeometricCalibrator,ProCamGeometricCalibrator,ProCamColorCalibrator ),检测和特征点(ObjectFinder),一类是实现投影,摄像系统(直接图像对齐设置匹配主要GNImageAligner,ProjectiveTransformer,ProjectiveGainBiasTransformer,ProCamTransformer和ReflectanceInitializer),以及在JavaCV类杂项功能。

avaCV配置(下载的jar比较多近500M):

pom.xml引入


    org.bytedeco
    javacv-platform
    1.4.3

Laplacian 梯度函数实现

package com.example.demo.hello;
 
import java.io.File;
import static org.bytedeco.javacpp.opencv_core.*;
import static org.bytedeco.javacpp.opencv_imgproc.*;
import static org.bytedeco.javacpp.opencv_imgcodecs.*;
 
public class HelloJavacv {
    public static void main(String[] args) {
        String path = "xxxxxxxx";        //要遍历的路径
        File file = new File(path+"source");        //获取其file对象
        File[] fs = file.listFiles();    //遍历path下的文件和目录,放在File数组中
 
        Mat srcImage = null;
        for (File f : fs) {                    //遍历File[]数组
            if (!f.isDirectory())        //若非目录(即文件),则打印
                srcImage = imread(f.getAbsolutePath());
            Mat dstImage = new Mat();
            cvtColor(srcImage, dstImage, COLOR_BGR2GRAY);        //转化为灰度图
            //在gray目录下生成灰度图片
            imwrite(path+"gray//gray-"+f.getName(), dstImage);
 
            Mat laplacianDstImage = new Mat();
            //阈值太低会导致正常图片被误断为模糊图片,阈值太高会导致模糊图片被误判为正常图片
            Laplacian(dstImage, laplacianDstImage, CV_64F);
            //在laplacian目录下升成经过拉普拉斯掩模做卷积运算的图片
            imwrite(path+"laplacian//laplacian-"+f.getName(), laplacianDstImage);
 
            //矩阵标准差
            Mat stddev = new Mat();
 
            //求矩阵的均值与标准差
            meanStdDev(laplacianDstImage, new Mat(), stddev);
            //double norm = Core.norm(laplacianDstImage); // ((全部元素的平方)的和)的平方根
            //System.out.println("\n矩阵的均值:\n" + mean.dump());
            System.out.println(f.getName() + "矩阵的标准差:\n" + stddev.createIndexer().getDouble());
            // System.out.println(f.getName()+"平方根:\n" + norm);
        }
 
    }
}

得到图片标准差的数值后,如何确认标准差阈值,在哪个数字以上算是清晰,哪个数值以下算是模糊,需要依赖于实际应用的业务场景,需要根据使用场景的不同做不同的定制。

除此之外,该算法会存在误杀的情况,如:有些图片可能会故意做个背景模糊或者背景虚化或者该图片很清晰但是线条过于简单。

你可能感兴趣的:(图片清晰度评价-java实现)