#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main() {
Mat src,gray_src;
src = imread("D:\\heroRcData\\opencvProject\\arrowImg\\02\\01.jpg");
if (!src.data) {
cout << "could not load image..." << endl;
return -1;
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src);
//********************************************************
//单通道
cvtColor(src, gray_src, CV_BGR2GRAY);
int gray_rows = gray_src.rows;
int gray_cols = gray_src.cols;
namedWindow("gray image", CV_WINDOW_AUTOSIZE);
imshow("gray image", gray_src);
for (int i = 0; i < gray_rows; i++) {
for (int j = 0; j < gray_cols; j++) {
int gray_value = gray_src.at<uchar>(i, j); //当前点的像素值
gray_src.at<uchar>(i, j) = 255 - gray_value; //取反
}
}
namedWindow("grayNegation image", CV_WINDOW_AUTOSIZE);
imshow("grayNegation image", gray_src);
//********************************************************
//多通道
Mat dst = Mat(src.size(), src.type());
int dst_rows = dst.rows;
int dst_cols = dst.cols;
int dst_channels = dst.channels();
for (int i = 0; i < dst_rows; i++) {
for (int j = 0; j < dst_cols; j = j++) {
if (dst_channels == 1) {
int dst_value = dst.at<uchar>(i, j); //当前点的像素值
dst.at<uchar>(i, j) = 255 - dst_value;
}
else if (dst_channels == 3) {
int dstB_Value = src.at<Vec3b>(i, j)[0];//B通道当前点的像素值
int dstG_Value = src.at<Vec3b>(i, j)[1];//G通道当前点的像素值
int dstR_Value = src.at<Vec3b>(i, j)[2];//R通道当前点的像素值
dst.at<Vec3b>(i, j)[0] = 255 - dstB_Value;//取反
dst.at<Vec3b>(i, j)[1] = 255 - dstG_Value;//取反
dst.at<Vec3b>(i, j)[2] = 255 - dstR_Value;//取反
}
}
}
namedWindow("srcNegation image", CV_WINDOW_AUTOSIZE);
imshow("srcNegation image", dst);
//********************************************************
//上述操作效果可以用bitwise_not(src,dst)实现
Mat dst1;
bitwise_not(src, dst1);
namedWindow("srcNegation1 image", CV_WINDOW_AUTOSIZE);
imshow("srcNegation1 image", dst1);
waitKey(0);
return 0;
}