s1083323 作業2
作業二 線條自畫像
主題: 撰寫一個程式,以灰階模式讀取一張圖像 imread(path, IMREAD_GRAYSCALE)
(a)利用 Sobel Operators 偵測並輸出邊緣成分圖
(b)設計一個類似素描線條的自畫像圖案。(想想:如何使用邊緣偵測所得到的點,結合成看似素描筆畫出的線條?)
開發環境:
- Win10
- C++
- Open CV4.7.0
- VS 2019
(一)
將圖片讀入後,進行邊緣檢測
Mat edges;
GaussianBlur(img, img, Size(3, 3), 0, 0);
Mat grad_x, grad_y;
Sobel(img, grad_x, CV_16S, 1, 0, 3);
Sobel(img, grad_y, CV_16S, 0, 1, 3);
convertScaleAbs(grad_x, grad_x);
convertScaleAbs(grad_y, grad_y);
addWeighted(grad_x, 0.5, grad_y, 0.5, 0, edges);
讀取圖像並轉換為灰度模式。
使用高斯模糊函數 GaussianBlur() 對圖像進行平滑處理,這樣可以減少噪聲的影響。
使用 Sobel 函數 Sobel() 計算圖像在水平和垂直方向上的梯度,這樣可以找到圖像中的邊 緣。
使用 convertScaleAbs() 函數將梯度圖像轉換為無符號 8 位整數,以便後續處理。
使用 addWeighted() 函數將水平和垂直梯度的影響組合起來,生成一張包含邊緣信息的圖像。
(二)
將邊緣圖像翻轉顏色,以得到白色的線條和黑色的背景。
(三)
for (int i = 0; i < sketch.rows; i++) { for (int j = 0; j < sketch.cols; j++) { uchar& pixel = sketch.at<uchar>(i, j); if (pixel <= 49) { pixel = 0; } else if (pixel <= 100) { pixel = 100; } else if (pixel > 210) { pixel = 255; } } }
遍歷圖像中的每個像素,根據像素值的大小將其轉換為不同的灰度值,從而產生素描效果。
如果像素值小於等於 49,將其設置為 0,即黑色;如果像素值在 50 到 100 之間,將其設置為 100,即較深的灰色;如果像素值大於 210,將其設置為 255,即白色。
(四) 顯示結果
留言
張貼留言