# 🖼️ 影像辨識 – 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} $$
### 優點與用途
- **優點**:計算簡單且效果良好,適合快速邊緣檢測。
- **用途**:廣泛應用於圖像處理,例如物體識別、模式分析和視覺導航。
---
## 📈 流程圖

---
## 💻 程式碼解說
```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邊緣偵測後 |
|----------|------------------|
| |