【16】图像清晰度识别

tech2025-05-01  4

【1】思路

图像清晰度评价算法有很多种,在空域中,主要思路是考察图像的领域对比度,即相邻像素间的灰度特征的梯度差;在频域中,主要思路是考察图像的频率分量,对焦清晰的图像高频分量较多,对焦模糊的图像低频分量较多。下面实现Tenengrad梯度方法、Laplacian梯度方法和方差方法。

【2】代码

.h文件

#pragma once #include <highgui/highgui.hpp> #include <imgproc/imgproc.hpp> using namespace std; using namespace cv; double LaplaciaDefinition(Mat imageSource) { Mat imageGrey; if (imageSource.channels() == 3) { cvtColor(imageSource, imageGrey, COLOR_RGB2GRAY); } else { imageGrey = imageSource; } Mat imageSobel; Laplacian(imageGrey, imageSobel, CV_16U); //Sobel(imageGrey, imageSobel, CV_16U, 1, 1); //图像的平均灰度 double meanValue = 0.0; meanValue = mean(imageSobel)[0]; return meanValue; } double MeanStdDefinition(Mat imageSource) { Mat imageGrey; if (imageSource.channels()==3) { cvtColor(imageSource, imageGrey, COLOR_RGB2GRAY); } else { imageGrey = imageSource; } Mat meanValueImage; Mat meanStdValueImage; //求灰度图像的标准差 meanStdDev(imageGrey, meanValueImage, meanStdValueImage); double meanValue = 0.0; meanValue = meanStdValueImage.at<double>(0, 0); return meanValue; } double TenegradDefinition(Mat imageSource) { Mat imageGrey; if (imageSource.channels() == 3) { cvtColor(imageSource, imageGrey, COLOR_RGB2GRAY); } else { imageGrey = imageSource; } Mat imageSobel; Sobel(imageGrey, imageSobel, CV_16U, 1, 1); //图像的平均灰度 double meanValue = 0.0; meanValue = mean(imageSobel)[0]; return meanValue; } void PrintResult(Mat imageSource, double meanValue,const string method) { Mat imageRGB; Mat showimage; cout << "Image channels:" << imageSource.channels() << endl; if (imageSource.channels() == 1) { cvtColor(imageSource, imageRGB, COLOR_GRAY2RGB); } else { imageRGB = imageSource; } stringstream meanValueStream; string meanValueString; meanValueStream << meanValue; meanValueStream >> meanValueString; meanValueString = method +":"+ meanValueString; cout << "Image channels:" << imageSource.channels() << endl; putText(imageRGB, meanValueString, Point(20, 50), FONT_HERSHEY_COMPLEX, 0.8, Scalar(255, 255, 25), 2); imshow(method, imageRGB); string name = "./result/"+method + ".bmp"; imwrite(name, imageRGB); }

.cpp文件

// Definition.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream> #include"Definition.h" using namespace std; using namespace cv; int main() { Mat imageSource = imread("05.png"); Mat imageSource1; Mat imageSource2; Mat imageSource3; imageSource.copyTo(imageSource1); imageSource.copyTo(imageSource2); imageSource.copyTo(imageSource3); double laplacmeanvalue; double meanstdmeanvalue; double tenegradmeanvalue; laplacmeanvalue=LaplaciaDefinition(imageSource); meanstdmeanvalue = MeanStdDefinition(imageSource); tenegradmeanvalue = TenegradDefinition(imageSource); cout << laplacmeanvalue << " ;" << meanstdmeanvalue << "; "<<tenegradmeanvalue << endl; PrintResult(imageSource1, laplacmeanvalue,"laplacmeanvalue"); PrintResult(imageSource2, meanstdmeanvalue,"meanstdmeanvalue"); PrintResult(imageSource3, tenegradmeanvalue,"tenegradmeanvalue"); waitKey(); }

【3】结果展示

最新回复(0)