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

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

     編輯:VC 教學

像素存取基礎

TCanvas::Pixels[x][y] 存取單像素極慢 (每次函數呼叫、顏色轉換)。高效能做法:

  • 鎖定位圖記憶體:ScanLine[y] 取得行指標。
  • 直接操作 BYTE* 陣列 (BGR 順序,24-bit 為 3 bytes/pixel)。
  • 處理完再 Assign 回顯示控件。

資料結構

struct RGB { BYTE r, g, b; };
RGB** rgb;  // [width][height] 或扁平化一維陣列
Graphics::TBitmap* bmpWork;  // 暫存結果位圖

載入圖片至 RGB 陣列

void __fastcall TForm1::LoadImageToArray()
{
    int w = Image1->Picture->Width;
    int h = Image1->Picture->Height;
    rgb = new RGB*[w];
    for (int i=0;iPicture->Bitmap->ScanLine[y];
        for (int x=0; xWidth = w; bmpWork->Height = h;
    bmpWork->PixelFormat = pf24bit;
}

3x3 卷積核通用框架

大多數空域濾鏡可表示為 3x3 核矩陣 K[3][3],輸出像素 = Σ鄰域像素 × 核權重 / 除數 (歸一化),再鉗制至 [0,255]。

特效核矩陣定義

效果核矩陣 (K)除數
柔化全 1 (中心可加大)9 (或 10, 16)
銳化[[0,-1,0],[-1,5,-1],[0,-1,0]]1
浮雕[[-2,-1,0],[-1,1,1],[0,1,2]]1 + 128 偏移
邊緣偵測[[-1,-1,-1],[-1,8,-1],[-1,-1,-1]]1

通用濾鏡實作

void ApplyFilter(int kernel[3][3], int divisor, int offset = 0)
{
    int w = bmpWork->Width, h = bmpWork->Height;
    for (int y=1; yScanLine[y];
        for (int x=1; xPicture->Bitmap->Assign(bmpWork);
}

按鈕事件範例

void __fastcall TForm1::btnBlurClick(TObject *Sender) {
    int k[3][3] = {{1,1,1},{1,2,1},{1,1,1}};  // 高斯近似
    ApplyFilter(k, 10);
}

void __fastcall TForm1::btnSharpenClick(TObject *Sender) {
    int k[3][3] = {{0,-1,0},{-1,5,-1},{0,-1,0}};
    ApplyFilter(k, 1);
}

void __fastcall TForm1::btnEmbossClick(TObject *Sender) {
    int k[3][3] = {{-2,-1,0},{-1,1,1},{0,1,2}};
    ApplyFilter(k, 1, 128);  // 偏移 128 產生灰底浮雕感
}

資源釋放

__fastcall TForm1::~TForm1() {
    for (int i=0;i

進階優化

  • 使用整數運算避免浮點 (如上)。
  • 分離式濾波:高斯柔化可分為水平+垂直兩次 1D 卷積,複雜度 O(2n) → O(n)。
  • SIMD (SSE/AVX) 並行處理 4/8/16 像素。
  • 大圖分塊處理以利快取。

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