首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

快速高斯模糊演算法:C 語言完整實作與優化指南

     編輯:關於C語言

快速高斯模糊演算法:C 語言完整實作與優化指南

本文提供基於遞歸濾波的 O(1) 高斯模糊完整 C 實作,參考 ImageShop 博文演算法,支援多通道影像、任意 sigma 值,並包含呼叫範例與優化建議。

演算法核心:Deriche 遞歸濾波

  • 傳統卷積:O(k²) 隨 kernel 大小增長。
  • 遞歸濾波:利用高斯核的可分離性與遞歸特性,達到與 kernel 大小無關的常數時間。
  • 核心參數 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           // 高斯標準差
);

關鍵實作細節

  1. 邊界擴展:上下左右各擴展 3 像素,採用邊緣像素複製,避免邊界伪影。
  2. 像素值偏移:0~255 映射為 1~256(fTab 查表),避免遞歸中 0 值導致數值衰減。
  3. 雙向遞歸:縱向先正向後反向,橫向同理,使用暫存陣列 w1、w2。
  4. 記憶體管理:動態配置 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);

OpenCV 呼叫範例

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 多次配置,減少碎片。
  • 利用 SIMD(SSE/AVX/NEON)向量化遞歸迴圈。
  • 針對固定 sigma 預計算係數表,避免重複 sqrt 運算。
  • 多執行緒平行化:以行或通道為單位分配任務。

適用場景與限制

  • ✅ 即時影像處理、行動裝置、大半徑模糊。
  • ❌ 極高精度科學計算(遞歸為近似解)、非高斯核需求。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved