特别注意:图片读写的双循环一定是要先写 row ,再写 col ,否则报错!
#include <opencv2/opencv.hpp>
#include <stdio.h>
#include <stdlib.h>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat img = imread("123.jpg",-1);//3通道
Mat gray = imread("123.jpg",0);//单通道
Mat test1 = Mat::zeros(img.size(),img.type());
Mat test2 = Mat::zeros(gray.size(),gray.type());
////////////////// at //////////////////////////////////////////////////////////
for (int i=0;i<img.rows;i++)
{
for (int j=0;j<img.cols;j++)
{
test1.at<Vec3b>(i,j)[0] = 255 - img.at<Vec3b>(i, j)[0];
test1.at<Vec3b>(i,j)[1] = 255 - img.at<Vec3b>(i, j)[1];
test1.at<Vec3b>(i,j)[2] = 255 - img.at<Vec3b>(i, j)[2];
}
}
imshow("1",test1);
imwrite("img1.jpg",test1);
for (int i=0;i<gray.rows;i++)
{
for (int j=0;j<gray.cols;j++)
{
test2.at<uchar>(i,j) = 255 - gray.at<uchar>(i, j);
}
}
imshow("2",test2);
imwrite("gray1.jpg",test2);
////////////////// 迭代器 //////////////////////////////////////////////////////////
MatIterator_<Vec3b> ite1;
for(ite1 = test1.begin<Vec3b>();ite1<test1.end<Vec3b>();ite1++)
{
(*ite1)[0] = 255 - (*ite1)[2];//这里为了看出效果做了通道交叉的处理
(*ite1)[1] = 255 - (*ite1)[1];
(*ite1)[2] = 255 - (*ite1)[0];
}
imshow("3",test1);
imwrite("img2.jpg",test1);
MatIterator_<uchar> ite2;
for (ite2 = test2.begin<uchar>();ite2<test2.end<uchar>();ite2++)
{
*ite2 = saturate_cast<uchar>(200-*ite2);
}
imshow("4",test2);
imwrite("gray2.jpg",test2);
////////////////// 指针 //////////////////////////////////////////////////////////
//写法1
for (int i=0;i<img.rows;i++)
{
Vec3b *p = test1.ptr<Vec3b>(i);
for (int j=0;j<img.cols;j++)
{
p[j][0] = saturate_cast<uchar>(150-p[j][0]);
p[j][1] = saturate_cast<uchar>(150-p[j][1]);
p[j][2] = saturate_cast<uchar>(150-p[j][2]);
}
}
imshow("5",test1);
imwrite("img31.jpg",test1);
//写法2
for(int i=0;i<test1.rows;i++)
{
uchar * P = test1.ptr<uchar>(i);
for(int j=0;j<test1.cols*test1.channels();j++)
{
P[j] = saturate_cast<uchar>(300-P[j]);
}
}
imshow("52",test1);
imwrite("img32.jpg",test1);
for (int i=0;i<test2.rows;i++)
{
uchar * p2 = test2.ptr<uchar>(i);
for (int j=0; j<test2.cols; j++)
{
p2[j] = saturate_cast<uchar>(300-p2[j]);
}
}
imshow("6",test2);
imwrite("gray3.jpg",test2);
waitKey();
return 1;
}
123.jpg
img1.jpg
gray1.jpg
img2.jpg
gray2.jpg
img31.jpg
img32.jpg
gray3.jpg