最近看射雕英雄传入迷,没干什么大事,opencv各种滤波函数的数字图像处理作业写了一下,没什么技术含量,代码呈上
代码:
#include<iostream>
#include <opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
//计算峰值信噪比
double allOfReferenceByPSNR(const Mat &inImg, const Mat &referenceImg)
{
if (inImg.rows != referenceImg.rows || inImg.cols != referenceImg.cols || inImg.channels() != referenceImg.channels())
return -1000000.0;
//转换类型unsigned char CV_3FC3 到 double CV_64FC3
Mat dImg, dRImg;
int imgType;
if (3 == inImg.channels())
imgType = CV_64FC3;
else
imgType = CV_64FC1;
inImg.convertTo(dImg, imgType);
referenceImg.convertTo(dRImg, imgType);
//计算均值
double *dataImg = dImg.ptr<double>(0);
double *dataRImg = dRImg.ptr<double>(0);
for (int idr = 0; idr<inImg.rows; idr++)//对行遍历
{
for (int idc = 0; idc<inImg.cols*inImg.channels(); idc++, dataImg++, dataRImg++)//对列遍历
{
double difValue = *dataImg - *dataRImg;//遍历到的像素相减
*dataImg = difValue *difValue;//将每对像素的差值平方,存储到dImg对应的像素位置上
}
}
//计算插值均值
Scalar meanValue = cv::mean(dImg);
double mValue;
if (3 == inImg.channels())
mValue = (meanValue[0] + meanValue[1] + meanValue[2]) / 3.0;
else
mValue = meanValue[0];
//计算PSNR峰值信噪比
double val = 255.0;
double reValue = 10.0*log10((val*val) / mValue);
return reValue;
}
int main(int argc, char* argv[]){
const char* path = "lena高斯4噪声.bmp";
Mat img = imread(path);
Mat referenceImg = imread("lena.bmp");
double Psnr;//峰值信噪比
if (img.empty())
{
cout << "error";
return -1;
}
imshow("原图像", img);
//均值滤波
Mat blur_mat;
blur(img, blur_mat, Size(3, 3));
imshow("均值滤波", blur_mat);
imwrite("均值滤波.bmp",blur_mat);
//方向均值滤波
Mat kern2 = (Mat_<float>(3, 3) << 0, 0, 1,
0, 1, 0,
1, 0, 0) / 3;
Mat blur3_mat;
filter2D(img, blur3_mat, img.depth(), kern2);
imshow("方向均值滤波", blur3_mat);
imwrite("方向均值滤波.bmp", blur3_mat);
//线性非均值滤波
Mat kern = (Mat_<float>(3, 3) << 1, 2, 1,
2, 4, 2,
1, 2, 1) / 16;
Mat blur2_mat;
filter2D(img, blur2_mat, img.depth(), kern);
imshow("线性非均值滤波", blur2_mat);
//中值滤波
Mat memedian_mat;
medianBlur(img, memedian_mat, 3);
imshow("中值滤波", memedian_mat);
//高斯滤波
Mat Gaussian_mat;
GaussianBlur(img, Gaussian_mat, Size(3, 3), 0, 0);
imshow("高斯滤波", Gaussian_mat);
//双边滤波
Mat bilateral_mat;
bilateralFilter(img, bilateral_mat, 25, 25 * 2, 25 / 2);
imshow("双边滤波", bilateral_mat);
cout << "lena原图/lena噪声:" << allOfReferenceByPSNR(img, referenceImg) << endl;
cout << "lena原图/均值滤波:" << allOfReferenceByPSNR(blur_mat, referenceImg) << endl;
cout << "lena原图/方向滤波:" << allOfReferenceByPSNR(blur3_mat, referenceImg) << endl;
waitKey();
return 0;
}