• 大小: 295KB
    文件类型: .rar
    金币: 2
    下载: 0 次
    发布日期: 2021-05-14
  • 语言: 其他
  • 标签: 双边滤波  OpenCV  

资源简介

自己实现的双边滤波代码及测试图像,基于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


评论

共有 条评论