本文提供基於遞歸濾波的 O(1) 高斯模糊完整 C 實作,參考 ImageShop 博文演算法,支援多通道影像、任意 sigma 值,並包含呼叫範例與優化建議。
q 由 sigma 經經驗公式計算,再推導係數 b0~b3, B。void IMG_GaussBlur(
unsigned char* src, // 原始影像資料
unsigned char* dst, // 輸出影像資料
int width, // 寬度
int height, // 高度
int stride, // 每行位元組數(含 padding)
int chan, // 通道數(1/3/4)
float sigma // 高斯標準差
);
fTab 查表),避免遞歸中 0 值導致數值衰減。w1、w2。in/out/w1/w2,處理完畢 free 釋放。float q; if (sigma >= 2.5) q = 0.98711f * sigma - 0.96330f; else if (sigma >= 0.5) q = 3.97156f - 4.14554f * sqrtf(1 - 0.26891f * sigma); else q = 0.1147705f; float q2 = q*q, q3 = q2*q; float b0 = 1.57825f + 2.44413f*q + 1.4281f*q2 + 0.422205f*q3; float b1 = (2.44413f*q + 2.85619f*q2 + 1.26661f*q3) / b0; float b2 = (-(1.4281f*q2 + 1.26661f*q3)) / b0; float b3 = (0.422205f*q3) / b0; float B = 1.0f - (b1 + b2 + b3);
IplImage* src = cvLoadImage("./test.jpg", 1);
IplImage* dst = cvLoadImage("./test.jpg", 1);
IMG_GaussBlur((unsigned char*)src->imageData,
(unsigned char*)dst->imageData,
src->width, src->height,
src->widthStep, src->nChannels, 2.0f);
float* 陣列替代 malloc 多次配置,減少碎片。sqrt 運算。