【C++】【OpenCV-4.9.0】灰度圖取反(Mat屬性的使用)

VanGoghpeng發表於2024-03-04

  此次我們將一張影像轉灰度後再進行灰度取反,即黑的變白的,白的變黑的,所以我們需要獲取每個畫素點上的灰度級,cv中提供了一個函式at,但是這個函式還有11個過載函式,太多了,我們只用這次需要用到的,即透過讀取畫素點的位置來獲取灰度級。

◆ at() [3/12]

template<typename _Tp >
const_Tp& cv::Mat::at(int row,
          int col
          )
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減去當前畫素點的灰度級即可完成反轉。

相關文章