【OpenCV基础】第二课:加载、修改、保存图像

加载图像,显示图像,修改图像,保存图像

Posted by x-jeff on April 1, 2019

本文为原创文章,未经本人允许,禁止转载。转载请注明出处。

1.颜色空间

颜色空间:也称彩色模型(又称彩色空间彩色系统)。本质上,彩色模型是坐标系统和子空间的阐述。位于系统的每种颜色都有单个点表示。RGB(红绿蓝)是依据人眼识别的颜色定义出的空间,可表示大部分颜色。但在科学研究中一般不采用RGB颜色空间,因为它的细节难以进行数字化的调整。它将色调,亮度,饱和度三个量放在一起表示,很难分开。

2.加载图像

cv::imread功能是加载图像文件成为一个Mat对象。

cv::imread有两个参数:

  1. 第一个参数表示图像文件名称。
  2. 第二个参数表示加载的图像是什么类型,支持常见的三个参数值:
    • IMREAD_UNCHANGED(<0)表示加载原图,不做任何改变。
    • IMREAD_GRAYSCALE(0)表示把原图作为灰度图像加载进来。
    • IMREAD_COLOR(>0)表示把原图作为RGB图像加载进来。

⚠️OpenCV支持JPG、PNG、TIFF等常见格式图像文件加载。

👉Demo1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(){
    Mat src=imread("/Users/xinshichao/PersonalWork/C++Demo/Pictures/p1.jpeg",IMREAD_UNCHANGED);
    if(src.empty()){
        printf("could not find the image...\n");
        return -1;
    }
    namedWindow("src",WINDOW_AUTOSIZE);
    imshow("src",src);
    waitKey(0);
    return 0;
}

Demo1输出结果:

👉Demo2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(){
    Mat src=imread("/Users/xinshichao/PersonalWork/C++Demo/Pictures/p1.jpeg",IMREAD_GRAYSCALE);
    if(src.empty()){
        printf("could not find the image...\n");
        return -1;
    }
    namedWindow("src",WINDOW_AUTOSIZE);
    imshow("src",src);
    waitKey(0);
    return 0;
}

Demo2输出结果:

👉Demo3:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(){
    Mat src=imread("/Users/xinshichao/PersonalWork/C++Demo/Pictures/p1.jpeg",IMREAD_COLOR);
    if(src.empty()){
        printf("could not find the image...\n");
        return -1;
    }
    namedWindow("src",WINDOW_AUTOSIZE);
    imshow("src",src);
    waitKey(0);
    return 0;
}

Demo3输出结果(和Demo1结果一样,因为原图就是RGB彩色图像):

3.显示图像

cv::namedWindow的功能是创建一个OpenCV窗口,它是由OpenCV自动创建与释放,用户无需销毁它。

常见用法:

1
namedWindow("Window Title",WINDOW_AUTOSIZE)

WINDOW_AUTOSIZE会自动根据图像大小,显示窗口大小,不能人为改变窗口大小。

WINDOW_NORMAL允许修改窗口的大小。

cv::imshow根据窗口名称显示图像到指定的窗口上去,第一个参数是窗口名称,第二个参数是Mat对象。

代码示例见第2部分的Demo1~Demo3。

4.修改图像

cv::cvtColor的功能是把图像从一个彩色空间转换到另一个彩色空间,有三个参数,第一个参数表示源图像,第二个参数表示彩色空间转换之后的图像,第三个参数表示源和目标色彩空间,如:COLOR_BGR2HLSCOLOR_BGR2GRAY等。

HLS彩色空间:色调(H),亮度(L),饱和度(S)。

是BGR而不是RGB是因为一个像素点内三个通道的排列顺序就是B、G、R。

Demo4:

1
2
3
4
    Mat src_gray;
    cvtColor(src,src_gray,COLOR_BGR2GRAY);
    namedWindow("src_gray",WINDOW_AUTOSIZE);
    imshow("src_gray",src_gray);

Demo4输出结果同Demo2。

5.保存图像

cv::imwrite可以保存图像到指定目录路径。

只有8位、16位的PNG、JPG、Tiff文件格式而且是单通道或者三通道的BGR图像才可以通过这种方式保存。

保存PNG格式的时候可以保存透明通道的图片。

可以指定压缩参数。

6.代码地址

  1. 图像的加载、显示、修改、保存

7.参考资料

  1. 颜色空间(百度百科)