图像的读取、显示、保存
使用的命名空间
#pragma once
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
图像的读取
openCV中读取图像使用imread()函数,基本可读取所有常用格式,tif,jpg,png。需要注意在读取时,可以指定读取的格式灰度、彩色等,不填默认原格式。如果是彩色三通道图像,读取后通道顺序为BGR,与常用的不同。
filename : 图像的地址
flags : 图像读取格式,enum cv::ImreadModes {
cv::IMREAD_UNCHANGED = -1, 原格式
cv::IMREAD_GRAYSCALE = 0, 灰度
cv::IMREAD_COLOR = 1, 彩色BGR
cv::IMREAD_ANYDEPTH = 2,
cv::IMREAD_ANYCOLOR = 4,
cv::IMREAD_LOAD_GDAL = 8,
cv::IMREAD_REDUCED_GRAYSCALE_2 = 16,
cv::IMREAD_REDUCED_COLOR_2 = 17,
cv::IMREAD_REDUCED_GRAYSCALE_4 = 32,
cv::IMREAD_REDUCED_COLOR_4 = 33,
cv::IMREAD_REDUCED_GRAYSCALE_8 = 64,
cv::IMREAD_REDUCED_COLOR_8 = 65,
cv::IMREAD_IGNORE_ORIENTATION = 128
}
图像的显示
图像读取后的显示,需要配合nameWindow(),imshow(),waitKey()三个函数一起使用;
nameWindow() 定义需要显示图像的窗口
winname : 窗口名称,用来显示图像
flags : 窗口类型,AUTOSIZE 根据图像自适应大小,不可手动调整;FREERATIO 可以手动调整窗口大小
默认为AUTOSIZE类型
图像的保存
图像的保存需要调用imwrite函数。
filename:图像保存的地址
img :待保存的图像
params : 可选取的保存格式
imshow() 在指定窗口显示图像
winname : 显示图像的窗口名
mat : 图像
wiatKey(),等待键盘输入,延时单位为毫秒(ms),inshow本身会显示后立即关闭,即图像一闪而过,如果要图像持续显示要使用waitKey,输入为0会无限等待,直至键盘键入任意值;或者指定延时时间;或者判断键盘是否按下特定键。
delay : 延时等待时间,即窗口显示的时间,单位毫秒
为 0 : 无限等待,直至任意键按下
为 1000 : 窗口显示1秒后自动关闭
可接受其返回值,用于判断键盘某一按键被按下
测试代码:
//path为图像路径,彩色读取
Mat m1 = imread(path, 1);
//定义图像显示的窗口名,可自由调整窗口大小
namedWindow("Show Image", WINDOW_FREERATIO);
//判断图像是否读取成功
if (m1.empty()) {
cout << "image read error" << endl;
return;
}
//在窗口显示图像
imshow("Show Image", m1);
//让窗口无限显示,直至按下任意键
waitKey(0);
//显示完后,销毁窗口
destroyWindow("Show Image");
//保存图像,filename为需保存的地址
imwrite("file name", m1);
1.读入图像后,记住判断图像是否为空,以免图像读取失败
2.显示完后,销毁窗口
图像的属性修改
图像的色域修改
图像色彩空间变换,使用cvtColor()函数。为了防止变换后数值越界,可在转换前使用convertTo()将CV_8UC3变为CV_32FC3类型。
src : 原图像
dst : 目标图像
code : 转换模式,如COLOR_BGR2GRAY、COLOR_GRAY2RGB
dstCn : 目标图像的通道数,默认为0,由转换模式决定
测试代码:
Mat m2 = imread(path ,1);
cout << m2.type() << endl;
Mat m3;
cvtColor(m2, m3, COLOR_BGR2GRAY);
cout << m3.type() << endl;
namedWindow("color image");
namedWindow("gray image");
imshow("color image" , m2);
imshow("gray image",m3);
waitKey(0);
测试效果:
图像的对比度、数据类型修改
修改图像对比度、数据类型,使用convertTo()函数。
m :输出图像
rtype : 输出图像的深度,为负值时与原图像相同
alpha : 比例因子,默认为1,即原图
beta : 额外增量、偏移bias,直接与像素值相加,默认为0
测试代码:
//修改图像对比度
Mat m4 = imread(path2, 1);
Mat m5(m4.size(), m4.type());
m4.convertTo(m5, -1, 0.3, 50);
namedWindow("color image");
namedWindow("convert image");
imshow("color image" , m4);
imshow("convert image",m5);
waitKey(0);
测试效果:
两张图像的加权融合
图像的加权融合使用addWeighted()函数。
src1 : 输入图像1
alpha : 输入1的比例因子
src2 : 输入图像2
beta : 输入图像2的比例因子
grama : 额外增量 ,直接与像素相加
dst : 输出图像
dtype : 输出图像的深度,默认与输入相同
1.输入的两种图像 必须 相同的尺寸 和 相同的通道数
2.比例因子无限制,可大于1,但像素的最大值与类型有关,uchar最大255,白色
测试代码:
//两张图像的加权融合
Mat m6 = imread(path, 1);
Mat m7 = imread(path2, 1);
//调整m7与m6大小相同
resize(m7, m7, m6.size(), 0, 0);
Mat m8;
//加权融合、叠加
addWeighted(m6, 0.5, m7, 0.5,0, m8, -1);
namedWindow("addweighted");
imshow("addweighted", m8);
waitKey(0);
测试效果:
文章内容有误或可改正地方,可私信,会即使修改。