VS2017C++ OpenCV
/ / /这个也是学校课设练习题目,本人编程能力一般,只能是在社区里到处搜集大佬的代码然后修改自己使用,说到底不过是拾人牙慧罢了。
/ / / 空间域一阶统计量主要是有均值、方差、熵,熵的确是不会了,就只搞了均值跟方差。
/ / /原文链接:标准差参考
代码如下:
#include<iostream>
#include<string>
#include<vector>
#include<math.h>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/opencv.hpp>
#include<cmath>
#include"gdal_priv.h"
using namespace std;
using namespace cv;
// 计算一幅图的局部标准差
void calcDeviationImage(Mat inputImg, Mat& devImg, int maskWidth, int maskHeight)
{
Mat orignalImg;
inputImg.convertTo(orignalImg, CV_32FC1);
// 计算均值图像及均值图像的平方图像
Mat meanImg, meanImg_pow;
boxFilter(orignalImg, meanImg, CV_32FC1, Size(maskWidth, maskHeight));
pow(meanImg, 2, meanImg_pow);
// 计算原图的平方图像及该图像的均值图像
Mat orignalImg_pow, orignalImg_pow_mean;
pow(orignalImg, 2, orignalImg_pow);
boxFilter(orignalImg_pow, orignalImg_pow_mean, CV_32FC1, Size(maskWidth, maskHeight));
// 作差然后开根号,得出标准差图像
Mat varianceImg; //方差图像
subtract(orignalImg_pow_mean, meanImg_pow, varianceImg);
sqrt(varianceImg, devImg);
// 转化为CV_8UC1格式
devImg.convertTo(devImg, CV_8UC1);
}
int main()
{
Mat src = imread("D:\\Library\\src.jpg", 0);//读入图像
Mat Sdv, Mean;
Mat kernel = (Mat_<int>(3, 3) << 1, 1, 1, 1, 1, 1, 1, 1, 1);//设置卷积核
filter2D(src, Mean, -1, kernel);//求取平均值
calcDeviationImage(src, Sdv, 5 , 5);//求取标准差
Sdv.convertTo(Sdv, CV_8U, 5, 5);
namedWindow("源图像", 0);
imshow("源图像", src);
namedWindow("Mean", 0);
imshow("Mean", Mean);
namedWindow("Variance", 0);
imshow("Variance", Sdv);
waitKey(0);
return 0;
}
实现思想:
实现均值很简单,直接使用一个均值滤波就OK,关于局部方差计算的原理如下:
对于这个标准差化简的确是有点没看明白,等过后有时间了再去深究吧。
结果展示:
均值图像:
标准差图像:
有错误希望大家指正。交流产生新思想,总结才会收获。