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

C++Builder 影像特效處理實作:柔化、銳化、浮雕演算法與像素級優化

     編輯:關於C++

C++Builder 的 TCanvas::Pixels 屬性雖方便存取單一像素,但逐點呼叫極其低效。本文展示以 ScanLine 逐行存取、3x3 卷積核為基礎的三種經典影像特效——柔化(平滑)、銳化、浮雕——的完整實作,並說明邊界處理、數值飽和、效能優化要點。

一、資料結構與前置作業

struct RGB { BYTE r, g, b; };
RGB** rgb;           // [width][height] 原始像素快取
Graphics::TBitmap* bmpDst; // 輸出位圖
int w, h;

void __fastcall TForm1::LoadImage() {
    if (!OpenPictureDialog1->Execute()) return;
    Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
    w = Image1->Width; h = Image1->Height;
    rgb = new RGB*[w];
    for (int x=0; xPicture->Bitmap->ScanLine[y];
        for (int x=0; xWidth = w; bmpDst->Height = h;
    bmpDst->PixelFormat = pf24bit;
}

二、通用 3x3 卷積框架

void ApplyKernel(const int kernel[3][3], int divisor, int bias = 0) {
    for (int y=1; yScanLine[y];
        for (int x=1; x255)?255:r;
            g = (g<0)?0:(g>255)?255:g;
            b = (b<0)?0:(b>255)?255:b;
            dst[x*3+2] = r; dst[x*3+1] = g; dst[x*3+0] = b; // BGR
        }
    }
    Image1->Picture->Bitmap->Assign(bmpDst);
}

三、三大特效核心參數

特效卷積核除數偏移說明
柔化全 1,中心 8(或全 5,中心 60)9 (或 100)0鄰域平均,降低高頻雜訊
銳化對角線差分:中心 1+degree,對角 -degree10增強邊緣,degree=0.3~0.5
浮雕對角線差分:中心 1,對角 -11128凸顯輪廓,灰階中性

具體呼叫範例

// 柔化
void __fastcall TForm1::btnSmoothClick(TObject*) {
    int k[3][3] = {{5,5,5},{5,60,5},{5,5,5}};
    ApplyKernel(k, 100);
}

// 銳化
void __fastcall TForm1::btnSharpenClick(TObject*) {
    float d = 0.3f;
    int k[3][3] = {{0,0,0},{0,1+d,-d},{0,0,0}}; // 簡化版:僅用左上對角
    // 完整版需 3x3 浮點核,此處示範整數近似
    ApplyKernel(k, 1);
}

// 浮雕
void __fastcall TForm1::btnEmbossClick(TObject*) {
    int k[3][3] = {{-1,-1,0},{-1,1,1},{0,1,1}};
    ApplyKernel(k, 1, 128);
}

四、效能優化關鍵

  1. ScanLine 取代 Pixels:Pixels[x][y] 每次觸發邊界檢查與格式轉換,ScanLine 直接操作記憶體,快 50~100 倍。
  2. 整數運算避免浮點:核心權重放大 100 倍存為 int,最後除以 100。
  3. 查表法飽和:預計算 BYTE clamp[512] 替代 if 分支。
  4. 多執行緒分塊:OpenMP #pragma omp parallel for 處理不同掃描線區段。
  5. SIMD 內建函數:MSVC __m128i 並行處理 8 個像素。

五、擴充:更多卷積特效

  • 邊緣偵測:Sobel、Prewitt、Laplacian 核
  • 高斯模糊:可分離核,兩次 1D 卷積 O(n) 替代 O(n²)
  • 動態模糊:方向性核
  • 自適應銳化:依局部對比度動態調整 degree

六、總結

掌握 ScanLine 記憶體佈局(24-bit BGR、每行 4 位元組對齊)、3x3 卷積通用框架、整數飽和運算,即可在 C++Builder 高效實作多種影像特效。完整專案含即時預覽、參數滑桿調整,歡迎下載原始碼深入研究。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved