OpenCV-C++ 图像的操作
这一节主要介绍的内容主要包括:
- 读取图像;
- 修改像素值;
读取图像
// 读取图像
Mat src = imread("/home/chen/dataset/lena.jpg");
if (src.empty()){
printf("could not load image.\n");
return -1;
}
// 显示图像
namedWindow("src", WINDOW_AUTOSIZE);
imshow("src", src);
waitKey(0);
修改图像像素值
1. 将RGB图像转换成灰度图,并与255相减
// 1. 将RGB转换成Gray,利用255去减像素
Mat dst;
cvtColor(src, dst, COLOR_BGR2GRAY);
int rows = dst.rows;
int cols = dst.cols;
for (int row = 0; row < rows -1; row++){
for (int col = 0; col < cols - 1; col++){
int pixel = dst.at<uchar>(row, col);
dst.at<uchar>(row, col) = 255 - pixel;
}
}
namedWindow("dst", WINDOW_AUTOSIZE);
imshow("dst", dst);
2. 对原图像(三通道),并与255相减
// 2. 对三维图像,利用255减去像素
int rows = src.rows;
int cols = src.cols;
Mat dst;
dst.create(src.size(), src.type());
for (int row = 0; row < rows - 1; row++){
for (int col = 0; col < cols - 1; 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];
// 赋值
dst.at<Vec3b>(row, col)[0] = 255 - b;
dst.at<Vec3b>(row, col)[1] = 255 - g;
dst.at<Vec3b>(row, col)[2] = 255 - r;
}
}
namedWindow("dst", WINDOW_AUTOSIZE);
imshow("dst", dst);
第二种方法:
// 2.1 对三维图像,利用255减去像素
Mat dst;
bitwise_not(src, dst);
namedWindow("dst", WINDOW_AUTOSIZE);
imshow("dst", dst);
第三种方法:
Mat dst;
dst.create(src.size(), src.type());
dst = Scalar(255, 255, 255) - src;
namedWindow("dst", WINDOW_AUTOSIZE);
imshow("dst", dst);
三种处理方式,结果图像如下所示:
完成的代码如下:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(){
// 读取图像
Mat src = imread("/home/chen/dataset/lena.jpg");
if (src.empty()){
printf("could not load image.\n");
return -1;
}
// 1. 将RGB转换成Gray,利用255去减像素
// Mat dst;
// cvtColor(src, dst, COLOR_BGR2GRAY);
// int rows = dst.rows;
// int cols = dst.cols;
// for (int row = 0; row < rows -1; row++){
// for (int col = 0; col < cols - 1; col++){
// int pixel = dst.at<uchar>(row, col);
// dst.at<uchar>(row, col) = 255 - pixel;
// }
// }
// namedWindow("dst", WINDOW_AUTOSIZE);
// imshow("dst", dst);
// 2. 对三维图像,利用255减去像素
// int rows = src.rows;
// int cols = src.cols;
// Mat dst;
// dst.create(src.size(), src.type());
// for (int row = 0; row < rows - 1; row++){
// for (int col = 0; col < cols - 1; 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];
// // 赋值
// dst.at<Vec3b>(row, col)[0] = 255 - b;
// dst.at<Vec3b>(row, col)[1] = 255 - g;
// dst.at<Vec3b>(row, col)[2] = 255 - r;
// }
// }
// 2.1 对三维图像,利用255减去像素
// Mat dst;
// bitwise_not(src, dst);
// namedWindow("dst", WINDOW_AUTOSIZE);
// imshow("dst", dst);
Mat dst;
dst.create(src.size(), src.type());
dst = Scalar(255, 255, 255) - src;
namedWindow("dst", WINDOW_AUTOSIZE);
imshow("dst", dst);
// 显示图像
namedWindow("src", WINDOW_AUTOSIZE);
imshow("src", src);
waitKey(0);
return 0;
}