就是,给定我们一张图片,我们可以对图片的每一个像素的色彩进行处理
比如,我们的原图是这个样子
然后我首先将他变成灰度图(灰度图的行道是1,就是chanaual是1)
然后,我又将灰色图片的黑白进行颠倒
涉及的代码如下:
1 #include<iostream> 2 #include<opencv.hpp> 3 4 using namespace std; 5 using namespace cv; 6 7 int main() 8 { 9 10 Mat sou; 11 sou = imread("C:\Users\32829\Desktop\aa.jpg"); 12 if (sou.empty()) 13 { 14 cout << "图像读入失败" << endl; 15 } 16 namedWindow("new"); 17 imshow("new", sou); 18 19 Mat dst; 20 //将原图改为灰度图,就是改变原图的色系 21 cvtColor(sou, dst, CV_BGR2GRAY); 22 namedWindow("old1"); 23 imshow("old1", dst); 24 25 int height = dst.rows;//获取目标图的高度 26 int weight = dst.cols;//获取目标图的宽度 27 28 for (int row = 0; row < height; row++) 29 { 30 for (int col = 0; col < weight; col++) 31 { 32 int grey = dst.at<uchar>(row, col);//获取图片的每一个像素点 33 dst.at<uchar>(row, col) = 255 - grey;//将像素点变成他的补 34 } 35 } 36 namedWindow("old2"); 37 imshow("old2", dst); 38 39 40 waitKey(0); 41 return 1; 42 }
上面是一通道的图片修改,下面是三通道的修改
原图和修改后的图片展示
1 #include<iostream> 2 #include<opencv.hpp> 3 4 using namespace std; 5 using namespace cv; 6 7 int main() 8 { 9 10 Mat sou; 11 sou = imread("C:\Users\32829\Desktop\aa.jpg"); 12 if (sou.empty()) 13 { 14 cout << "图像读入失败" << endl; 15 } 16 namedWindow("new"); 17 imshow("new", sou); 18 19 Mat dst; 20 ////将原图改为灰度图,就是改变原图的色系 21 //cvtColor(sou, dst, CV_BGR2GRAY); 22 //namedWindow("old1"); 23 //imshow("old1", dst); 24 25 //int height = dst.rows;//获取目标图的高度 26 //int weight = dst.cols;//获取目标图的宽度 27 28 //for (int row = 0; row < height; row++) 29 //{ 30 // for (int col = 0; col < weight; col++) 31 // { 32 // int grey = dst.at<uchar>(row, col);//获取图片的每一个像素点 33 // dst.at<uchar>(row, col) = 255 - grey;//将像素点变成他的补 34 // } 35 //} 36 //namedWindow("old2"); 37 //imshow("old2", dst); 38 39 dst.create(sou.size(), sou.type()); 40 namedWindow("old2"); 41 imshow("old2", dst); 42 int height = dst.rows;//获取目标图的高度 43 int weight = dst.cols;//获取目标图的宽度 44 int chan = dst.channels(); 45 46 for (int row = 0; row < height; row++) 47 { 48 for (int col = 0; col < weight; col++) 49 { 50 if (chan == 1) 51 { 52 int grey = dst.at<uchar>(row, col);//获取图片的每一个像素点 53 dst.at<uchar>(row, col) = 255 - grey;//将像素点变成他的补 54 } 55 else if (chan==3){ 56 int b=sou.at<Vec3b>(row,col)[0];//获取他的这个像素点的第一个值 57 int g = sou.at<Vec3b>(row, col)[1];//获取他的这个像素点的第二个值 58 int r = sou.at<Vec3b>(row, col)[2];//获取他的这个像素点的第三个值 59 //下面是修改像素值; 60 dst.at<Vec3b>(row, col)[0] = 255 - b; 61 dst.at<Vec3b>(row, col)[1] = 255 - g; 62 dst.at<Vec3b>(row, col)[2] = 255 - r; 63 } 64 } 65 } 66 67 namedWindow("old4"); 68 imshow("old4", dst); 69 70 71 waitKey(0); 72 return 1; 73 }
还有一个简单的方法:
然后代码就是将上面的for循环给删了
1 #include<iostream> 2 #include<opencv.hpp> 3 4 using namespace std; 5 using namespace cv; 6 7 int main() 8 { 9 10 Mat sou; 11 sou = imread("C:\Users\32829\Desktop\aa.jpg"); 12 if (sou.empty()) 13 { 14 cout << "图像读入失败" << endl; 15 } 16 namedWindow("new"); 17 imshow("new", sou); 18 19 Mat dst; 20 21 22 23 dst.create(sou.size(), sou.type()); 24 namedWindow("old2"); 25 imshow("old2", dst); 26 int height = dst.rows;//获取目标图的高度 27 int weight = dst.cols;//获取目标图的宽度 28 int chan = dst.channels(); 29 30 /////////////////////////////////////////////////////////就加了这一行 31 32 bitwise_not(sou, dst); 33 34 //////////////////////////////////////////////////////////////////// 35 namedWindow("old4"); 36 imshow("old4", dst); 37 38 39 waitKey(0); 40 return 1; 41 }
基础知识整理:
====================================================================
============================================================================
=============================================================================
===========================================================================