【判別方法】ぼやけた画像のラプラシアン判別、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