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_x和sobel_y
Mat
magnitude, angle;
cartToPolar(sobel_x, sobel_y, magnitude, angle, true);
使用cartToPolar將Sobel計算出的水平梯度sobel_x和垂直梯度sobel_y轉換為magnitude和angle。幅度表示圖像中邊緣的強度,而梯度方向表示邊緣的方向。True為梯度方向用角度來表示。
Mat norm_magnitude;
normalize(magnitude, norm_magnitude, 0, 255, NORM_MINMAX, CV_8UC1);
這裡,magnitude是原始梯度幅度,norm_magnitude是標準化後的梯度幅度。0和255是新值的最小和最大值。NORM_MINMAX是表示將原始值線性映射到最小和最大值之間。CV_8UC1是矩陣類型,表示8位無符號單通道圖像。norm_magnitude將用於素描線條的圖像。
Mat sketch = 255 - norm_magnitude;
將 255 減去 norm_magnitude 中的每個像素值,使得邊緣部分變為黑色線條,而非邊緣部分變為白色背景。這樣就可以造成視覺上素描效果。
留言
張貼留言