# 🖼️ 影像辨識 – 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)