---
title: 'CS362 Assignment #2'
disqus: hackmd
---
線條自畫像 (二值化與邊緣偵測 Image Thresholding and Edge Detection)
===
## 目錄
[TOC]
## 作業說明
撰寫一個程式,以灰階模式讀取一張圖像 imread(path, IMREAD_GRAYSCALE)
(a)利用 Sobel Operators 偵測並輸出邊緣成分圖
(b)設計一個類似素描線條的自畫像圖案。

## 開發環境
```
$ 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
```


### 執行
```bash=
./HW2
```

邊緣偵測

素描效果

## 參考資料
[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`