opencv的imread函数_opencv imwrite

opencv的imread函数_opencv imwrite近日,开始学习图像处理,思前想后决定以opencv作为实验基础。遂完成图片读取和显示功能。Imread作为常用的图像读取函数,虽然简单,但是参数的选择非常重要,直接影响到后期处理。同时在调试学习过程中也可以学习到图像处理的知识。0函数原型   Matimread(constString&filename,intflags=IMREAD_COLOR);

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

    近日,开始学习图像处理,思前想后决定以opencv作为实验基础。遂完成图片读取和显示功能。Imread作为常用的图像读取函数,虽然简单,但是参数的选择非常重要,直接影响到后期处理。同时在调试学习过程中也可以学习到图像处理的知识。

0 函数原型

    Mat imread(const String& filename,int flags = IMREAD_COLOR);

    返回Mat对象;

    参数filename: 待打开图片的绝对地址,需要注意的是,并不是所有文件都可以用它打开,它支持的文件如下;函数识别不是依靠文件的后缀名,而是依靠内容的编码格式;

需要注意的是imread读取数据时会重新排列数据。

  • Windows bitmaps – *.bmp, *.dib (always supported)
  • JPEG files – *.jpeg, *.jpg, *.jpe (see the Notes section)
  • JPEG 2000 files – *.jp2 (see the Notes section)
  • Portable Network Graphics – *.png (see the Notes section)
  • WebP – *.webp (see the Notes section)
  • Portable image format – *.pbm, *.pgm, *.ppm *.pxm, *.pnm (always supported)
  • Sun rasters – *.sr, *.ras (always supported)
  • TIFF files – *.tiff, *.tif (see the Notes section)
  • OpenEXR Image files – *.exr (see the Notes section)
  • Radiance HDR – *.hdr, *.pic (always supported)
  • Raster and Vector geospatial data supported by Gdal (see the Notes section)

    参数flags:打开的参数,这个非常重要,因为如果设置不合适的话,很容易出现预想之外的效果。它可以指导将原图读取时进行一定的转换。默认值是IMREAD_LOAD_GDAL。因此,如果是想直接处理原图,应该设置为IMREAD_UNCHANED。

IMREAD_UNCHANGED 

If set, return the loaded image as is (with alpha channel, otherwise it gets cropped).

IMREAD_GRAYSCALE 

If set, always convert image to the single channel grayscale image.

IMREAD_COLOR 

If set, always convert image to the 3 channel BGR color image.

IMREAD_ANYDEPTH 

If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit.

IMREAD_ANYCOLOR 

If set, the image is read in any possible color format.

IMREAD_LOAD_GDAL 

If set, use the gdal driver for loading the image.

IMREAD_REDUCED_GRAYSCALE_2 

If set, always convert image to the single channel grayscale image and the image size reduced 1/2.

IMREAD_REDUCED_COLOR_2 

If set, always convert image to the 3 channel BGR color image and the image size reduced 1/2.

IMREAD_REDUCED_GRAYSCALE_4 

If set, always convert image to the single channel grayscale image and the image size reduced 1/4.

IMREAD_REDUCED_COLOR_4 

If set, always convert image to the 3 channel BGR color image and the image size reduced 1/4.

IMREAD_REDUCED_GRAYSCALE_8 

If set, always convert image to the single channel grayscale image and the image size reduced 1/8.

IMREAD_REDUCED_COLOR_8 

If set, always convert image to the 3 channel BGR color image and the image size reduced 1/8.

1 通道编码顺序

    通道,与像素深度深度有关。灰度图通常是8比特的像素深度,则通道数为1。如果是彩色图,且为RGB编码,那么一般为24比特的像素深度,通道数为3。而有的彩色图的像素深度是16或者32比特。16比特可能有多种情况:一是压缩的RGB格式,二是YUV的输出。无论何种,都是只有2通道,需要手动解析分离。32比特(windows *.bmp)的像素深度对应的彩色图,则表示的是4通道,RGBA,多出的A表示的是透明度的索引。

    另外读取时需要注意内部像素的编码顺序,这也依赖于imread的flags选项的取值,如果取值决定转成RGB,那么正常的顺序是BGR,排列顺序如下图所示。如果最后imread输出是四通道,多了Alpha通道,那么顺序是RGBA。

    opencv的imread函数_opencv imwrite

2 图像像素通道数据访问

    这部分可以借鉴网上资料,可以分为三种类型。

2.1 动态访问at<typename>(i,j)

    Imread返回的mat类,提供了at模板函数。Image.at<uchar>(i, j);取出i行j列的数据,uchar可以理解为imread返回之后图像的编码类型(如1所述的通道)。如果是三通道,则可以是Vec3b,四通道则是Vec4b。

//CV_LOAD_IMAGE_UNCHANGED如果要取A分量那么flag最好设置成这个值

Mat image = imread(“1_firstlai.png”, CV_LOAD_IMAGE_UNCHANGED);

for(int i=0;i<image.rows;i++)

{

    for(int j=0;j<image.cols;j++)

    {

        image.at<Vec3b>(i,j)[0]; //B

        image.at<Vec3b>(i,j)[1]; //G

        image.at<Vec3b>(i,j)[2]; //R

       

        image.at<Vec4b>(i,j)[0]; //B

        image.at<Vec4b>(i,j)[1]; //G

        image.at<Vec4b>(i,j)[2]; //R

        image.at<Vec4b>(i,j)[3]; //A

    }

}

 

2.2 指针-更加高效

    imgage.ptr<uchar>(i)。

int nr=image.rows;

// 3通道转换为1通道

int nl=image.cols*image.channels();

for(int k=0;k<nr;k++)

{

    // 每一行图像的指针

    const uchar* inData=image.ptr<uchar>(k);

    for(int i=0;i<nl;i++)

    {

        inData[i];

    }

}

    本质就是将每行的3/4通道数据转换为1通道数据访问,因为OpenCV内部存储每一行像素数据以及像素内部通道数据都是连续存储的。但是行与行的数据并不一定是连续存储的,所以不能应用在行与行之间。

2.3 结合isContinuous的指针

    2.2中已经说明了,OpenCV中行与行之间不一定连续存储,也就是有可能连续存储,而且提供了对应的API支持判断是否连续这一现象,也可基于此,再提高访问速度。

int nr=image.rows;

int nc=image.cols*image.channels();

if(image.isContinuous()){

    nc=nc*nr;

    nr=1;

}

for(int i=0;i<nr;i++){

    // 每一行图像的指针

    const uchar* inData=image.ptr<uchar>(i);

    for(int j=0;j<nc;j++){

        inData[j];

    }

}

2.4 安全但低效的迭代器

    2.1-2.3的方法虽然效率高,但是如果操作不小心,容易造成数组越界的Bug。所以opencv提供了一种更安全的访问方法-迭代器。

MatIterator_<Vec3b> it_im, itEnd_im;

it_im    = im.begin<Vec3b>(); 

itEnd_im = im.end<Vec3b>(); 

for (; it_im != itEnd_im; it_im++, it_om++){
 

    (*it_im)[0] ; //B

    (*it_im)[1] ; //G

    (*it_im)[2] ; //R 

} 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/182081.html原文链接:https://javaforall.net

(0)
上一篇 2022年10月14日 下午2:00
下一篇 2022年10月14日 下午2:00


相关推荐

  • Myeclipse激活成功教程方法及失败解决方案

    Myeclipse激活成功教程方法及失败解决方案转自 CSDN 用户丶 Seven 补丁支持的 Myeclipse 版本 2013 2014 10 x 补丁度盘链接 https pan baidu com s 1AyHeW6vaqvK 提取码 ps8t 常规激活成功教程步骤 1 运行激活成功教程补丁下图即为激活成功教程补丁压缩文件解压后的文件列表 如图中所示 主文件 cracker jar 用于运行并激活成功教程 MyEclipse 为了跨平台兼容 该激活成功教程程

    2026年3月19日
    2
  • seekg ()[通俗易懂]

    seekg ()[通俗易懂] seekg语法:istream&seekg(off_typeoffset,ios::seekdirorigin);istream&seekg(pos_typeposition);函数seekg()用于输入流,并且它将重新设置”get”指针到当前流的从origin偏移offset个字节的位置上,或是置”get”指针在position位

    2022年6月10日
    41
  • 国二C语言:VC++2010学习版「建议收藏」

    国二C语言:VC++2010学习版「建议收藏」全国计算机等级考试二级C语言程序设计考试大纲(2019年版)指出:开发环境:MicrosoftVisualC++2010学习版。也就是说,不管你在学习过程中用的是什么样的开发环境…

    2022年4月20日
    341
  • pycharm查看python版本-pycharm如何设置python版本

    pycharm查看python版本-pycharm如何设置python版本直接上图 mac 环境 一 设置项目的 python 版本 File DefaultSetti 在弹出的界面上 参考下图 左上角的下拉框里 选择 python 解释器的版本即可 建议 直接安装 anaconda 这个已经集成了很多第三方的类库 二 添加第三方类库仍然在上图中 下面有一个 号按钮 点击进入下图 直接在搜索框里 搜索需要的第三方类库即可 以 tensorflow 为例 找到后点击

    2026年3月27日
    2
  • QUOTENAME函数的用法

    QUOTENAME函数的用法quotename函数的语法为:quotename('expression1','expression2')expression1:指的是需要被特殊处理的字符expre

    2022年7月3日
    38
  • LaTeX常用操作:添加标题、作者、时间、摘要、标题、段落、目录、字体、引用、脚注、图片\表格插入、数学符号、公式、交叉引用等

    LaTeX常用操作:添加标题、作者、时间、摘要、标题、段落、目录、字体、引用、脚注、图片\表格插入、数学符号、公式、交叉引用等前言这里就当作一个小案例进行介绍 案例需求环境 win10 系统 编译软件 TexLive2018 选择 XeLaTeX 进行编译的 如果第一次编译报错 再进行一次编译即可 程序的源文件及材料已放在百度云中 链接 https pan baidu com s 1BHt0EVhAqKk TJgA 提取码 0pmd 编辑过程 1 为文章添加标题 作者 时间 maketitle 这一

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号