1. 像素的遍历
这里提供常用的两种方法,一种是at方法,一种是ptr指针方法
具体看代码
//图像的基本操作
//1. 遍历像素
#include <iostream>
#include<opencv.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat src;
src = imread("src.jpg");
//这里要用.size(),而不是.size, .size()返回的是cv::Size,而.size返回的是MatSize
Mat dst1 = Mat::zeros(src.size(), src.type());
Mat dst2 = Mat::zeros(src.size(), src.type());
// 1.at 遍历
for (int i = 0; i < src.rows; i++)
{
for (int j = 0; j < src.cols; j++)
{
if (src.channels() == 1)
dst1.at<uchar>(i, j) = 255 - src.at<uchar>(i, j);
else if (src.channels() == 3)
{
dst1.at<Vec3b>(i, j)[0] = 255 - src.at<Vec3b>(i, j)[0]; //B
dst1.at<Vec3b>(i, j)[1] = 255 - src.at<Vec3b>(i, j)[1]; //G
dst1.at<Vec3b>(i, j)[2] = 255 - src.at<Vec3b>(i, j)[2]; //R
}
}
}
// 2. ptr指针
for (int i = 0; i < src.rows; i++)
{
uchar* src_row = src.ptr<uchar>(i);
uchar* dst2_row = dst2.ptr<uchar>(i);
for (int j = 0; j < src.cols; j++)
{
if (src.channels() == 1)
*dst2_row++ = 255 - *src_row++;
else if (src.channels() == 3)
{
*dst2_row++ = 255 - *src_row++; //B
*dst2_row++ = 255 - *src_row++; //G
*dst2_row++ = 255 - *src_row++; //R
}
}
}
//cout << "size" << src.size << src.size();
//cout << dst1;
imshow("src", src);
imshow("dst1", dst1);
imshow("dst2", dst2);
waitKey(0);
destroyAllWindows();
return 0;
}
两种得到的结果是一致的,指针方法更考验c++指针的语法,仔细感受一下,这里不在多说语法,有问题可以评论区留言。