opencv自己定义kernal对图像进行卷积及其他常规滤波方法

最近看射雕英雄传入迷,没干什么大事,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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值