opencv学习笔记(二)-- 加载、修改和保存图像

加载图像(imread)

函数举例:

src = imread("A:/opencvproject/pikaqiu.jpg", IMREAD_COLOR);

函数介绍

imread功能是加载一个图像文件使之成为一个Mat对象

  • 其中第一个参数表示的是加载的图像文件名称
  • 第二个参数表示的是加载图像的类型,就是以什么方式加载图像,常见的有以下三种参数值
    • IMREAD_UNCHANGED(<0)表示加载原图,不做任何改变(字面意思)

    • IMREAD_GRAYSCALE(0)表示把原图作为灰度图像加载进来(grayscale的意思是灰度图)

    • IMREAD_COLOR(>0)表示把原图作为RGB图像加载进来

注意: OPENCV支持JPG、PNG、TIFF等常见格式的图像文件加载

Mat对象

Mat是opencv中用来存储图像信息的内存对象,Mat对象是C++语言的一种类,具有自动内存管理的优点,我们不再需要手动分配其大小并且当不需要它的时候不再需要手动释放它

Mat对象除了存储图像的像素数据以外,还包括图像的其他属性,具体为宽、高、类型、维度、大小、深度等。具体获取API如下:

Mat src = Imgcodecs.imread(file.getPath());
int width = src.cols();//宽
int height = src.rows();//高
int dims = src.dims();//维度
int channels = src.channels();//通道数
int depth = src.depth();//深度
int type = src.type();//类型信息

Imgcodecs是OpenCV图像输入和输出模块

颜色空间

位图模式

位图模式是图像中最基本的格式,图像只有黑色和白色像素,是色彩模式中占有空间最小的,同样也叫做黑白图,它包含的信息量最少,无法包含图像中的细节,相当于只有0或者1

一副彩色图如果要转换成黑白模式,则一般不能直接转换,需要首先将图像转换成灰度模式

灰度模式

灰度模式即使用单一色调来表示图像,与位图模式不同,不像位图只有0和1,使用256级的灰度来表示图像,一个像素相当于占用8为一个字节,每个像素值使用0到255的亮度值代表,其中0为黑色,255为白色,相当于从黑->灰->白的过度,通常我们所说的黑白照片就是这种模式,与位图模式相比,能表现出一定的细节,占用空间也比位图模式较大

RGB模式

RGB模式为我们经常见到的,被称为真色彩。RGB模式的图像有3个颜色通道,分布为红(Red),绿(Green)和蓝(Bule),每个都占用8位一个字节来表示颜色信息,这样每个颜色的取值范围为0~255,那么就三种颜色就可以有多种组合,当三种基色的值相等是,表现出为灰色,三种颜色都为255即为白色,三种颜色都为0,即为黑色
RGB模式的图像占用空间要比位图,灰度图都要大,但表现出的细节更加明显

CMYK模式

CMYK模式被称为印刷色彩模式,主要是来源于印刷行业,以打印油墨在纸张上的光线吸收特性为基础,与RGB类似,也是使用三种颜色,分别为青色(Cyan),品红色(Magenta),黄色(Yellow),以及黑色(Black)
与RGB不同的是:RGB模式依靠的是自身发光的色彩模式,而CMYK是一种依靠反光的色彩模式。

HSB模式

是根据日常生活中人眼的视觉对色彩的观察得而制定的一套色彩模式,最接近与人类对色彩的辨认的思考方式,所有的颜色都是用色彩三属性来描述
H:(色相):是指从物体反射或透过物体传播的颜色
S:(饱和度):是指颜色的强度或纯度,表示色相中灰色成分所占的比例
B:(亮度):是指颜色对相对明暗程度,通常 100%定义为白色;0%为黑色

YUV格式

除了上述图像模式之外,由于历史原因大部分摄像头输入的图片格式都是YUV格式,开始主要用于电视系统以及模拟视频领域。
在图像的处理过程中,很少使用YUV格式,一般都需要转成RGB格式或者灰度图格式进行转换,而opencv的cvtColor()函数支持这种转换。

显示图像(namedWindows与imshow)

namedWindows()

函数举例

namedWindow("test_opencv", CV_WINDOW_AUTOSIZE);

在这里插入图片描述

函数介绍

namedwindow()功能是创建一个OpenCV的窗口,它是由OpenCV自动创建与释放的,你无需手动销毁它,他有两个参数:

  1. 第一个是窗口的名称,创建之后会显示在窗口上
  2. 第二个参数为窗口的标识,来控制窗口的大小,一般默认为是WINDOW_AUTOSIZE另外还有以下两种
参数含义
WINDOW_AUTOSIZE窗口大小自动适应图片大小,并且不可手动更改
WINDOW_NORMAL用户可以改变这个窗口大小

imshow()

函数举例

imshow("test_opencv", src);

在这里插入图片描述

函数介绍

imshow()函数会根据窗口名称将对应的图片显示在指定的窗口上,它同样有两个参数

  1. 第一个参数是对应的窗口的名称,即namedwindow()的第一个参数
  2. 第二个参数是在对应窗口上显示的图像,是一个Mat对象

修改图像颜色空间(cvtColor)

这里的修改图像就是转变图像的颜色空间

函数举例

	Mat grysrc;
	namedWindow("test_opencv_grysrc", CV_WINDOW_AUTOSIZE);
	cvtColor(src,grysrc, COLOR_BGR2GRAY);
	imshow("test_opencv_grysrc", grysrc);

在这里插入图片描述

函数介绍

cvtColor()的功能是把图从一个色彩空间转换到另外一个色彩空间,有三个参数:

  1. 第一个参数是原图像
  2. 第二个参数表示的是色彩空间转换之后的图像
  3. 第三个参数表示的源和目标的色彩空间,如下
参数含义
COLOR_BGR2HLS由BGR空间转换到HLS空间
COLOR_BGR2GRAY由BGR空间转换到GRAY灰度空间
COLOR_BGR2HSV由BGR空间转换到hsv灰度空间
COLOR_GRAY2BGR由GRAY灰度空间转换到BGR空间
COLOR_HLS2RGB由HLS空间转换到RGB空间

等等许多,大家可以自己研究
注意: 这里的RGB和BGR有一点点不同,感兴趣的可以百度

保存图像(imwrite)

函数举例

imwrite("A:/opencvproject/grysrc.png", grysrc);

在这里插入图片描述
执行完之后会在对应的目录生成一个你想要的图片

函数介绍

imwrite()函数是将一个图片保存下来,它有两个参数:

  1. 第一个参数是指定图像保存的路径以及文件名称
  2. 第二个参数是指定要保存的目标图像,是一个Mat对象

完整程序

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace cv;
int main(int argc, char** argv) {
	Mat src = imread("A:/opencvproject/pikaqiu.jpg");
	if (src.empty()) {
		printf("could not load image...\n");
		return -1;
	}
	namedWindow("test_opencv_src", CV_WINDOW_AUTOSIZE);
	imshow("test_opencv_src", src);

	Mat grysrc;
	namedWindow("test_opencv_grysrc", CV_WINDOW_AUTOSIZE);
	cvtColor(src,grysrc, COLOR_BGR2GRAY);
	imshow("test_opencv_grysrc", grysrc);
	
	imwrite("A:/opencvproject/grysrc.png", grysrc);

	waitKey(0);
	return 0;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值