OPENCV系列博客主要记录自己学习OPENCV的历程,以及存储已经实现的代码,以备后续回顾使用,代码中包含了主要的备注。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char**argv) {
//Step1 读取图片
Mat src;
src = imread("sample.jpg");
if (src.empty()) {
cout << "The image is empty,plz check the file route..." << endl;
return -1;
}
namedWindow("Original_image", CV_WINDOW_AUTOSIZE);
imshow("Original_image", src);
//Step2 将图片转化为灰度图,读取像素灰度值,并遍历反转全部像素颜色
// 注意:这一部分是对单通道进行操作
Mat gray_src;
cvtColor(src,gray_src,CV_BGR2GRAY);
namedWindow("Gray_image", CV_WINDOW_AUTOSIZE);
imshow("Gray_image", gray_src);
int height = gray_src.rows;
int width = gray_src.cols;
for (int row = 0; row < height; row++) {
for (int colomn = 0; colomn < width; colomn++) {
int gray = gray_src.at<uchar>(row, colomn); //!!重要,使用这个语句取出图像像素灰度
gray_src.at<uchar>(row, colomn)=255 - gray; //!!可以通过这个语句,修改每个像素的灰度值
}
}
namedWindow("Gray_image_inverse", CV_WINDOW_AUTOSIZE);
imshow("Gray_image_inverse", gray_src);
//Step3 遍历图片,对RGB三通道彩色图片进行反转
// 原理类似,注意遍历时候的数据类型
Mat dst;
dst.create(src.size(),src.type());
height = src.rows;
width = src.cols;
int nc = src.channels();
for (int row = 0; row < height; row++) {
for (int colomn = 0; colomn < width; colomn++) {
if (nc ==1 ) {
int gray_2 = gray_src.at<uchar>(row, colomn); //!!重要,使用这个语句取出图像像素灰度
gray_src.at<uchar>(row, colomn) = 255 - gray_2; //!!可以通过这个语句,修改每个像素的灰度值
}
else if (nc == 3) {
int b = src.at<Vec3b>(row, colomn)[0]; //!!重要:彩色图3个通道,每个行列对应的是一个数组,数组包含bgr三原色
int g = src.at<Vec3b>(row, colomn)[1];
int r = src.at<Vec3b>(row, colomn)[2];
dst.at<Vec3b>(row, colomn)[0] = 255 - b;
dst.at<Vec3b>(row, colomn)[1] = 255 - g;
dst.at<Vec3b>(row, colomn)[2] = 255 - r; //此处除了取反之外,可以设定其他数值,达到不同效果
}
}
}
//bitwise_not(src, dst); //使用这个语句可以按位取反,得到与上边同样效果
namedWindow("Color_image_inverse", CV_WINDOW_AUTOSIZE);
imshow("Color_image_inverse", dst);
waitKey();
return 0;
}
效果如下: