对于单通道图像:
void Invert1(){
Mat src,dest;
src = imread("lena.jpg");
if(!src.data){
cout << "Loading image failed!" << endl;
return ;
}
namedWindow("Original Image",CV_WINDOW_AUTOSIZE);
imshow("Original Image",src);
cvtColor(src,dest,COLOR_BGR2GRAY);
int rows = src.rows;
int cols = src.cols;
//单通道图像的反色
for(int row = 0;row<rows;row++){
for(int col = 0;col<cols;col++){
dest.at<uchar>(row,col) = 255 - dest.at<uchar>(row,col);
}
}
namedWindow("Single channel",CV_WINDOW_AUTOSIZE);
imshow("Single channel",dest);
cvWaitKey();
}
对于三通道而言:
void Invert2(){
Mat src;
src = imread("D:\\111.jpg");
if (!src.data){
cout << "Loading image failed!" << endl;
return;
}
namedWindow("Original image", CV_WINDOW_AUTOSIZE);
imshow("Original image", src);
int rows = src.rows;
int cols = src.cols;
cout << rows << "\t" << cols << endl;
Mat dest;
dest.create(src.size(), src.type());
for (int row = 0; row<rows; row++){
for (int col = 0; col<cols; col++){
int b = src.at<Vec3b>(row, col)[0];
int g = src.at<Vec3b>(row, col)[1];
int r = src.at<Vec3b>(row, col)[2];
dest.at<Vec3b>(row, col)[0] = 255 - b;
dest.at<Vec3b>(row, col)[1] = 255 - g;
dest.at<Vec3b>(row, col)[2] = 255 - r;
}
}
namedWindow("Three channels", CV_WINDOW_AUTOSIZE);
imshow("Three channels", dest);
cvWaitKey();
}
OpenCV提供的函数bitwise_not(src,dest):
void Invert3(){
Mat src, dest;
src = imread("D:\\111.jpg");
if (!src.data){
cout << "Loading image failed!" << endl;
return;
}
namedWindow("Original image", CV_WINDOW_AUTOSIZE);
imshow("Original image", src);
cv::bitwise_not(src, dest);
namedWindow("Inverted color", CV_WINDOW_AUTOSIZE);
imshow("Inverted color", dest);
cvWaitKey();
}
不同于使用cvtColor()函数,我们可以自己对像素操作实现灰度图的显示:
void GrayShow(){
Mat src;
src = imread("D:\\111.jpg");
if (!src.data){
cout << "Loading image failed!" << endl;
return;
}
namedWindow("Original image", CV_WINDOW_AUTOSIZE);
imshow("Original image", src);
int rows = src.rows;
int cols = src.cols;
Mat dest = Mat(src.rows, src.cols, 0);
for (int row = 0; row<rows; row++){
for (int col = 0; col<cols; col++){
int b = src.at<Vec3b>(row, col)[0];
int g = src.at<Vec3b>(row, col)[1];
int r = src.at<Vec3b>(row, col)[2];
dest.at<uchar>(row, col) = max(r, max(g, b));//choose the greatest value among bgr
//dest.at<uchar>(row,col) = min(r,min(g,b));//choose the smallest value among bgr
}
}
namedWindow("min, Gray scale image", CV_WINDOW_AUTOSIZE);
imshow("min, Gray scale image", dest);
cvWaitKey();
}