关键词:
文章目录
读写图像
1. imread
可以指定加载为灰度或者RGB图像。
imread功能是加载图像文件成为一个Mat对象,其中
-
第一个参数表示图像文件名称
-
第二个参数,表示加载的图像是什么类型,支持常见的三个参数值
IMREAD_UNCHANGED (<0) 表示加载原图,不做任何改变 IMREAD_GRAYSCALE ( 0)表示把原图作为灰度图像加载进来 IMREAD_COLOR (>0) 表示把原图作为RGB图像加载进来
注意:OpenCV支持JPG、PNG、TIFF等常见格式图像文件加载
例如:读名为test2.jpg
// read image
Mat image = imread("test2.jpg");
2. imwrite
保存图像文件,类型由扩展名决定。
bool imwrite(
const string& filename,
InputArray img,
const vector<int>& params=vector<int>()
)
-
第一个参数
const String& filename
表示需要写入的文件名,必须要加上后缀,比如“123.png”。 -
第二个参数
InputArray img
表示Mat类型的图像数据。 -
第三个参数
const std::vector& params
表示为特定格式保存的参数编码,它有一个默认值std::vector< int >(),所以一般情况下不用写。
读写像素
读一个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);
Scalar相关介绍可以参考我整理的另一篇博文:https://yangyongli.blog.csdn.net/article/details/121084843
ROI选择
Rect r(10, 10, 100, 100);
Mat smallImg = img(r);
Vec3b与Vec3F
Vec3b对应三通道的顺序是blue、green、red的uchar类型数据。
Vec3f对应三通道的float类型数据
把CV_8UC1转换到CV32F1实现如下:
src.convertTo(dst, CV_32F);
案例:图像反处理
自写
单通道反色处理
#include <iostream>
#include <math.h>
#include <opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>
using namespace std;
using namespace cv;
int main(int argc, char** argv) //argumentss 参数;argc命令行参数个数;
Mat src;
src = imread("./test2.jpg");
if (src.empty())
cout << "could not load image ...\\n" << endl;
return -1; //return 0 成功完成本函数;return -1 未能完成本函数
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src);
//---------------------------开始 进行功能处理---------------------------------------
//**************************处理单通道的*******************************
Mat gray_src;
cvtColor(src, gray_src, CV_BGR2GRAY); // 灰度处理
namedWindow("output", CV_WINDOW_AUTOSIZE);
imshow("output",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("gray_invert", CV_WINDOW_AUTOSIZE);
imshow("gray_invert", gray_src);
//**************************处理单通道的********************************/
waitKey(0); //防止DOS一闪而过
return 0;
多通道反色处理
#include <iostream>
#include <math.h>
#include <opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>
using namespace std;
using namespace cv;
int main(int argc, char** argv) //argumentss 参数;argc命令行参数个数;
Mat src;
src = imread("./test2.jpg");
if (src.empty())
cout << "could not load image ...\\n" << endl;
return -1; //return 0 成功完成本函数;return -1 未能完成本函数
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src);
//---------------------------开始 进行功能处理---------------------------------------
//**************************处理多通道************************************
Mat gray_src, dst;
dst.create(src.size(), src.type());
int height = src.rows;
int 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 gray = gray_src.at<uchar>(row, col);
gray_src.at<uchar>(row, col)=255-gray;
else if (nc==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;
// OpenCV自带的颜色 反处理函数
// bitwise_not(src, dst); //反位操作函数
namedWindow("gray_3channels_invert", CV_WINDOW_AUTOSIZE);
imshow("gray_3channels_invert", dst);
//****************************处理多通道************************************
//----------------------------结束处理图像---------------------------------------
waitKey(0); //防止DOS一闪而过
return 0;
OpenCV自带函数
#include <iostream>
#include <math.h>
#include <opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>
using namespace std;
using namespace cv;
int main(int argc, char** argv) //argumentss 参数;argc命令行参数个数;
Mat src;
src = imread("./test2.jpg");
if (src.empty())
cout << "could not load image ...\\n" << endl;
return -1; //return 0 成功完成本函数;return -1 未能完成本函数
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src);
//---------------------------开始 进行功能处理---------------------------------------
//**************************处理多通道************************************
Mat dst;
dst.create(src.size(), src.type());
//OpenCV自带的颜色 反处理函数
bitwise_not(src, dst); //反位操作函数
namedWindow("gray_3channels_invert", CV_WINDOW_AUTOSIZE);
imshow("gray_3channels_invert", dst);
//****************************处理多通道************************************
//----------------------------结束处理图像---------------------------------------
waitKey(0); //防止DOS一闪而过
return 0;
opencv4opencv视频教程c++5读写图像imreadimwrite读写像素at<>()修改像素值roi区域选择(图像裁剪)rectvec3b与vec3fcv_32f)(代码片段)
上一讲:【opencv4】opencv教程C++4、Mat对象(深拷贝:clone()、copyTo(),create()创建图片,zeros()、eye()初始化空白图像,Scalar()创建向量)[opencv_C++]入门强推!!!【B站最全】文章目... 查看详情
04图像像素的读写操作(代码片段)
04图像像素的读写操作opencv知识点:获取/改变图像的某个像素-Mat::at图像像素-数组遍历图像像素-指针遍历本课所解决的问题:如何获取/改变图像的某个像素?如何利用数组遍历图像像素?如何利用指针遍历图像像素?1.获取某... 查看详情
opencv-像素值读写(java版)
...或者设置某个像素值,甚至需要遍历整个像素值。OpenCV中RGB图像的通道为BGR!!!1.读像素值1.get()函数OpenCV中使用get()方法来实现读去矩阵中的某个像素。下方是提供的方法方法说明get(introw,intcol)返回double[]类型的像... 查看详情
opencv之图像像素读写(代码片段)
python代码:importcv2ascvsrc=cv.imread("./test.png")cv.namedWindow("input",cv.WINDOW_AUTOSIZE)cv.imshow("input",src)h,w,ch=src.shapeprint("h,w,ch",h,w,ch)forrowinrange(h):forcolinrange(w):b,g,r=src[row,c 查看详情
OpenCV修改图像像素[重复]
】OpenCV修改图像像素[重复]【英文标题】:OpenCVmodifyimagepixels[duplicate]【发布时间】:2017-09-2612:13:34【问题描述】:我想修改图像的每个像素。但结果并不像我预期的那样。原图:结果:for循环修改每个像素:image=imread("image.png",CV... 查看详情
opencv读写文件
HSV也是用和RGB差不多的方式来表达像素,每个整形(integer)向量分别表示一个B,G,R通道,其他的色彩空间,也用同样的方式来表示像素,只是取值范围和通道数目不同HSV的色彩空间的色度值范围0-180.>>>img=np.zeros((3,3... 查看详情
使用 OpenCV 修改图像时 RGB 值错误
】使用OpenCV修改图像时RGB值错误【英文标题】:WrongRGBvalueswhenmodifyingimagewithOpenCV【发布时间】:2013-11-0401:40:58【问题描述】:对C++相当陌生,我一直在使用OpenCV库。我正在尝试为图像查看器创建调光功能。这是voiddim(intval)的主体... 查看详情
OpenCV:标准化图像的像素值
】OpenCV:标准化图像的像素值【英文标题】:OpenCV:Normalizingpixelvaluesofanimage【发布时间】:2014-04-2003:58:15【问题描述】:我正在尝试将图像的像素值归一化,使其平均值为0.0,范数为1.0,以使图像具有一致的强度。有一个OpenCV函... 查看详情
c/c++vs2017opencv简单入门(代码片段)
...关的知识点,只是简单学了一点皮毛!目录一、OpenCV环境搭建二、使用opencv常用接口说明使用案例1. 图像色彩空间转换2. Mat对象的创建与赋值3. 图像像素的读写操作4. 图像像素的算术操作5. 滚动条操作演示6. 键盘响... 查看详情
尝试在 OpenCV 中使用像素值显示图像。只有 1/3 的图像显示
】尝试在OpenCV中使用像素值显示图像。只有1/3的图像显示【英文标题】:AttemptingtodisplayimageusingpixelvaluesinOpenCV.Only1/3rdofImageshows【发布时间】:2021-06-0305:37:40【问题描述】:我正在尝试读取图像中的像素并通过遍历像素将它们转... 查看详情
opencv图像像素操作(代码片段)
目录1.像素1-1.确定像素位置1-2.获取指定像素的像素值1-3.修改像素的BGR值2.用numpy模块操作像素2-1.创建图像1.创建黑白图像2.创建彩色图像3.创建随机图像2-2.拼接图像1.水平拼接`hstack()`方法2.垂直拼接`vstack()`方法1.像素1... 查看详情
opencv实战——直方图详解(代码片段)
OpenCV实战(8)——直方图详解0.前言1.直方图概念2.直方图计算2.1灰度图像直方图计算2.2彩色图像直方图计算3.应用查找表修改图像3.1查找表3.2拉伸直方图提高图像对比度3.3在彩色图像上应用查找表4.图像直方图均衡化5.完... 查看详情
跟我一起学opencv第四课之图像的基本操作(代码片段)
1.图像是由像素组成的,所以修改了像素就可以实现图像的改变。2先看灰度图像(单通道):*****2.获取灰度图像的像素值使用: intgray=gray_src.at<uchar>(row,col);*****3.修改灰度图像的像素值使用:gray_src.at<uchar>(row,col)=255-g... 查看详情
在openCV中访问某些像素的强度值(灰度图像)
】在openCV中访问某些像素的强度值(灰度图像)【英文标题】:Accessingcertainpixel\'sintensityvalue(grayscaleimage)inopenCV【发布时间】:2014-01-2215:29:05【问题描述】:在对如何在OpenCv中访问像素的强度值进行了大量搜索之后,我才意识到... 查看详情
在openCV中访问某个图像中所有像素的RGB值
】在openCV中访问某个图像中所有像素的RGB值【英文标题】:AccessingRGBvaluesofallpixelsinacertainimageinopenCV【发布时间】:2017-01-1213:21:34【问题描述】:我已经彻底搜索了互联网和***,但我没有找到我正在寻找的东西!如何在OpenCV中获... 查看详情
基于opencv实现人脸识别案例(代码片段)
一、基础我们使用机器学习的方法完成人脸检测,首先需要大量的正样本图像(面部图像)和负样本图像(不含面部的图像)来训练分类器。我们需要从其中提取特征。下图中的Haar特征会被使用,就像我... 查看详情
opencv图像处理:白化(whitening)(代码片段)
...和方差的计算公式如下。变换后新图像的每个像素值xij为OpenCV实现用OpenCV的内置函数计算均值和方差,然后对遍历每个像素值并对每个像素做 查看详情
如何在 OpenCV 中使用网络摄像头捕获 Mat 图像的像素值
】如何在OpenCV中使用网络摄像头捕获Mat图像的像素值【英文标题】:HowtogetpixelvalueofMatimagewithwebcamcaptureinOpenCV【发布时间】:2014-04-2405:28:08【问题描述】:嗯,我是openCV和图像处理方面的新手,我肯定需要帮助。我需要获取Mat的... 查看详情