【OpenCV自学(一)】读写图像

OpenCV基础操作

--读写图像--

湖南大学通信工程15级||毛耀升 | | 2018. 06. 05

设计简介

实现对一张图像的read、write以及show操作

能将图像转换为灰度图像

能读出图像任何一点的像素值(BRG)

设计环境

IDE:Visual Studio2015

Library:OpenCV3.4.1

设计效果/输出内容

【图像效果对比】

【OpenCV自学(一)】读写图像

【OpenCV自学(一)】读写图像

【像素值输出】

【OpenCV自学(一)】读写图像

代码以及讲解

必要流、库以及命名空间

#include<iostream>

#include"opencv2/core.hpp"

#include"opencv2/highgui.hpp"

usingnamespace std;

usingnamespace cv;

core和highgui提供了OpenCV必须的跨平台I/O函数,前者主要包括例如矩阵(Rect、Point、Scalar……)等基本类,后者主要包括读取、写入、使用图形界面显示图像的函数

读取图片以及其非纯真彩形式

Mat color = imread("…/Aoi.jpg");

Mat gray = imread("…/Aoi.jpg",CV_LOAD_IMAGE_GRAYSCALE);

Imread函数接受两个参数

第一个参数即包含图像路径的字符串

另一个参数可以认为是图像信息的载入类型,这个载入类型无关于图像的类型(当然,如果图像是.png这样的没有压缩的或者压缩率不高的,IDE读起来可能会比较吃力),表示的是接收时图像的模式。这个参数类型包括:CV_LOAD_IMAGE_GRAYSCALE、CV_LOAD_IMAGE_COLOR、CV_LOAD_IMAGE_ANYDEPTH。

顾名思义,设置CV_LOAD_IMAGE_GRAYSCALE或者0表示获取灰度图;

设置CV_LOAD_IMAGE_COLOR或者不设置表示获取彩色图;

设置CV_LOAD_IMAGE_ANYDEPTH默认转换为8位图像,可直接输入深度值使其返回16位或者32位的图像。

输出图像文件

imwrite("…/Aoi.jpg", gray);

即写图像至指定路径

显示图像

imshow("Aoi BGR",color);

imshow("Aoi Gray", gray);

imshow函数吸收两个参数,第一个为窗口的title(由coder指定或者输入),另一个为对应的图像矩阵信息

获取像素信息

intmyRow = color.cols - 1;

intmyCol = color.rows - 1;

Vec3b pixel = color.at<Vec3b>(myRow, myCol);

cout <<"Pixelvalue (B,R,G):("<< (int)pixel[0]<<","<< (int)pixel[1]<<","<< (int)pixel[2]<<")"<< endl;

.col以及.rows参数返回了图像矩阵的行列数值

使用Mat类中的at模板函数(cv::Mat::at< typename >(row, col))便于获取以及操作图像矩阵的像素值

举一反三

【imread函数的参数】

关于imread函数的第二个参数,对应不同输入,其返回了不同结果的像素值,设置三个量,对比分析输入与像素输出的关系

修改获取像素均为中心位置,并且设置分别输出color、gray、depth8、depth16的图像以及中心像素值(BGR)

【OpenCV自学(一)】读写图像

四种参数输出中心像素对应结果

能认识到,gray同depth8(默认参数值)同结果(这点从四张图片也能印证),而仅有16位的图为其他三幅的1/4(长宽均为1/2)

--参考代码:ImgRWtest.cpp--

查阅资料后了解,认为对于imread()函数,可以用Channel(通道)以及depth(深度)来理解。

关于channel,即每幅图像都对应RGB三个通道,不同的参数值对应输出不同的通道数;

关于depth,即图像的位数,反应了数据量大小,对于显示暂没有特别大影响

以下表比较详细得介绍了不同参数的结果

IMTEAD_UNCHANGED = -1:废置!(实际操作就是“没有改变”)

IMREAD_GRAYSCALE  = 0:设置此表示,将图像转化为单通道灰度图(GRAY

IMREAD_COLOR     = 1:将图像转化为三通道BGR彩色图像(COLOR)

IMREAD_ANYDEPTH   = 2:若载入图像的深度为16或32位就返回对应深度的图像,否则将图像转换为8位图像(GRAY)

IMREAD_ANYCOLOR = 4:图像可被读取为任意可能的彩色格式

IMREAD_LOAD_GDAL = 8:使用文件格式驱动加载图像

另外,关于参数影响输出深度以及通道数的结果表

flag=-1时,8位深度,原通道

flag=0,8位深度,1通道

flag=1,   8位深度  ,3通道

flag=2,原深度,1通道

flag=3,  原深度,3通道

flag=4,8位深度 ,3通道

参考、引用内容

本报告系列主要参考书目《OpenCV By Example》中文版——《OpenCV实例详解》

报告模板采用Microsoft Office Word 2013自带模板

全文字体采用 YaHei Consolas Hybrid

封面页眉页尾图片源自百度

项目路径:...\ImgRW

设计心得

   本次设计完全参考了书目中的代码,但在对函数的分析中,包括从网上查阅资料、修改参数数值分析等都学到了很多关于函数的用法,收益匪浅。本次设计结束,基本了解了opencv的图像读写展示的方法。而本次在设计中主要学习了imread()函数,下次设计将会针对At函数进行深入研究,尝试对图像矩阵的像素获取以及进行修改。