VS2017 C++ OpenCv 纹理变换--空间域一阶统计量分析

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,关于局部方差计算的原理如下:
标准差原理
对于这个标准差化简的确是有点没看明白,等过后有时间了再去深究吧。

结果展示:

均值图像:
均值
标准差图像:
标准差

有错误希望大家指正。交流产生新思想,总结才会收获。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值