美文网首页
三(3.1 core 模块)图像加载,修改,保存

三(3.1 core 模块)图像加载,修改,保存

作者: 交大小丑 | 来源:发表于2018-11-03 15:07 被阅读0次
    • 加载图像 imread
    • 显示图像 NameWindow & imshow
    • 修改图像 cvtcolor
    • 保存图像 imwrite

    Imread

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

    参数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)

    一、图片路径问题

    通常我要获取一张图片的绝对路径是这样做的:在图片上右键——属性——安全——对象名称。然后复制对象名称就得到了图片的绝对路径。


    获取图片路径

    然而这样得到的路径直接复制粘贴到vs里面会直接报错,如下:


    图片路径出错

    可以看出我们获取的绝对路径的表示方法是单右斜线形式的。显然opencv的imread()不支持这种方式。但是!!!经过实验发现imread()除了不支持单右斜线形式,其他斜线形式都支持!!!比如双右斜线形式、双左斜线形式、单左斜线形式、前述三种斜线混合型式都是支持的!!我想知道为什么??

    看图,下面的六种方式任何一种都是支持的,都可以成功读取并显示图片。


    图片路径写法

    第5种,相对路径法。只需要把图像文件放在工程文件夹下和.cpp文件放在一起就行了,读取的时候就可以直接用名字读取,如imread("miao.jpg");

    最后一种命令行参数法是源码中比较常见的。设置方法是:
    工程——属性——配置属性——调试——命令行参数,然后设置就行了。如图:


    命令行参数法

    设置之后miao.jpg就是argv[1],2.jpg就是argv[2]。

    #include<opencv2\opencv.hpp>
     
    using namespace cv;
     
    int main(int argc,char* argv[])
    {
        Mat img;
     
        //-- 1 --双右斜线法
        //string imgpath = "C:\\Users\\bingbuyu\\Pictures\\photo\\miao1.jpg";
        //-- 2 --双左斜线法
        //string imgpath = "C://Users//bingbuyu//Pictures//photo//miao1.jpg";
        //-- 3 --单左斜线法
        //string imgpath = "C:/Users/bingbuyu/Pictures/photo/miao1.jpg";
        //-- 4 --以上三种混合法
        //string imgpath = "C:/Users//bingbuyu\\Pictures//photo//miao1.jpg";
        //-- 5 --相对路径法
        //string imgpath = "miao.jpg";
        //-- 6 --命令行参数法
        string imgpath = argv[1];
        img = imread(imgpath, 1);
    
        imshow("img", img);
     
        waitKey(0);
        return 0;
    }
    

    读入图像通道

    使用OpenCV的imread()函数读入图像,往往需要区分图像是单通道图像还是多通道图像。灰度图像通道数(channels)为1(占8位),彩色图像通道数(channels)为3(占24位)。

    灰度图像只需要一个0-255的值来描述,imread(“image_path”,0)进行灰度图像读入,如果不是灰度图像则将其转化为灰度图像。灰度图像在内存中连续存储,在Mat存储如下图:

    灰度图像

    彩色图像通道数为3,BGR三色存储,每个通道用一个0-255的值描述,再将其合成为彩色图像输出,imread(“image_path",1)进行彩色图像读入,如果不是彩色图像则3通道每个通道数值相同,彩色图像在内存中有可能连续存储有可能分行存储,在Mat数据存储如下图:

    彩色图像

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

    enum
    {
    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.
    };
    

    总结如下:

    flag=-1时,8位深度,原通道
    flag=0,8位深度,1通道
    flag=1,   8位深度  ,3通道
    flag=2,原深度,1通道
    flag=3,  原深度,3通道
    flag=4,8位深度 ,3通道
    

    通道,与像素深度深度有关。灰度图通常是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()函数读取图片的六种正确姿势 - 星沉阁 - CSDN博客 https://blog.csdn.net/xingchenbingbuyu/article/details/51375078
    OpenCV读入图像及通道详解 - 小伟锅的博客 - CSDN博客 https://blog.csdn.net/u011028345/article/details/74847601
    OpenCV之imread解析 - FireBird的专栏 - CSDN博客 https://blog.csdn.net/firstlai/article/details/70882240
    opencv中imread第二个参数的含义 - z914022466的博客 - CSDN博客 https://blog.csdn.net/z914022466/article/details/52709981

    cvtcolor

    颜色空间

    RGB颜色空间、色调、饱和度、亮度、HSV颜色空间详解 - 17岁boy的博客 - CSDN博客 https://blog.csdn.net/bjbz_cxy/article/details/79701006

    我们生活中大多数看到的彩色图片都是RGB类型,但是在进行图像处理时,需要用到灰度图、二值图、HSV、HSI等颜色制式,opencv提供了cvtColor()函数来实现这些功能。首先看一下cvtColor函数定义:

    cv::cvtColor()用于将图像从一个颜色空间转换到另一个颜色空间的转换(目前常见的颜色空间均支持),并且在转换的过程中能够保证数据的类型不变,即转换后的图像的数据类型和位深与源图像一致。
    具体调用形式如下:

    void cv::cvtColor(
    cv::InputArray src, // 输入序列
    cv::OutputArray dst, // 输出序列
    int code, // 颜色映射码
    int dstCn = 0 // 输出的通道数 (0='automatic')
    );
    

    (1)InputArray src: 输入图像即要进行颜色空间变换的原图像,可以是Mat类
    (2)OutputArray dst: 输出图像即进行颜色空间变换后存储图像,也可以Mat类
    (3)int code: 转换的代码或标识,即在此确定将什么制式的图片转换成什么制式的图片,后面会详细将
    (4)int dstCn = 0: 用于指定目标图像的通道数,如果指定的值是默认值0,那么通道数将由输入图像和颜色转换码决定。

    cv::cvtColor()支持多种颜色空间之间的转换,其支持的转换类型和转换码如下:

    1、RGB和BGR(OpenCV默认的彩色图像的颜色空间是BGR)颜色空间的转换
    cv::COLOR_BGR2RGB
    cv::COLOR_RGB2BGR
    cv::COLOR_RGBA2BGRA
    cv::COLOR_BGRA2RGBA
    2、向RGB和BGR图像中增添alpha通道
    cv::COLOR_RGB2RGBA
    cv::COLOR_BGR2BGRA
    3、从RGB和BGR图像中去除alpha通道
    cv::COLOR_RGBA2RGB
    cv::COLOR_BGRA2BGR
    4、从RBG和BGR颜色空间转换到灰度空间
    cv::COLOR_RGB2GRAY
    cv::COLOR_BGR2GRAY
    cv::COLOR_RGBA2GRAY
    cv::COLOR_BGRA2GRAY
    5、从灰度空间转换到RGB和BGR颜色空间
    cv::COLOR_GRAY2RGB
    cv::COLOR_GRAY2BGR
    cv::COLOR_GRAY2RGBA
    cv::COLOR_GRAY2BGRA
    6、RGB和BGR颜色空间与BGR565颜色空间之间的转换
    cv::COLOR_RGB2BGR565
    cv::COLOR_BGR2BGR565
    cv::COLOR_BGR5652RGB
    cv::COLOR_BGR5652BGR
    cv::COLOR_RGBA2BGR565
    cv::COLOR_BGRA2BGR565
    cv::COLOR_BGR5652RGBA
    cv::COLOR_BGR5652BGRA
    7、灰度空间域BGR565之间的转换
    cv::COLOR_GRAY2BGR555
    cv::COLOR_BGR5552GRAY
    8、RGB和BGR颜色空间与CIE XYZ之间的转换
    cv::COLOR_RGB2XYZ
    cv::COLOR_BGR2XYZ
    cv::COLOR_XYZ2RGB
    cv::COLOR_XYZ2BGR
    9、****RGB和BGR颜色空间与uma色度(YCrCb空间)之间的转换
    cv::COLOR_RGB2YCrCb
    cv::COLOR_BGR2YCrCb
    cv::COLOR_YCrCb2RGB
    cv::COLOR_YCrCb2BGR
    10、RGB和BGR颜色空间与HSV颜色空间之间的相互转换
    cv::COLOR_RGB2HSV
    cv::COLOR_BGR2HSV
    cv::COLOR_HSV2RGB
    cv::COLOR_HSV2BGR
    11、RGB和BGR颜色空间与HLS颜色空间之间的相互转换
    cv::COLOR_RGB2HLS
    cv::COLOR_BGR2HLS
    cv::COLOR_HLS2RGB
    cv::COLOR_HLS2BGR
    12、RGB和BGR颜色空间与CIE Lab颜色空间之间的相互转换
    cv::COLOR_RGB2Lab
    cv::COLOR_BGR2Lab
    cv::COLOR_Lab2RGB
    cv::COLOR_Lab2BGR
    13、RGB和BGR颜色空间与CIE Luv颜色空间之间的相互转换
    cv::COLOR_RGB2Luv
    cv::COLOR_BGR2Luv
    cv::COLOR_Luv2RGB
    cv::COLOR_Luv2BGR
    14、Bayer格式(raw data)向RGB或BGR颜色空间的转换
    cv::COLOR_BayerBG2RGB
    cv::COLOR_BayerGB2RGB
    cv::COLOR_BayerRG2RGB
    cv::COLOR_BayerGR2RGB
    cv::COLOR_BayerBG2BGR
    cv::COLOR_BayerGB2BGR
    cv::COLOR_BayerRG2BGR
    cv::COLOR_BayerGR2BGR

    参考:
    openCV (iOS)中颜色空间转换cvtColor() - 简书 https://www.jianshu.com/p/eeb1926caa4d

    imwrite

    压缩参数

    相关文章

      网友评论

          本文标题:三(3.1 core 模块)图像加载,修改,保存

          本文链接:https://www.haomeiwen.com/subject/mexjtqtx.html