此次我們將一張影像轉灰度後再進行灰度取反,即黑的變白的,白的變黑的,所以我們需要獲取每個畫素點上的灰度級,cv中提供了一個函式at,但是這個函式還有11個過載函式,太多了,我們只用這次需要用到的,即透過讀取畫素點的位置來獲取灰度級。
◆ at() [3/12]
template<typename _Tp >
const_Tp& cv::Mat::at(int row, int col
)
Parameters
Parameters
row 在0維的方向進行索引
col 在1維的方向進行索引
可以看到,at是一個模板函式,其返回型別為傳入指定的型別。
1 #include <iostream> 2 #include <fstream> 3 #include <opencv2/highgui/highgui.hpp> 4 #include <opencv2/imgproc/imgproc.hpp> 5 using namespace std; 6 7 int main(int argc, char** argv) { 8 cv::Mat img, gray, reverse_gray; 9 cv::pyrDown(cv::imread(argv[1]), img); 10 11 cv::namedWindow("src_img", cv::WINDOW_AUTOSIZE); 12 cv::imshow("src_img", img); 13 14 cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY); 15 cv::namedWindow("gray_img", cv::WINDOW_AUTOSIZE); 16 17 18 gray.copyTo(reverse_gray); 19 cout << img.size << endl; 20 for (int i = 0; i < img.size[1]; ++i) { 21 for (int j = 0; j < img.size[0]; ++j) { 22 uchar& gray_scale = reverse_gray.at<uchar>(j, i); 23 gray_scale = 255 - gray_scale; 24 } 25 } 26 cv::namedWindow("reverse_gray", cv::WINDOW_AUTOSIZE); 27 cv::imshow("reverse_gray", reverse_gray); 28 cv::imshow("gray_img", gray); 29 cv::waitKey(0); 30 31 return 0; 32 }
我們依次來說明上述程式碼:
1、對傳入的影像進行降取樣從而縮小影像
2、將原圖轉換為灰度圖
3、深複製灰度圖,並將複製到的灰度圖進行灰度級反轉,其中size返回的資料依次代表是列數和行數,一般來說遍歷是行列順序,這一點需要注意,然後是at傳入的引數,是以列行的形式傳入的。使用255減去當前畫素點的灰度級即可完成反轉。