PhotoShop算法實現進階-模糊濾鏡-高斯濾波(二十三)
來源:程序員人生 發布時間:2014-12-07 09:36:08 閱讀次數:5970次
PhotoShop算法實現進階-模糊濾鏡-高斯濾波(2103)
kezunhai@gmail.com
http://blog.csdn.net/kezunhai
高斯模糊(Gaus Blur)采取2維高斯模板對圖象進行模糊處理,用于圖象模糊化(去除細節和噪聲),它的處理效果給人1種更佳柔和的感覺。
1維高斯:

2維高斯:

理論上,高斯散布在所有定義域上都有非負值,這就需要1個無窮大的卷積核。實際上,僅需要取均值周圍3倍標準差內的值,之外部分直接去掉便可。 以下圖為1個標準差為1.0的整數值高斯核:

在有些場合,可以用下面的模塊來對高斯核進行近似:

本文實現算法根據用戶輸入的核尺寸和方差來計算高斯核,實現高斯濾波,高斯核創建算法以下:
// 創建高斯核
// kSize:卷積核的大小3、5、7等(3×3、5×5、7×7)
// sigma:方差
void PhotoShop::CreateGaussKernel(float **pdKernel, int kSize, float sigma)
{
float dDis; //數組中1點到中心點距離
float dCenter = (kSize⑴)/2;
float dSum = 0;
float dValue;
int i, j;
//生成高斯數據
for ( i=0; i<kSize; i++)
{
for ( j=0; j<kSize; j++)
{
dDis = fabsf(i-dCenter) + fabsf(j-dCenter); // 用和來近似平方和的開方
dValue = exp(-dDis*dDis/(2*sigma*sigma+DBL_EPSILON));
pdKernel[i][j] = dValue;
dSum+=dValue;
}
}
//歸1化
for ( i=0; i<kSize; i++)
{
for ( j=0; j<kSize; j++)
{
pdKernel[i][j] /= (dSum+DBL_EPSILON);
}
}
}
高斯濾波算法:
void PhotoShop::GaussianBlur(cv::Mat &img, cv::Mat &dst, int kSize, float sigma)
{
int height = img.rows;
int width = img.cols;
int chns = img.channels();
int i, j, k,p, q;
// 分配高斯核空間
float **pKernel = new float*[kSize];
for ( i=0; i<kSize; i++)
{
pKernel[i] = new float[kSize];
ZeroMemory(pKernel[i], kSize*sizeof(float));
}
CreateGaussKernel(pKernel, kSize, sigma); // 創建高斯核
if ( dst.empty())
dst.create(height, width, img.type());
float sum = 0;
int border = (kSize⑴)/2;
for ( i =border; i<height-border; i++)
{
unsigned char* dstData = (unsigned char*)dst.data + dst.step*i;
for ( j=border; j<width-border; j++)
{
for ( k=0; k<chns; k++)
{
sum = 0;
for ( p = -border; p<=border; p++)
{
for ( q = -border; q<=border; q++)
{
sum += getPixel(img, i+p, j+q, k)*pKernel[p+border][q+border];
}
}
dstData[j*chns+k] = saturate_cast<uchar>(sum+0.5);
} // for k
}
} // for i
}
算法測試:
高斯濾波由于其線性和良好的去噪效果,在很多算法中得到了廣泛的利用,如Canny算子的預處理就采取了高斯濾波,OpenCV中的Sobel算子的實現也采取高斯濾波作為預處理步驟,還是聞名古今的SIFT算子采取了高斯金字塔和高斯差分來進行候選特點點的提取,有興趣的朋友可以進1步深入了解高斯濾波的利用。
作者:kezunhai 出處:http://blog.csdn.net/kezunhai 歡迎轉載或分享,但請務必聲明文章出處。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈