撰寫一個程式,讀取作業所附 2 張測試圖片,(1)設計一個二值化方法將其轉變成黑白 圖
像後,(2)繪出 QR code 黑色模組的外框(可利用 Sobel Operators 偵測即可)。
二、使用環境
1. Visual Studio 2019
2. OpenCV 4.2.0
3. 程式語言: C++
三、實作方法
1. 使用imread("xxx.jpg",0)將圖片讀取灰階形式
2. 以xxx.at <uchar>(i,j)取出灰階圖像中i列j行的點,並設定像素臨界值107,超過107的點
都改成255,反之改成0,完成二值化
3.再用Mat::zeros(xxx.size(), CV_16SC1)建立3個16位元有符號的單通道圖像(分別為偵測
邊緣後的水平向、垂直向及兩者疊加的圖像)
4. uchar* M_1 = xxx.data; 代表指向矩陣的第一個位址,xxx.step;代表圖像一列(row)的長度
(byte為1單位),利用兩者在影像上作convolution
5. Sobel operator 公式如下:
Gx = (-1)*f(x-1, y-1) + 0*f(x,y-1) + 1*f(x+1,y-1)
+(-2)*f(x-1,y) + 0*f(x,y)+2*f(x+1,y)
+(-1)*f(x-1,y+1) + 0*f(x,y+1) + 1*f(x+1,y+1)
Gy =1* f(x-1, y-1) + 2*f(x,y-1)+ 1*f(x+1,y-1)
+0*f(x-1,y) 0*f(x,y) + 0*f(x+1,y)
+(-1)*f(x-1,y+1) + (-2)*f(x,y+1) + (-1)*f(x+1, y+1)
G = |Gx|+|Gy|
6. addWeighted(Gx, 0.5, Gy, 0.5, 0, G); 做影像疊加,達到G = |Gx|+|Gy|
7. convertScaleAbs(image_1CB, imageCB); 將16點陣圖片轉化成為8點陣圖形進行顯示
8. imwrite();儲存圖片imshow(); 顯示圖片
四、作業要求
左圖:二值化 右圖:邊緣偵測 |
左圖:二值化 右圖:邊緣偵測 |
沒有留言:
張貼留言