双边滤波C++实现


双边滤波 纯C++实现,支持8位灰度图像和24位真彩图像
资源截图
代码片段和文件信息

#include
#include 
#include “stdafx.h“
#include “Bilateral.h“

bool ImageFilter(unsigned char* imageint Widthint Heightint BandNumunsigned char* outimage)
{

int rgbWidth = Width;
int rgbHeight = Height;
int rgbBandnum = BandNum;


int ijk;                                   //定义循环变量
unsigned char* pRgbImg = nullptr; //用于存储原始图像数据
//开辟原始图像数据内存空间,输入为灰度图像,缺省设为1个颜色通道
pRgbImg = new unsigned char[rgbBandnum * rgbHeight * rgbWidth];     

//读取图像原始数据,并存储到定义的变量中
long lImgLength = rgbWidth * rgbHeight;

for (int k = 0; k < rgbBandnum; k++)
{
for (j = 0; j < rgbHeight; j++)
{
for (i = 0; i < rgbWidth; i++)
{
pRgbImg[(i + j * rgbWidth) + k * lImgLength] = image[i + j * rgbWidth + k * lImgLength];
}
}
}



//2.第二步:进行高斯滤波算法设计
//2.1步:定义高斯滤波相关变量
unsigned char *pImgFilter=NULL;    //存储高斯滤波后的数据
pImgFilter=new unsigned char[rgbBandnum * rgbWidth*rgbHeight];
// memset(pImgFilter0sizeof(unsigned char)*rgbWidth*rgbHeight);
//2016.9.19 9:00 zs更改,为完全消除边界黑边,先给输出图像赋值为输入图像
for (int k= 0; k < rgbBandnum; k++)
{
for(int i = 0;i < rgbHeight;++i)
{
for(int j = 0; j < rgbWidth;++j)
{
pImgFilter[i * rgbWidth + j + k * lImgLength] = image[i * rgbWidth + j + k * lImgLength];
}
}
}

int nFilterWidth = 9;   //滤波器宽度
int nFilterHeight = 9;  //滤波器高度
double dSigmaGuass = 3;      //滤波参数方差
unsigned char *pArray = new unsigned char[nFilterWidth*nFilterHeight];  //保存窗口内的像素灰度值
double *pdKernal = new double[nFilterWidth*nFilterHeight]; //高斯核数组
int nCentre_x = nFilterWidth/2;
int nCentre_y = nFilterHeight/2;
double dSum = 0.0; //求和,用于权系数归一化

//得到高斯滤波器权系数
for (i = 0; i < nFilterHeight; i++)
{
for (j = 0; j < nFilterWidth; j++)
{
int nDis_x = i-nCentre_x;
int nDis_y = j-nCentre_y;   
//pdKernal[j+i*nFilterWidth] = exp(-(1/2)*(nDis_x*nDis_x+nDis_y*nDis_y)/(dSigma*dSigma))
pdKernal[j+i*nFilterWidth] = exp(-(1./2.)*(nDis_x*nDis_x+nDis_y*nDis_y)/(dSigmaGuass*dSigmaGuass));//zs9.24 11:30改
//高斯公式的表示
dSum = dSum + pdKernal[j+i*nFilterWidth];
}
}
//权系数归一化
for (i = 0; i < nFilterHeight; i++)
{
for (j = 0; j < nFilterWidth; j++)
{

pdKernal[j+i*nFilterWidth] = pdKernal[j+i*nFilterWidth]/dSum;
// std::cout< }
// std::cout< }

// double* dPixelKernal = new double[nFilterWidth*nFilterHeight];//值域核
double* dFinalKernal = new double[nFilterWidth*nFilterHeight];//最终的核函数

int nFilter_x=nFilterWidth/2;
int nFilter_y=nFilterHeight/2;                            //用于索引窗口内的数值


for (int k = 0; k < rgbBandnum; k++)
{
for (i = nFilter_y; i < rgbHeight-nFilter_y; i++)  //一般i对应高度,j对应宽度,先是i不变,j增加
{
for (j = nFilter_x; j < rgbWidth-nFilter_x; j++)
{
GetFinalKernal(pRgbImgnFilterWidthnFilterHeightpdKernaldFinalKernalijkrgbWidthlImgLength);
GetWindowArray(ijkpRgbImgpArraynFilterHeightnFilterWidthrgbWidthlIm

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2016-11-02 21:15  BilateralFilter
     目录           0  2016-11-02 21:13  BilateralFilterBilateralFilter
     文件    77791232  2016-11-02 21:15  BilateralFilterBilateralFilter.sdf
     文件         912  2016-11-01 15:53  BilateralFilterBilateralFilter.sln
     文件       25600  2016-11-02 21:15  BilateralFilterBilateralFilter.v11.suo
     文件     5832054  2016-11-02 21:09  BilateralFilterBilateralFilterBilateral.bmp
     文件        6675  2016-11-02 21:15  BilateralFilterBilateralFilterBilateral.cpp
     文件         507  2016-11-02 20:03  BilateralFilterBilateralFilterBilateral.h
     文件        3034  2016-11-02 21:15  BilateralFilterBilateralFilterBilateralFilter.cpp
     文件          39  2016-11-01 15:53  BilateralFilterBilateralFilterBilateralFilter.h
     文件        2652  2016-11-01 15:53  BilateralFilterBilateralFilterBilateralFilter.rc
     文件        5117  2016-11-01 16:41  BilateralFilterBilateralFilterBilateralFilter.vcxproj
     文件        1834  2016-11-01 16:36  BilateralFilterBilateralFilterBilateralFilter.vcxproj.filters
     文件         164  2016-11-01 16:39  BilateralFilterBilateralFilterBilateralFilter.vcxproj.user
     目录           0  2016-11-02 21:13  BilateralFilterBilateralFilterDebug
     文件      105243  2016-11-02 21:13  BilateralFilterBilateralFilterDebugBilateral.obj
     文件        2888  2016-11-02 21:13  BilateralFilterBilateralFilterDebugBilateralFilter.Build.CppClean.log
     文件          80  2016-11-02 21:13  BilateralFilterBilateralFilterDebugBilateralFilter.lastbuildstate
     文件        2807  2016-11-02 21:13  BilateralFilterBilateralFilterDebugBilateralFilter.log
     文件      108809  2016-11-02 21:13  BilateralFilterBilateralFilterDebugBilateralFilter.obj
     文件    34078720  2016-11-02 21:13  BilateralFilterBilateralFilterDebugBilateralFilter.pch
     文件         128  2016-11-02 21:13  BilateralFilterBilateralFilterDebugBilateralFilter.res
     文件        2606  2016-11-02 21:13  BilateralFilterBilateralFilterDebugcl.command.1.tlog
     文件       38376  2016-11-02 21:13  BilateralFilterBilateralFilterDebugCL.read.1.tlog
     文件        1976  2016-11-02 21:13  BilateralFilterBilateralFilterDebugCL.write.1.tlog
     文件           2  2016-11-02 21:13  BilateralFilterBilateralFilterDebuglink-cvtres.read.1.tlog
     文件           2  2016-11-02 21:13  BilateralFilterBilateralFilterDebuglink-cvtres.write.1.tlog
     文件           2  2016-11-02 21:13  BilateralFilterBilateralFilterDebuglink-mt.read.1.tlog
     文件           2  2016-11-02 21:13  BilateralFilterBilateralFilterDebuglink-mt.write.1.tlog
     文件           2  2016-11-02 21:13  BilateralFilterBilateralFilterDebuglink-rc.read.1.tlog
     文件           2  2016-11-02 21:13  BilateralFilterBilateralFilterDebuglink-rc.write.1.tlog
............此处省略55个文件信息

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

发表评论

评论列表(条)