---
# System prepended metadata

title: ' Sobel 邊緣偵測'

---

# 🖼️ 影像辨識 – Sobel邊緣偵測

### 什麼是 Sobel 邊緣偵測？
Sobel 邊緣偵測是一種經典的影像處理方法，用於檢測圖像中的邊緣。它主要通過計算像素灰度值的梯度來找到邊界。

### 技術原理
1. **梯度計算**：使用 Sobel 運算子分別在水平方向（x軸）和垂直方向（y軸）計算圖像的梯度。
2. **邊緣強度**：將水平方向和垂直方向的梯度值結合，生成邊緣強度圖。
3. **高亮邊緣**：邊緣位置通常是灰度值變化最劇烈的區域。

### 運算子矩陣
Sobel 運算子包括兩個核心卷積核：
- 水平方向：
  $$ G_x = \begin{bmatrix} 
  -1 & 0 & 1 \\ 
  -2 & 0 & 2 \\ 
  -1 & 0 & 1 
  \end{bmatrix} $$  
- 垂直方向：
  $$ G_y = \begin{bmatrix} 
  1 & 2 & 1 \\ 
  0 & 0 & 0 \\ 
  -1 & -2 & -1 
  \end{bmatrix} $$

### 優點與用途
- **優點**：計算簡單且效果良好，適合快速邊緣檢測。
- **用途**：廣泛應用於圖像處理，例如物體識別、模式分析和視覺導航。

---

## 📈 流程圖
![圖片6](https://hackmd.io/_uploads/B1Ky9tn01x.png)

---

## 💻 程式碼解說
```cpp=
#include <iostream>
#include <stdlib.h>
#include "bmp.h"

using namespace std;
int R[MaxBMPSizeX][MaxBMPSizeY]; // MaxBMPSizeX 和 MaxBMPSizeY 在 "bmp.h" 中定義
int output[MaxBMPSizeX][MaxBMPSizeY]; //輸出圖片 

int maskGX[3][3] = {
    {-1 , 0 , 1},
    {-2 , 0 , 2},
    {-1 , 0 , 1},
};
int maskGY[3][3] = {
    {-1 , -2 , -1},
    { 0 ,  0 ,  0},
    { 1 ,  2 ,  1},
};

int main()
{
    int width, height;
    int i, j;

    open_bmp("Lenna.bmp", R, R, R, width, height); // 用於灰階影像

    // 邊緣偵測
    for (j = 1; j < height-1; j++) {
        for (i = 1; i < width-1; i++) {
            int gx = 0;
            int gy = 0;

            // 計算 x 方向梯度
            for (int m = -1; m <= 1; m++) {
                for (int n = -1; n <= 1; n++) {
                    gx += R[i + m][j + n] * maskGX[m + 1][n + 1];
                }
            }

            // 計算 y 方向梯度
            for (int m = -1; m <= 1; m++) {
                for (int n = -1; n <= 1; n++) {
                    gy += R[i + m][j + n] * maskGY[m + 1][n + 1];
                }
            }

            // 計算梯度的絕對值相加 
            output[i][j] = abs(gx) + abs(gy);
        }
    }

    save_bmp("lena_new.bmp", output, output, output); //灰階影像
    printf("邊緣偵測完成！\n");

    close_bmp();

    system("PAUSE");
    return 0;
}
```

---

## 🖼️ 結果呈現
| 原始圖像 | Sobel邊緣偵測後 |
|----------|------------------|
| ![Lenna](https://hackmd.io/_uploads/S12h9t3Rye.bmp)|![lena_new](https://hackmd.io/_uploads/S1Ua9Yn0Jx.bmp)
