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

时间:2022-07-08 18:26:04

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

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

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

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


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

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

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

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

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

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

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

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


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


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

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


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

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

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

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

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

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

其中双边滤波器 Bilateral Filtering for Gray and Color Images为空域(像素的坐标)高斯函数的标准差,双边滤波器 Bilateral Filtering for Gray and Color Images为值域(像素值0-255)高斯函数的标准差。空域滤波系数由像素间的空间距离决定,距离越小,系数越大。值域滤波系数由像素间的相似度决定,像素值越接近,系数越大。


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


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

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



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])); //打点显示图像
}