【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
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减去当前像素点的灰度级即可完成反转。
结果图: