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