1093348 作業2
線條自畫像 (二值化與邊緣偵測 Image Thresholding and Edge Detection)
題目說明:撰寫一個程式,以灰階模式讀取一張圖像 imread(path, IMREAD_GRAYSCALE)
(a)利用 Sobel Operators 偵測並輸出邊緣成分圖。
(b)設計一個類似素描線條的自畫像圖案。
(a)利用 Sobel Operators 偵測並輸出邊緣成分圖。
(b)設計一個類似素描線條的自畫像圖案。
語言:C++
開發環境: Windows 10 + Visual Studio 2019 + OpenCV 4.5.4
(a)利用 Sobel Operators 偵測並輸出邊緣成分圖
1. 用Sobel函數計算x方向和y方向的梯度值
void cv::Sobel(cv::InputArray src, cv::OutputArray dst, int ddepth, int dx, int dy, int ksize = 3, double scale = (1.0),double delta = (0.0), int borderType = 4)分別對圖像的x方向和y方向進行計算,然後將兩個方向的結果進行加權合併,最終的邊緣檢測結果可以提高邊緣檢測的準確度,因為它可以同時考慮圖像中橫向和縱向的梯度變化。
CV_16S類型的輸出圖像可以高精度計算和保留圖像中的細節,如果需要快速計算和處理大量圖像,則可以選擇CV_8U類型的輸出圖像。2. 將圖像轉換為8位無符號整型圖像,否則無法顯示
void cv::convertScaleAbs(cv::InputArray src, cv::OutputArray dst, double alpha = 1, double beta = 0);將輸入圖像進行線性變換,並將結果轉換為8位無符號整型圖像。
src是輸入圖像,dst是輸出圖像,alpha和beta是線性變換的參數。3. 將兩個方向的結果進行加權合併
void cv::addWeighted(cv::InputArray src1, double alpha, cv::InputArray src2, double beta, double gamma, cv::OutputArray dst, int dtype=-1)將兩個輸入圖像按照一定的權重合成到一起,得到一個輸出圖像。
src1和src2是兩個輸入圖像,alpha和beta是兩個輸入圖像的權重係數,gamma是一個可選的加權偏差,dtype是輸出圖像的數據類型。圖1、提取邊緣成果
(b)設計一個類似素描線條的自畫像圖案
1. 高斯模糊
void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT)
用於圖像處理中的平滑處理,可以有效的去除圖像中的噪聲。src是輸入圖像,dst是輸出圖像,ksize是高斯核的大小,用於指定濾波器的尺寸。該參數應該是一個奇數,例如(3,3)、(5,5)等。sigmaX:在x方向上的標準差,用於控制高斯核函數在x方向上的分佈,sigmaY:在y方向上的標準差,用於控制高斯核函數在y方向上的分佈,borderType:邊界擴展方式,默認為BORDER_DEFAULT。
2. 閾值化,去掉一些小線條細節
double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)
將圖像中的每個像素與一個預定義的閾值進行比較,如果像素值大於或等於閾值,則將其設置為白色(或者是最大值),否則將其設置為黑色(或者是最小值),從而將圖像二值化。src是輸入圖像,dst是輸出圖像,thresh是閾值,用於將像素值與之比較,maxval是當像素值大於或等於閾值時,要設置的像素值,type是閾值化類型,分別對應不同的處理方式:
- THRESH_BINARY:二值化閾值化類型,當像素值大於或等於閾值時,將其設置為maxval,否則將其設置為0。
- THRESH_BINARY_INV:反二進制化閾值類型,當像素值大於或等於閾值時,將其設置為0,否則將其設置為maxval。
- THRESH_TRUNC:截斷閾值類型,當像素值大於或等於閾值時,將其設置為閾值,否則不改變其值。
- THRESH_TOZERO:零閾值類型,當像素值大於或等於閾值時,保持不變,否則將其設置為0。
- THRESH_TOZERO_INV:反零閾值類型,當像素值大於或等於閾值時,將其設置為0,否則保持不變。
3. 黑白轉化
void bitwise_not(InputArray src, OutputArray dst)
src是輸入圖像,dst是輸出圖像。
以一個簡單的公式實現: new_value = 255 - old_value。圖2、類似素描線條的自畫像圖案
我不知道怎樣才算素描線條QQ
留言
張貼留言