vs2015+opencv3.3.1 实现 c++ 双边滤波器(Bilateral Filter)
#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;
}
}
}
vs2015+opencv3.3.1 实现 c++ 双边滤波器(Bilateral Filter)的更多相关文章
- 【VS开发】【图像处理】双边滤波器bilateral filter
目录(?)[-] 简介 原理 代码实现 1 Spatial Weight 2 Similarity Weight 3 Color Filtering 在SSAO中的使用 1. 简介 图像平滑是一个重要 ...
- win7下VS2015+opencv3.1.0配置
由于opencv与vs的适配版本不同,本人在官网下载opencv3.1.0,其可以和VS2013.VS2015适配,文中以VS2015为例 opencv2.4.13-----vc11;vc12 ope ...
- [转]VS2015+OpenCV3.3 GPU模块和opencv_contrib模块的编译以及采用CMake编译opencv_contrib时提示“No extra modules found in folder”问题的解决方案
据官方说法,目前还不是太稳定的算法模块都在opencv_contrib里边,由于不稳定,所以不能在release版本里发行,只有在稳定以后才会放进release里边.但是这里边有很多我们经常要用的算法 ...
- Win10 64位+VS2015+Opencv3.3.0安装配置
Win10 64位+VS2015+Opencv3.3.0安装配置 1.我们首先下载VS2015.OpenCV3.3.0. 1.1 VS2015下载 在官网https://visualstudio.mi ...
- 【C++】双边滤波器(bilateral filter)
Bilateral Filtering for Gray and Color Images 双边滤波器:保留边界的平滑滤波器. 在局部上,就是在灰度值差异不大的区域平滑,在灰度值差异比较大的边界地区保 ...
- win10+VS2015+opencv3.4.0配置方法
win10+VS2015+opencv3.4.0配置方法 操作环境: windows10 64位opencv 3.4.0:https://opencv.org/releases.html(选择open ...
- vs2015+opencv3.3.1 实现 c++ 彩色高斯滤波器(Gaussian Smoothing, Gaussian Blur, Gaussian Filter)
//高斯滤波器 https://github.com/scutlzk#include <opencv2\highgui\highgui.hpp> #include <iostream ...
- vs2015+opencv3.3.1 实现 c++ 灰度高斯滤波器
#include <opencv2\highgui\highgui.hpp> #include <iostream> #include<vector> using ...
- win10+vs2015+opencv3.0 x86/x64配置(debug+release)
最近做一些图像识别的项目,用到了opencv,opencv3.1没有x86版本,所以只能用opencv3.0来完成,下面介绍一下在window10下vs2015 配置opencv3.0的过程(x86和 ...
随机推荐
- HBuilder使用技巧
ctrl+ Tab 切换 ctrl + shift + D 查找所写的函数
- springboot成神之——spring的文件上传
本文介绍spring的文件上传 目录结构 配置application DemoApplication WebConfig TestController 前端上传 本文介绍spring的文件上传 目录结 ...
- Vue 简单的总结三
一.安装脚手架 1.下载node.js,本文下载版本为node-v8.12.0-x64.msi,一键式安装. 2.安装按成后,打开终端,输入node,可进入node环境(两次ctrl+c退出),如下图 ...
- MySQL备份还原之一mydumper
1)源码编译安装 1.下载 mydumper源码 2.解压 [mysql@localhost ~]$ tar -xvf mydumper-0.9.1.tar mydumper-0.9.1/CMakeL ...
- minerd.exe 处理
:top TASKKILL /F /IM "minerd.exe" Goto top and then searching the file system for minerd.e ...
- java实现 数组中两个元素相加等于指定数的所有组合
package com.algorithm.hash; public class alg1 { public static void main(String argv[]) { int[] arr ...
- 面试题:java实例变量,局部变量,类变量 背1
一.实例变量 也叫对象变量.类成员变量:从属于类由类生成对象时,才分配存储空间,各对象间的实例变量互不干扰,能通过对象的引用来访问实例变量.但在Java多线程中,实例变量是多个线程共享资源,要注意同步 ...
- Linux ekho
一.简介 Ekho(余音)是一个免费.开源的中文语音合成软件.它目前支持粤语.普通话(国语).诏安客语.藏语.雅言(中国古代通用语)和韩语(试验中),英文则通过Festival间接实现.Ekho支持L ...
- Luogu 4755 Beautiful Pair
分治 + 主席树. 设$solve(l, r)$表示当前处理到$[l, r]$区间的情况,我们可以找到$[l, r]$中最大的一个数的位置$mid$,然后扫一半区间计算一下这个区间的答案. 注意,这时 ...
- Vue.js 安装及其环境搭建
For me or other first studying vue.js. For Windows PC: 1.先安装node.js 安装官网最新的即可 版本应该要大于6.0版本 nodejs的官网 ...