1061549 作業2

 

1112 Digital Image Processing Assignment #2

 

主題: 線條自畫像 (二值化與邊緣偵測 Image Thresholding and Edge Detection) 撰寫一個程式,以灰階模式讀取一張圖像 imread(path, IMREAD_GRAYSCALE) (a)利用 Sobel Operators 偵測並輸出邊緣成分圖 (b)設計一個類似素描線條的自畫像圖案。(想想:如何使用邊緣偵測所得到的點,結合 成看似素描筆畫出的線條?)

開發環境: Windows 10 Visual Studio 2022 C++ OpenCV-4.7.0

程式說明:

    string image_path = "fig.jpg";

    Mat src = imread(image_path, IMREAD_COLOR);

讀取圖像,並將其存儲在src變量中。

Mat gray_image;

cvtColor(src, gray_image, COLOR_BGR2GRAY);

使用cvtColor函數將原始彩色圖像轉換為灰度圖像,src是原始彩色圖像,gray_image是轉換後的灰度圖像。COLOR_BGR2GRAY是一個標誌,將圖像從BGR顏色轉換為灰度顏色。

Mat sobel_x, sobel_y;

    int ksize = 3; 

    Sobel(gray_image, sobel_x, CV_32F, 1, 0, ksize);

    Sobel(gray_image, sobel_y, CV_32F, 0, 1, ksize);

使用Sobel來分別計算圖像的水平和垂直邊緣,並將結果存儲在sobel_xsobel_y

   Mat magnitude, angle;

    cartToPolar(sobel_x, sobel_y, magnitude, angle, true);

使用cartToPolarSobel計算出的水平梯度sobel_x和垂直梯度sobel_y轉換為magnitudeangle。幅度表示圖像中邊緣的強度,而梯度方向表示邊緣的方向。True為梯度方向用角度來表示。

Mat norm_magnitude;

    normalize(magnitude, norm_magnitude, 0, 255, NORM_MINMAX, CV_8UC1);

這裡,magnitude是原始梯度幅度,norm_magnitude是標準化後的梯度幅度。0255是新值的最小和最大值。NORM_MINMAX是表示將原始值線性映射到最小和最大值之間。CV_8UC1是矩陣類型,表示8位無符號單通道圖像。norm_magnitude將用於素描線條的圖像。

    Mat sketch = 255 - norm_magnitude;

255 減去 norm_magnitude 中的每個像素值,使得邊緣部分變為黑色線條,而非邊緣部分變為白色背景。這樣就可以造成視覺上素描效果。

圖片和影片;https://www.youtube.com/watch?v=h__yBNccH1M



留言

這個網誌中的熱門文章

rzwang Homework #1

s1093350 Homework #2

s1091537 Homework #1