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() 函數將水平和垂直梯度的影響組合起來,生成一張包含邊緣信息的圖像。



(二)


    Mat sketch = 255 - edges;

    將邊緣圖像翻轉顏色,以得到白色的線條和黑色的背景。


(三)


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,即白色。


(四) 顯示結果














留言

這個網誌中的熱門文章

rzwang Homework #1

s1101438 Homework #1

s1093309 作業6