【判别方法】模糊图像的拉普拉斯判别,C++及python版本


通过判断一组合格的图像,利用下列代码,得到所有图像的模糊值,取其中最小值作为模糊的阈值下限,在实际应用中,一旦超过该值,则认为图像清晰,小于该值,则认定图像模糊。

C++版本

#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>

double variance_of_laplacian(cv::Mat image)
{
    
    
    cv::Mat gray;
    cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
    cv::Mat laplacian;
    cv::Laplacian(gray, laplacian, CV_64F);
    cv::Scalar mean, stddev;
    cv::meanStdDev(laplacian, mean, stddev);
    double variance = stddev.val[0] * stddev.val[0];
    return variance;
}
int main(int argc, char* argv[])
{
    
    
    // 设置参数
    std::string imagesPath = "/work/fangdou/pics";
    
    // 获取文件夹下的所有图片路径
    std::vector<cv::String> imagePaths;
    cv::glob(imagesPath, imagePaths);
    int i=0;
    // 遍历每一张图片
    for (const auto& imagePath : imagePaths)
    {
    
    
        // 读取图片
        cv::Mat image = cv::imread(imagePath);
        // 计算灰度图片的方差
        double fm = variance_of_laplacian(image);
        std::string text = std::to_string(fm);
        
        // 设置输出的文字
        // if (fm < threshold)
        //     text = "Blurry";

        // 显示结果
        cv::putText(image,std::to_string(fm), cv::Point(10, 30), cv::FONT_HERSHEY_SIMPLEX, 0.8, cv::Scalar(0, 0, 255), 3);
        cv::imwrite("_"+std::to_string(i)+".jpg",image);
        i++;
    }
    
    return 0;
}

Python版本

在cv2.Laplacian()函数中,.var()是用于计算图像的拉普拉斯变换后的方差的方法。拉普拉斯变换是一种用于检测图像中边缘和细节信息的滤波器。通过计算拉普拉斯变换后图像的方差,可以评估图像的清晰程度或者边缘的强度。

在上述代码中,cv2.Laplacian()函数会对输入的图像进行拉普拉斯变换,并返回变换后的结果。然后,使用.var()方法计算这个结果图像的方差。方差值越大,表示图像中包含的细节信息和边缘强度越高;方差值越小,则说明图像比较模糊或者缺乏明显的边缘。

# coding=utf-8
# 导入相应的python包
from imutils import paths
import argparse
import cv2

def variance_of_laplacian(image):
	'''
    计算图像的laplacian响应的方差值
    '''
	return cv2.Laplacian(image, cv2.CV_64F).var()

if __name__ == '__main__':
    # 设置参数
    ap = argparse.ArgumentParser()
    ap.add_argument("-i", "--images", required=True, help="设置输入图片的路径")
    ap.add_argument("-t", "--threshold", type=float, default=100.0, help="设置模糊阈值")
    args = vars(ap.parse_args())

    # 遍历每一张图片
    for imagePath in paths.list_images(args["images"]):
        # 读取图片
        image = cv2.imread(imagePath)
        # 将图片转换为灰度图片
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        # 计算灰度图片的方差
        fm = variance_of_laplacian(gray)
        text = "Not Blurry"

        # 设置输出的文字
        if fm < args["threshold"]:
            text = "Blurry"

        # 显示结果
        cv2.putText(image, "{}: {:.2f}".format(text, fm), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 3)
        cv2.imshow("Image", image)
        key = cv2.waitKey(0)

猜你喜欢

转载自blog.csdn.net/hh1357102/article/details/132432697