Tenengrad梯度方法
Tenengrad梯度方法利用Sobel算子分别计算水平和垂直方向的梯度,同一场景下梯度值越高,图像越清晰。以下是具体实现,这里衡量的指标是经过Sobel算子处理后的图像的平均灰度值,值越大,代表图像越清晰。
- int main()
- {
- Mat imageSource = imread("2.jpg");
- Mat imageGrey;
- cvtColor(imageSource, imageGrey, CV_RGB2GRAY);
- Mat imageSobel;
- Sobel(imageGrey, imageSobel, CV_16U, 1, 1);
- //图像的平均灰度
- double meanValue = 0.0;
- meanValue = mean(imageSobel)[0];
- //double to string
- stringstream meanValueStream;
- string meanValueString;
- meanValueStream << meanValue;
- meanValueStream >> meanValueString;
- meanValueString = "Articulation(Sobel Method): " + meanValueString;
- putText(imageSource, meanValueString, Point(20, 50), CV_FONT_HERSHEY_COMPLEX, 0.8, Scalar(255, 255, 25), 2);
- imshow("Articulation", imageSource);
- waitKey();
- }
Laplacian梯度方法:
Laplacian梯度是另一种求图像梯度的方法,在上例的OpenCV代码中直接替换Sobel算子即可。
- #include <highgui/highgui.hpp>
- #include <imgproc/imgproc.hpp>
- using namespace std;
- using namespace cv;
- int main()
- {
- Mat imageSource = imread("1.jpg");
- Mat imageGrey;
- cvtColor(imageSource, imageGrey, CV_RGB2GRAY);
- Mat imageSobel;
- Laplacian(imageGrey, imageSobel, CV_16U);
- //Sobel(imageGrey, imageSobel, CV_16U, 1, 1);
- //图像的平均灰度
- double meanValue = 0.0;
- meanValue = mean(imageSobel)[0];
- //double to string
- stringstream meanValueStream;
- string meanValueString;
- meanValueStream << meanValue;
- meanValueStream >> meanValueString;
- meanValueString = "Articulation(Laplacian Method): " + meanValueString;
- putText(imageSource, meanValueString, Point(20, 50), CV_FONT_HERSHEY_COMPLEX, 0.8, Scalar(255, 255, 25), 2);
- imshow("Articulation", imageSource);
- waitKey();
- }
方差方法:
方差是概率论中用来考察一组离散数据和其期望(即数据的均值)之间的离散(偏离)成都的度量方法。方差较大,表示这一组数据之间的偏差就较大,组内的数据有的较大,有的较小,分布不均衡;方差较小,表示这一组数据之间的偏差较小,组内的数据之间分布平均,大小相近。
对焦清晰的图像相比对焦模糊的图像,它的数据之间的灰度差异应该更大,即它的方差应该较大,可以通过图像灰度数据的方差来衡量图像的清晰度,方差越大,表示清晰度越好。
- #include <highgui/highgui.hpp>
- #include <imgproc/imgproc.hpp>
- using namespace std;
- using namespace cv;
- int main()
- {
- Mat imageSource = imread("2.jpg");
- Mat imageGrey;
- cvtColor(imageSource, imageGrey, CV_RGB2GRAY);
- Mat meanValueImage;
- Mat meanStdValueImage;
- //求灰度图像的标准差
- meanStdDev(imageGrey, meanValueImage, meanStdValueImage);
- double meanValue = 0.0;
- meanValue = meanStdValueImage.at<double>(0, 0);
- //double to string
- stringstream meanValueStream;
- string meanValueString;
- meanValueStream << meanValue*meanValue;
- meanValueStream >> meanValueString;
- meanValueString = "Articulation(Variance Method): " + meanValueString;
- putText(imageSource, meanValueString, Point(20, 50), CV_FONT_HERSHEY_COMPLEX, 0.8, Scalar(255, 255, 25), 2);
- imshow("Articulation", imageSource);
- waitKey();
- }