C++ openCV 图像的读取、显示、保存、加权融合、改变对比度、修改色域

图像的读取、显示、保存

使用的命名空间

#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);

测试效果:
在这里插入图片描述

文章内容有误或可改正地方,可私信,会即使修改。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值