s1081050 作業2
線條自畫像 (二值化與邊緣偵測 Image Thresholding and Edge Detection)
目錄
作業說明
撰寫一個程式,以灰階模式讀取一張圖像 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
程式碼說明
宣告與初始化變數
// 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;
函式宣告
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;
}
程式展示
編譯
cmake .
make
執行
./HW2
邊緣偵測
素描效果
留言
張貼留言