读写像素
- 读一个
GRAY
像素点的像素值 (CV_8UC1
)
Scalar intensity = src.at<uchar>(y, x)
或者
Scalar intensity = src.at<uchar>(Point(y, x))
- 读一个
RGB
像素点的像素值
int b = src.at<Vec3b>(row, col)[0]
;
int g = src.at<Vec3b>(row, col)[1]
;
int r = src.at<Vec3b>(row, col)[2]
;
Vec3b
与Vec3f
Vec3b
对应三通道的顺序是blue
,green
,red
的uchar
型数据Vec3f
对应三通道的float
类型数据- 把
CV_8UC1
转换到CV_32F1
使用如下API
函数
src.converTo(dst, CV_32F)
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
Mat src, gray_src;
src = imread("/home/xm/workspace_2020/study_code/data/lena.jpg");
if (src.empty())
{
printf("could not load image ...\n");
return -1;
}
namedWindow("src image", WINDOW_AUTOSIZE);
imshow("src image", src);
/*
cvtColor(src, gray_src, COLOR_BGR2GRAY);
namedWindow("gray_image", 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 col=0;col<width;col++)
{
int gray = gray_src.at<uchar>(row, col);
gray_src.at<uchar>(row, col) = 255 - gray;
}
}
namedWindow("sub gray", WINDOW_AUTOSIZE);
imshow("sub gray", gray_src);
*/
// 三通道反差
Mat dst;
dst.create(src.size(), src.type());
int height = src.rows;
int width = src.cols;
int channels = src.channels();
for (int row=0;row<height;row++)
{
for (int col=0;col<width;col++)
{
if (channels == 1)
{
int gray = gray_src.at<uchar>(row, col);
gray_src.at<uchar>(row, col) = 255 - gray;
}
else if (channels==3)
{
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("sub src", WINDOW_AUTOSIZE);
imshow("sub src", dst);
imwrite("sub.jpg", dst);
// API
Mat dst1;
bitwise_not(src, dst1);
namedWindow("bitwise_not", WINDOW_AUTOSIZE);
imshow("bitwise_not", dst1);
imwrite("bitwise_not.jpg", dst1);
waitKey(0);
return 0;
}
图像取反的操作结果
左图为输入图像,中间为自己实现的取反操作,右图是 bitwise_not
操作.