--- title: 'CS362 Assignment #2' disqus: hackmd --- 線條自畫像 (二值化與邊緣偵測 Image Thresholding and Edge Detection) === ## 目錄 [TOC] ## 作業說明 撰寫一個程式,以灰階模式讀取一張圖像 imread(path, IMREAD_GRAYSCALE) (a)利用 Sobel Operators 偵測並輸出邊緣成分圖 (b)設計一個類似素描線條的自畫像圖案。 ![](https://i.imgur.com/ckG40Yo.png) ## 開發環境 ``` $ uname -srvmio Linux 5.19.0-35-generic #36~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Feb 17 15:17:25 UTC 2 x86_64 x86_64 GNU/Linux $ gcc --version gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0 $ pkg-config --modversion opencv4 4.5.4 ``` ## 程式碼說明 #### 宣告與初始化變數 ```cpp=1 // include opencv 與 stdio library #include "opencv2/highgui.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/photo.hpp" #include "opencv2/opencv.hpp" #include <stdio.h> // 定義GUI視窗名稱、圖片路徑 #define WINDOW_TITLE(...) "Image " __VA_ARGS__ #define FILE_PATH "./fig.jpg" // 使用 cv namespace using namespace cv; ``` #### 函式宣告 ```cpp=15 int main() { // load image from path Mat src, blur, gray, output_a, output_b1, output_b2; src = imread(FILE_PATH); if (src.empty()) { printf("%s", "Error loading image \n"); return -1; } // convert color image to gray image cvtColor(src, gray, COLOR_RGB2GRAY); // use blur to reduce noise GaussianBlur(gray, blur, Size(7, 7), 0); // sobel edge detect Sobel(blur, output_a, -1, 1, 1, 5); bitwise_not(output_a, output_a); // cv2 built-in sketch pencil effect pencilSketch(src, output_b1, output_b2, 100, 0.07, 0.07); // create window and show output namedWindow(WINDOW_TITLE("Edge Detect"), WINDOW_AUTOSIZE); imshow(WINDOW_TITLE("Edge Detect"), output_a); namedWindow(WINDOW_TITLE("Sketch"), WINDOW_AUTOSIZE); imshow(WINDOW_TITLE("Sketch"), output_b1); // color Sketch // namedWindow(WINDOW_TITLE("Sketch2"), WINDOW_AUTOSIZE); // imshow(WINDOW_TITLE("Sketch2"), output_b2); waitKey(0); return 0; } ``` ## 程式展示 ### 編譯 ```bash= cmake . make ``` ![](https://i.imgur.com/uN2uLq4.png =600x400) ![](https://i.imgur.com/rMu3HSO.png =600x400) ### 執行 ```bash= ./HW2 ``` ![](https://i.imgur.com/kzuPyAp.png =600x400) 邊緣偵測 ![](https://i.imgur.com/WQty8xG.png =500x400) 素描效果 ![](https://i.imgur.com/vetmGxG.png =500x400) ## 參考資料 [cv::pencilSketch](https://docs.opencv.org/4.7.0/df/dac/group__photo__render.html#gae5930dd822c713b36f8529b21ddebd0c) [cv:Sobel](https://docs.opencv.org/4.7.0/d4/d86/group__imgproc__filter.html#gacea54f142e81b6758cb6f375ce782c8d) ###### tags: `CS362` `s1081050` `HW2`