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

  此次我们将一张图像转灰度后再进行灰度取反,即黑的变白的,白的变黑的,所以我们需要获取每个像素点上的灰度级,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减去当前像素点的灰度级即可完成反转。

结果图:

 

 

 

posted @ 2024-03-04 20:14  VanGoghpeng  阅读(136)  评论(0编辑  收藏  举报