【OpenCV自学(一)】读写图像
OpenCV基础操作
--读写图像--
湖南大学通信工程15级||毛耀升 | | 2018. 06. 05
设计简介
实现对一张图像的read、write以及show操作
能将图像转换为灰度图像
能读出图像任何一点的像素值(BRG)
设计环境
IDE:Visual Studio2015
Library:OpenCV3.4.1
设计效果/输出内容
【图像效果对比】
【像素值输出】
代码以及讲解
必要流、库以及命名空间
#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)
四种参数输出中心像素对应结果
能认识到,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函数进行深入研究,尝试对图像矩阵的像素获取以及进行修改。