版权声明:本文由 Micheal 超 博客 创作,转载请附带链接,有问题欢迎交流。 https://blog.csdn.net/qq_42887760/article/details/85803835
读写图像
- imread 可以指定加载为灰度或者RGB图像
- Imwrite 保存图像文件,类型由扩展名决定
读写像素
-
读一个GRAY像素点的像素值(CV_8UC1)
Scalar intensity = img.at(y, x);
或者Scalar intensity = img.at(Point(x, y));
-
读一个RGB像素点的像素值
Vec3f intensity = img.at(y, x);
float blue = intensity.val[0];
float green = intensity.val[1];
float red = intensity.val[2];
修改像素值
-
灰度图像
img.at(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®;
-
Vec3b与Vec3F
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 std;
using namespace cv;
int main(int argc,char** argv){
Mat src=imread("E:/Experiment/OpenCV/Pictures/dog2.jpg");
if(!src.data){
cout<<"Could not load Image ..."<<endl;
return -1;
}
imshow("input",src);
Mat gray_src;
cvtColor(src,gray_src,CV_RGB2GRAY);//转化成灰度图像
imshow("gary_src",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 gary=gray_src.at<uchar>(row,col);//读取图像中 row,col 位置的像素(颜色数据由单通道组成),所以<>中用uchar,只返回的是一个uchar值
gray_src.at<uchar>(row,col)=255-gary;//颜色值取反,255-原来的值。即:越黑的地方越白;越白的地方越黑
}
}
imshow("gary_src_changed",gray_src);
//多通道图像处理
Mat dst;
dst.create(src.size(),src.type());
height=src.rows;
width=src.cols;
int nc=src.channels();//获取图像的通道数
for (int row = 0; row < height; row++){
for (int col = 0; col < width; col++){
if(nc==1){//单通道图像
int gary=gray_src.at<uchar>(row,col);
gray_src.at<uchar>(row,col)=255-gary;
}else if(nc==3){//颜色值取反,若分别将 b g r 通道颜色设为0,图片整体颜色为 偏黄、偏绯红、偏青色
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;
}
}
}
imshow("src_changed",dst);
Mat dst2;
bitwise_not(src, dst2);//bitwise_not()颜色值取反,同上面算法一致,这个是通过位操作 与或非 实现的
imshow("src_changed2",dst2);
//其他操作(处理灰度图像的其他方式)
Mat dst3,dst4,dst5;
dst3.create(src.size(),src.type());//初始化图像
cvtColor(src,dst4,CV_RGB2GRAY);//将其变为单通道图像,否则图像宽度只有原图像的3分之一,也可以写成下面这种方式
dst5.create(src.size(),CV_8UC1);//或者直接定义成:Mat dst5(src.size(),CV_8UC1);
height=src.rows;
width=src.cols;
nc=src.channels();
for (int row = 0; row < height; row++){
for (int col = 0; col < width; col++){
if(nc==1){
int gary=gray_src.at<uchar>(row,col);
gray_src.at<uchar>(row,col)=255-gary;
}else if(nc==3){//颜色值取反,若分别将 b g r 通道颜色设为0,图片整体颜色为 偏黄、偏绯红、偏青色
int b = src.at<Vec3b>(row,col)[0];
int g = src.at<Vec3b>(row,col)[1];
int r = src.at<Vec3b>(row,col)[2];
dst3.at<Vec3b>(row,col)[0] = b;
dst3.at<Vec3b>(row,col)[1] = 0;//将 g 的值全部变为0
dst3.at<Vec3b>(row,col)[2] = r;
dst4.at<uchar>(row,col) = max(r, max(b, g));//随意设置的灰度图,取max图像会比取min亮
dst5.at<uchar>(row,col) = min(r, min(b, g));
}
}
}
imshow("change b=0",dst3);
imshow("gray_src->max(b,g,r)",dst4);
imshow("gray_src->min(b,g,r)",dst5);
waitKey(0);
return 0;
}