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 templates[25] = { 1, 4, 7, 4, 1,
		4, 16, 26, 16, 4,
		7, 26, 41, 26, 7,
		4, 16, 26, 16, 4,
		1, 4, 7, 4, 1 };        //滤波器模板  

	smooth = corrupted;  //复制像素
	for (int j = 2; j<height - 2; j++)  //边缘不处理
	{
		for (int i = 6; i<width - 7; i++)
		{
			int sum = 0;
			int index = 0;
			for (int m = j - 2; m<j + 3; m++)
			{
				for (int n = i - 6; n<i + 7; n+=3)
				{
					sum += corrupted[m*width + n] * templates[index++];
				}
			}
			sum /= 273;
			if (sum > 255)
				sum = 255;
			smooth[j*width + i] = sum;
		}
	}

	for (int j = 0; j< 2; j++)  //上边缘处理
	{
		for (int i = 6; i<width-7 ; i++)
		{
			int sum = 0;
			int index = 0;
			for (int m = j - 2; m<j + 3; m++)
			{
				int mt = m; if (mt < 0)mt = -mt;

				for (int n = i - 6; n<i + 7; n += 3)
				{
					sum += corrupted[mt*width + n] * templates[index++];
				}
			}
			sum /= 273;
			if (sum > 255)
				sum = 255;
			smooth[j*width + i] = sum;
		}
	}

	for (int j = height-2; j< height; j++)  //下边缘处理
	{
		for (int i = 6; i<width - 7; i++)
		{
			int sum = 0;
			int index = 0;
			for (int m = j - 2; m<j + 3; m++)
			{
				int mt = m; if (mt >height-1)mt =2*height-1-mt;

				for (int n = i - 6; n<i + 7; n += 3)
				{
					sum += corrupted[mt*width + n] * templates[index++];
				}
			}
			sum /= 273;
			if (sum > 255)
				sum = 255;
			smooth[j*width + i] = sum;
		}
	}

	for (int j = 0; j< height; j++)  //左边缘处理
	{
		for (int i = 0; i<6; i++)
		{
			int sum = 0;
			int index = 0;
			for (int m = j - 2; m<j + 3; m++)
			{
				int mt = m;
				if (mt >height - 1)mt = 2 * height - 1 - mt;
				if (mt < 0)mt = -mt;

				for (int n = i - 6; n<i + 7; n += 3)
				{
					int nt = n;
					if (nt < 0)nt = -nt;
					sum += corrupted[mt*width + nt] * templates[index++];
				}
			}
			sum /= 273;
			if (sum > 255)
				sum = 255;
			smooth[j*width + i] = sum;
		}
	}

	for (int j = 0; j< height; j++)  //右边缘处理
	{
		for (int i = width - 7; i<width; i++)
		{
			int sum = 0;
			int index = 0;
			for (int m = j - 2; m<j + 3; m++)
			{
				int mt = m;
				if (mt >height - 1)mt = 2 * (height - 1) - mt;
				if (mt < 0)mt = -mt;

				for (int n = i - 6; n<i + 7; n += 3)
				{
					int nt = n;
					if (nt > width-1)nt = 2*(width-1)-nt;
					sum += corrupted[mt*width + nt] * templates[index++];
				}
			}
			sum /= 273;
			if (sum > 255)
				sum = 255;
			smooth[j*width + i] = sum;
		}
	}

 }

int main() {

	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, int(img.cols)*3, img.rows);

	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;

}

  

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

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

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 实现 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<

深度理解高斯滤波器

1.高斯滤波器综述 高斯滤波器是一类根据高斯函数的形状来选择权值的线性平滑滤波器.高斯平滑滤波器对于抑制服从正态分布的噪声非常有效.一维零均值高斯函数为: g(x)=exp( -x^2/(2 sigma^2) 其中,高斯分布参数Sigma决定了高斯函数的宽度.对于图像处理来说,常用二维零均值离散高斯函数作平滑滤波器. 高斯函数具有五个重要的性质,这些性质使得它在早期图像处理中特别有用.这些性质表明,高斯平滑滤波器无论在空间域还是在频率域都是十分有效的低通滤波器,且在实际图像处理中得到了工程人员的

【信号、图像、Matlab】如何得到高斯滤波器的整数模板

[信号.图像.Matlab]如何得到高斯滤波器的整数模板 如何得到高斯滤波器的整数模板?这个问题困扰了我两天,上网搜索的代码,基本上都生成的小数,有的文档给写了3*3,5*5,7*7的整数形式,但是没有说是怎么得到的,应该说是我没有仔细看吧,现在恍然大悟,只要将左上角的元素化为1就可以了啊.我还以为用什么高级方法得出来的,晕死了. 二维高斯分布公式: 要得到高斯滤波器的整数模板就要从这个公式入手,这个公式在三维坐标下的形式是这样的: 我们要的高斯滤波器的整数模板相当于这个三维图形在底面(将底面网

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

Introduction to gaussian filter 高斯滤波器

Introduction to gaussian filter 我尝试尽可能低门槛的介绍这些好玩的东东-这里只须要正态分布函数作为基础就可以開始玩图像的高斯滤波了. Don't panic ! 在通常的图像中,像素点都非常多,非常多情况都是非常多一大块像素点记录某一个场景区域.那么这就数字离散环境下模拟出了实际生活中颜色变化连续性的事实(注意.计算机的离散环境都是对真实的模拟.) 高斯滤波是怎么回事捏?一句话的事情.就是利用高斯函数取权值,在一个区域内进行加权平均! 简单的事情永远别搞复杂了.p

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

高斯平滑 高斯模糊 高斯滤波器 ( Gaussian Smoothing, Gaussian Blur, Gaussian Filter ) C++ 实现

 发展到现在这个平滑算法的时候, 我已经完全不知道如何去命名这篇文章了, 只好罗列出一些关键字来方便搜索了. 在之前我们提到过了均值滤波器, 就是说某像素的颜色, 由以其为中心的九宫格的像素平均值来决定. 在这个基础上又发展成了带权的平均滤波器, 这里的高斯平滑或者说滤波器就是这样一种带权的平均滤波器. 那么这些权重如何分布呢? 我们先来看几个经典的模板例子: 尝试了使用这些滤波器对我们原来的图进行操作, 得到了这样的一组结果: 原图: 3x3 高斯: 5x5 高斯: 单纯从效果来看, 两个