资源简介
自己实现的双边滤波代码及测试图像,基于OpenCV3.0&VS2013;;只需一个积分,如果没有积分,请带博客下留言邮箱,看到后会第一时间发送。博客地址:https://blog.csdn.net/u013921430/article/details/84532068

代码片段和文件信息
//-------------------------------------------------------------
//作者:不用先生,2018.11.26
//自实现的图像双边滤波算法
//bilateral.cpp
//-------------------------------------------------------------
#include “opencv2/core/core.hpp“
#include “opencv2/opencv.hpp“
#include “opencv2/highgui.hpp“
#include “opencv2/imgproc.hpp“
#include
#include
using namespace std;
using namespace cv;
//--------------------------------------------------------------
//函数名:my_Bilateral
//函数功能:自己编写的可用于灰度图及彩色图的双边滤波函数;
//参数:Mat &scr:输入图像,为单通道灰度图或三通道彩色图;
//参数:Mat &dst:输出图像,尺寸与通道数与输入图像吻合;
//参数:int d:滤波器大小,应该保证为奇数;
//参数:double sigmaColor:颜色域/像素值域方差,sigmaColor越大,平滑效果越好,对边缘的保护越弱;
//参数:double sigmaSpace:空间域方差,sigmaSpace越大,结果越平滑;
//--------------------------------------------------------------
bool my_Bilateral(Mat &scr Mat &dst int d double sigmaColor double sigmaSpace)
{
if (!scr.data)
{
cerr << “输入图像错误,请检查“ << endl;;
return false;
}
if (d % 2 == 0)
{
cerr << “输入窗口大小应该为奇数,请修改“< return false;
}
dst = scr.clone();
int row = dst.rows; //获取图像大小;
int col = dst.cols;
int copyBorderSize =floor(0.5+ d / 2);
Mat copyBorder_dst;
copyMakeBorder(dst copyBorder_dst copyBorderSize copyBorderSize copyBorderSize copyBorderSize BORDER_REFLECT);
int channels = dst.channels();
if (channels == 1) //如果是灰度图像
{
for (int i = 0; i < row; i++) //对每一个点进行处理
{
for (int j = 0; j < col; j++)
{
double weightSum = 0;
double filterValue = 0;
for (int row_d = -(d / 2); row_d <= (d / 2); row_d++) //以图像中的一点为中心,d为边长的方形区域内进行计算
{
for (int col_d = -(d / 2); col_d <= (d / 2); col_d++)
{
double distance_Square = row_d*row_d + col_d*col_d;
double value_Square = pow((scr.at(i j) - copyBorder_dst.at(i + (d / 2) + row_d j + (d / 2) + col_d)) 2);
double weight = exp(-1 * (distance_Square / (2 * sigmaSpace*sigmaSpace) + value_Square / (2 * sigmaColor*sigmaColor)));
weightSum += weight; //求滤波窗口内的权重和,用于归一化;
filterValue += (weight*copyBorder_dst.at(i + (d / 2) + row_d j + (d / 2) + col_d));
}
}
dst.at(i j) = filterValue / weightSum;
}
}
return true;
}
else if (channels == 3) //如果是RGB图像
{
for (int c = 0; c < channels; c++) //逐通道进行处理
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
double weightSum = 0;
double filterValue = 0;
for (int row_d = -(d / 2); row_d <= (d / 2); row_d++)
{
for (int col_d = -(d / 2); col_d <= (d / 2); col_d++)
{
double distance_Square = row_d*row_d + col_d*col_d;
double value_Square = pow((scr.at(i j)[c] - copyBorder_dst.at(i + (d / 2) + row_d j + (d / 2) + col_d)[c]) 2);
double weight = exp(-1 * (distance_Square / (2 * sigmaSpace*sigmaSpace) + value_Square / (2 * sigmaColor*sigmaColor)));
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 81718 2018-11-25 20:33 上传资源\03.jpg
文件 4677 2018-11-26 12:10 上传资源\bilateral.cpp
文件 53008 2015-10-22 11:12 上传资源\lena.jpg
文件 73585 2018-11-26 10:52 上传资源\temp1.jpg
文件 77633 2018-11-26 10:52 上传资源\temp2.jpg
文件 30440 2018-11-26 10:52 上传资源\temp3.jpg
目录 0 2018-11-26 12:11 上传资源
----------- --------- ---------- ----- ----
321061 7
- 上一篇:嵌入式系统设计与应用(第2版) 习题答案 清华大学出版社
- 下一篇:CST波纹喇叭
相关资源
- 基于OpenCV的数字识别468815
- 使用opencv去掉二值化图像中黑色面积
- opencv环境配置
- win10 64位下编译的opencv4.5.5库,opencv
- NVIDIAOpticalFlowSDK-79c6cee80a2df9a196f20afd6
- opencv_contrib-3.4.0.zip
- opencv2.4.9源码分析——SIFT
- 用两个摄像头实现,双目标定,双目
- opencv_traincascade训练分类器,手势识别
- opencv3.0交叉编译用parallel.cpp
- 基于opencv的图像识别识别图像中的色
- 基于openCV的识别特定颜色区域
- 基于OpenCV的分水岭算法实现
- QT+opencv+OCR 身份证号码,银行卡号识别
- opencv视频特定颜色区域识别
- 把RGB转换为HSV和HSI然后根据黄色和蓝
- opencv视觉测距
- 基于Qt和opencv的身份证号码识别系统
- opencv_ffmpeg249.dll
- SfM稀疏三维点云重建--完整工程文件
- 基于opencv的数人头程序源代码
- 利用OpenCV中的Stitcher类实现全景图像拼
- opencv实现的sift算法源码,包含了图像
- openCV 上的小波变换
- 基于OPENCV的车牌识别系统设计
- 617张国内车牌60-17bmp图片用于OpenCV正样
- hog特征提取,c版本代码
- 基于Qt5.8+OpenCV3.2的Basler多相机触发开
- 基于Opencv实现的图像纠偏
- ImageWatch2019.vsix
评论
共有 条评论