- 图像的读写
- 读写像素
- 修改像素值
图像的读写
imread 可以指定加载灰度图像或者是RGB图像
imwrite 保存图像文件,类型由扩展名决定
读写像素
1. 读写一个灰度图像(GRAY)像素点的像素值 :Scalar intensity = Mat.at<uchar>(y,x)或者Scalar intensity = Mat.at<uchar>(Point(x,y))
2. 都一个RGB像素点的像素值:
Vec3f intensity = Mat.at<Vec3f>(y,x)
float blue = intensity.val[0] //获得蓝色通道的像素值
float green = intensity.val[1] //获得蓝色通道的像素值
float red = intensity.val[2] //获得蓝色通道的像素值
整型:
int b = srcImage.at<Vec3b>(row, col)[0]; //获取像素值b
int g = srcImage.at<Vec3b>(row, col)[1]; //获取像素值g
int r = srcImage.at<Vec3b>(row, col)[2]; //获取像素值r
修改像素值
int gray = gray_src.at<uchar>(row,col); //获取像素值
gray_src.at<uchar>(row,col) = 255-gray; //像素值取反赋值
例子
- 灰度图像的像素取反操作:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
int main(int argc, char** argv) {
Mat srcImage = imread("E:/image/6.jpg");
Mat gray_src;
if (!srcImage.data) {
printf("没有找到图片");
return -1;
}
namedWindow("input image",WINDOW_AUTOSIZE);
imshow("input image", srcImage);
cvtColor(srcImage, gray_src, COLOR_BGR2GRAY);
namedWindow("input gray", WINDOW_AUTOSIZE);
imshow("input gray", gray_src);
int heigth = gray_src.rows;
int width = gray_src.cols;
for (int row = 0; row < heigth; 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("取反操作",WINDOW_AUTOSIZE);
![imshow("取反操作", gray_src);
waitKey(0);
return 0;
}
效果图:
- 对彩色像素值进行操作:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
int main(int argc, char** argv) {
Mat srcImage = imread("E:/image/6.jpg");
if (!srcImage.data) {
printf("没有找到图片");
return -1;
}
namedWindow("input image",WINDOW_AUTOSIZE);
imshow("input image", srcImage);
Mat dst;
dst.create(srcImage.size(), srcImage.type());
int heigth = srcImage.rows;
int width = srcImage.cols;
int nc = srcImage.channels();
for (int row = 0; row < heigth; row++) {
for (int col = 0; col < width; col++) {
if(nc==1){
int gray = srcImage.at<uchar>(row, col); //获取像素值
dst.at<uchar>(row, col) = 255 - gray; //像素值取反赋值
}
else if (nc == 3) {
int b = srcImage.at<Vec3b>(row, col)[0]; //获取像素值b
int g = srcImage.at<Vec3b>(row, col)[1]; //获取像素值g
int r = srcImage.at<Vec3b>(row, col)[2]; //获取像素值r
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("取反操作",WINDOW_AUTOSIZE);
imshow("取反操作", dst);
waitKey(0);
return 0;
}
效果图:
- opencv提供的api方法bitwise_not:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
int main(int argc, char** argv) {
Mat srcImage = imread("E:/image/6.jpg");
if (!srcImage.data) {
printf("没有找到图片");
return -1;
}
namedWindow("input image",WINDOW_AUTOSIZE);
imshow("input image", srcImage);
Mat dst;
dst.create(srcImage.size(), srcImage.type());
bitwise_not(srcImage, dst);
namedWindow("取反操作",WINDOW_AUTOSIZE);
imshow("取反操作", dst);
waitKey(0);
return 0;
}
效果图: