您的位置:首页 > 其它

双边滤波器 Bilateral Filtering for Gray and Color Images

2016-10-11 21:01 721 查看
  双边滤波(bilateral filter)是一种非线性滤波器,算法结合空间信息(像素的坐标)和亮度相似性(像素值0-255)对图像进行滤波处理,在平滑滤波的同时能大量保留图像的边缘和细节特征 。

积分,通用均值滤波和高斯滤波,f(x)为输入图像,h(x)为输出图像
:



1/kd(x)为归一化参数,保证绝对平滑的位置灰度值不变。





积分下:空间信息(像素的坐标):



积分下:亮度相似性(像素值0-255):



权重系数W( i, j, k,
l)对应积分的表示:





对应的,离散求和,f(i,j)为输入图像,g(i,j)为输出图像 ,以输入图像(k,l)为中心的邻域,求和范围是模板覆盖的范围:



离散下:空间信息(像素的坐标):



离散下:亮度相似性(像素值0-255):



权重系数W(
i, j, k, l)=d( i, j, k, l) * r(
i, j, k, l):



其中

为空域(像素的坐标)高斯函数的标准差,

为值域(像素值0-255)高斯函数的标准差。空域滤波系数由像素间的空间距离决定,距离越小,系数越大。值域滤波系数由像素间的相似度决定,像素值越接近,系数越大。



双边滤波效果图(delta_d=3;//空间位置方差
   delta_r=100;//亮度方差)



void CShowPicView::OnBilateralFilter() // 双边滤波

{
CShowPicDoc* pDoc = GetDocument();
CDC* pDC=GetDC();
// 字符串
CString str;
int x,y;
int i,j,k,l;
double W_ijkl, D_ijkl, R_ijkl;
double Sum_W_ijkl;
double delta_d=3,delta_r=100;//空间位置方差,亮度方差
unsigned char g[610][800]={0};//存放输出图像的像素值
double Sum_Data;

// 滤波器的高度
int iFilterH= 11;
// 滤波器的宽度
int iFilterW= 11;

// 中心元素的X坐标
int iFilterMX= 5;

// 中心元素的Y坐标
int iFilterMY= 5;

int lHeight=intHeight;//图像的宽
int lWidth=intWidth;//图像的宽

// 行(除去边缘几行)
for(i = iFilterMY; i < lHeight - iFilterH + iFilterMY + 1; i++)
{
// 列(除去边缘几列)
for(j = iFilterMX; j < lWidth - iFilterW + iFilterMX + 1; j++)
{
Sum_W_ijkl=0;//图像中心位置移动,置零
Sum_Data=0;

for (k = i-5; k < iFilterH+i-5; k++)
{
for (l = j-5; l < iFilterW+j-5; l++)
{
D_ijkl = exp(-1 * (pow(k-i,2)+pow(l-j,2))/(2*delta_d*delta_d) );
R_ijkl = exp(-1 *  pow(Data[k][l]-Data[i][j],2)/(2*delta_r*delta_r) );
W_ijkl = D_ijkl*R_ijkl;

Sum_Data+=W_ijkl*Data[k][l];
Sum_W_ijkl += W_ijkl;//权重累加和
}
}
g[i][j]=Sum_Data/Sum_W_ijkl;
}
}

for(y = 0; y < intHeight-1; y++)
for(int x = 0; x < intWidth-1; x++)
pDC->SetPixel(x+1*intWidth+30,y,RGB(g[y][x],g[y][x],g[y][x]));
//打点显示图像

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: