imread 可以指定加载为灰度或者RGB图像 Imwrite 保存图像文件,类型由扩展名决定
读一个GRAY像素点的像素值(CV_8UC1) Scalar intensity = img.at<uchar>(y, x); 或者 Scalar intensity = img.at<uchar>(Point(x, y));
读一个RGB像素点的像素值 Vec3f intensity = img.at<Vec3f>(y, x); float blue = intensity.val[0]; float green = intensity.val[1]; float red = intensity.val[2];
灰度图像 img.at<uchar>(y, x) = 128;
RGB三通道图像 img.at<Vec3b>(y,x)[0]=128; // blue img.at<Vec3b>(y,x)[1]=128; // green img.at<Vec3b>(y,x)[2]=128; // red
空白图像赋值 img = Scalar(0);
ROI选择 Rect r(10, 10, 100, 100); Mat smallImg = img(r);
Vec3b对应三通道的顺序是blue、green、red的uchar类型数据。 Vec3f对应三通道的float类型数据 把CV_8UC1转换到CV32F1实现如下: src.convertTo(dst, CV_32F);
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
int main(void) {
Mat src, gray_src;
src = imread("C:/Users/Robin/Pictures/test.jpg");
if (src.empty()) {
std::cout << "could not load image..\n";
return -1;
}
namedWindow("input", CV_WINDOW_AUTOSIZE);
imshow("input", src);
cvtColor(src, gray_src, CV_BGR2GRAY);//单通道
int height = gray_src.rows;
int width = gray_src.cols;
namedWindow("output", CV_WINDOW_AUTOSIZE);
imshow("output", gray_src);
//单通道
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
int gray = gray_src.at<uchar>(row, col);//像素值
gray_src.at<uchar>(row, col) = 255 - gray;
}
}
Mat dst;
dst.create(src.size(), src.type());
height = src.rows;
width = src.cols;
int hc = src.channels();//获得通道数
//for (int row = 0; row < height; row++) {
// for (int col = 0; col < width; col++) {
// if (hc == 1) {
// int gray = gray_src.at<uchar>(row, col);//像素值
// gray_src.at<uchar>(row, col) = 255 - gray;
// }
// else if (hc == 3) {
// int b = dst.at<Vec3b>(row, col)[0];
// int g = dst.at<Vec3b>(row, col)[1];
// int r = dst.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;
// }
//
// }
//}
bitwise_not(src, dst);
imshow("output", dst);
waitKey(0);
return 0;
}