vs2015+opencv3.3.1 实现 c++ 双边滤波器

#include <opencv2\highgui\highgui.hpp>
#include <iostream>
#include<vector>
using namespace  cv;
using namespace  std;

void GetGaussianKernel(double*& gaus_1, const int size, const double sigma_s);
void gaussianFilter2(const vector<uchar>& corrupted, vector<uchar> &smooth, double*& templates,const int width,const int height, const double sigma_r, const int size_m);

int main() {

	const double sigma_r = 30;	//值域的sigma
	const double PI = 4.0*atan(1.0); //圆周率π赋值
	const int size_m = 5;	//模板大小
	const double sigma_s = 10;	//空间域的sigma
	double *templates;

	templates = new double[size_m*size_m];
	GetGaussianKernel(templates, size_m, sigma_s);
	Mat img = imread("123.jpg", 3);

//	namedWindow("MyWindow");
//	imshow("MyWindow", img);

	vector<uchar> array(img.rows*img.cols*3);
	if (img.isContinuous()) { array.assign(img.datastart, img.dataend); }

	vector<uchar> no(img.rows*img.cols*3);

	gaussianFilter2(array, no, templates ,int(img.cols)*3, img.rows,sigma_r,size_m);

	Mat now((int)img.rows, (int)img.cols, CV_8UC3 );

	for (int i = 0; i < img.rows; i++)
		for (int j = 0; j < img.cols; j++) {
			now.at<Vec3b>(i, j)[0] = no[i*img.cols*3 + j*3];
			now.at<Vec3b>(i, j)[1] = no[i*img.cols*3 + j*3 + 1];
			now.at<Vec3b>(i, j)[2] =no[i*img.cols*3 + j*3 + 2];
		}

	imwrite("1123.jpg", now);
	namedWindow("MyWindow1");
	imshow("MyWindow1", now);
	waitKey(0);
	return 0;
}

void GetGaussianKernel(double*& gaus_1, const int size, const double sigma_s)
{
	double **gaus = new double*[size];
	for (int i = 0; i<size; i++)gaus[i] = new double[size];

	double sum = 0;
	for (int i = -size / 2; i<size / 2 + 1; i++) {
		for (int j = -size / 2; j<size / 2 + 1; j++) {
			gaus[i + size / 2][j + size / 2] = exp(-((i*i) + (j*j)) / (2 * sigma_s*sigma_s));
			sum += gaus[i + size / 2][j + size / 2];
		}
	}

	for (int i = 0; i<size; i++) {
		for (int j = 0; j<size; j++) {
			gaus[i][j] /= sum;
			gaus_1[i*size + j] = gaus[i][j];	//使用一维更简单
		}
	}
	return;
}

void gaussianFilter2(const vector<uchar>& corrupted, vector<uchar> &smooth,double*& templates,const int width,const int height,const double sigma_r, const int size_m) {
	int len = size_m / 2;
	smooth = corrupted;  //复制像素

	for (int j = 0; j<height ; j++) {  //边缘不处理
		for (int i = 0; i<width ; i++) {
			double sum = 0;
			int index = 0;
			double sum_c = 0;
			double temp = 0;
			for (int m = j - len; m<j + len + 1; m++) {
				for (int n = i - 3 * len; n<i + 3 * len + 1; n += 3) {
					if (m<0 || n<0 || m>height - 1 || n>width - 1)continue;  //边缘处理
					temp = templates[index++] * exp(-(corrupted[m*width + n] - corrupted[j*width + i])*(corrupted[m*width + n] - corrupted[j*width + i]) / (2.0*sigma_r*sigma_r));
					sum += corrupted[m*width + n] * temp;
					sum_c += temp;
				}
			}
			sum /= sum_c;
			if (sum > 255)
				sum = 255;
			if (sum < 0)
				sum = 0;
			smooth[j*width + i] = sum;
		}
	}
}

  

时间: 2024-10-19 13:26:05

vs2015+opencv3.3.1 实现 c++ 双边滤波器的相关文章

vs2015+opencv3.3.1 实现 彩色高斯滤波器 包括边缘处理

#include <opencv2\highgui\highgui.hpp> #include <iostream> #include<vector> using namespace cv; using namespace std; void gaussianFilter2(vector<uchar> corrupted, vector<uchar> &smooth, int width, int height) { int templa

vs2015+opencv3.3.1 实现 灰度高斯滤波器

#include <opencv2\highgui\highgui.hpp> #include <iostream> #include<vector> using namespace cv; using namespace std; void gaussianFilter2(vector<uchar> corrupted, vector<uchar> &smooth, int width, int height) { int templa

Windows环境下vs2015+opencv3.1+contrib库安装配置

最近几天在安装opencv,也看了网上的一些帖子,结合自己遇到的一些问题写了点内容. 准备: 1. opencv最新的版本是3.10,可以到官网下载http://opencv.org/.官网下载提取后会得到两个文件夹:build和sources.我们需要用到的是sources,用CMake重新编译sources里的内容,再添加contrib库.build里的内容是官网已经编译好的,有其他博客是讲利用build安装的,而这里我们并未用到.opencv也可从GitHub下载https://githu

opencv配置(win10+VS2015+opencv3.1)

Step 1:准备工作 a.win10 b.vs2015 c.opencv3.1[从http://opencv.org/downloads.html下载] Step 2.开始安装 a. 双击opencv-3.1.0.exe得到如下安装路径 b. 设置一个路径,点击extract开始安装: Step 3.配置电脑的环境变量: 右键单击开始->属性->高级系统设置->环境变量 对系统变量path添加:C:\Users\Administrator\Desktop\opencv\build\x6

vs2015+opencv-3.2.0-vc14配置

用的VS2015免费的community社区版,功能足矣. 很早就有配置opencv249,原本觉得低版本的稳定,一直没有配成功过,测试总是报错 出现error LINK:无法打开文件"opencv_ml249d.lib". 最近又要使用了,不得已换用opencv-3.2.0,配置比opencv249好配很多,陪完就能用.很是开心,噢耶. opencv-3.2.0-vc14下载地址:https://github.com/opencv/opencv/releases/tag/3.2.0

VS2015+Opencv3.2+QT5.8配置(一次配好)

对于 VS2015+QT5.8的配置我就不介绍了,由于我配置的比较早,具体有的东西忘掉了,大家可以参考下面这几篇文章. 留白留白留白留白留白(稍后补) 对于Opencv+VS的配置是我重点要说的内容. VS2015与Opencv3.2唯一对应! VS2015与Opencv3.2唯一对应! VS2015与Opencv3.2唯一对应! (如果你要配置VS2015与Opencv3.0,很艰难很艰难,我试过,配置完成后会出现各种的BUG.) VS2015官方下载地址:https://visualstud

双边滤波器的实现

普通的高斯滤波会将图像的边缘模糊掉,而双边滤波器具有保边特性. #define MAX_IMAGE_SIZE 1024 double d[MAX_IMAGE_SIZE][MAX_IMAGE_SIZE];//d[i][j]表示入图像,fi][j]表示出图像. double f[MAX_IMAGE_SIZE][MAX_IMAGE_SIZE]; void CImageColorProcess::Bilateral(LPBYTE lpSrc, LPBYTE lpDst, int nSrcCount, i

VS2015+Opencv3.0配置(简略叙述)

1.下载和安装OpenCV 3.0 下载完成后为如图所示的.exe文件 打开后是解压程序(不是我们常见的可执行程序) 路径可以任意选择(不用非得C盘),以后VS2015会添加Opencv的解压路径,所以即使不在C盘也不会出现问题(纠结要不要放在C盘的人大可放心). 解压程序会在你选好的路径下自己创建以opencv命名的文件夹(不要自作聪明的自己创建一个opencv文件夹). 2.配置环境变量 配置方法如下: [计算机]->[(右键)属性]->[高级系统设置]->[高级(标签)]->

双边滤波器以及中值滤波器记录

香港中文大学研究成果 Rolling Guidance Filter http://www.cse.cuhk.edu.hk/~leojia/projects/rollguidance/ 100+ Times Faster Weighted Median Filter http://www.cse.cuhk.edu.hk/~leojia/projects/fastwmedian/index.html