博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
opencv学习笔记一(imread,imshow,cvtColor,imwrite)
阅读量:3959 次
发布时间:2019-05-24

本文共 3292 字,大约阅读时间需要 10 分钟。

opencv学习笔记一(imread,imshow,cvtColor,imwrite)

引言

本人也是初学者,在学习了贾志刚老师的opencv视频课程后自己进行了一些笔记,其中函数及参数解释部分来源于学习内容,这里将其进行了部分记录,并在代码中加入了自己理解,可能有错误,欢迎指正。

函数及参数解释

加载图像(用cv::imread)

  • imread功能是加载图像文件成为一个Mat对象,其中第一个参数表示图像文件名称
  • 第二个参数,表示加载的图像是什么类型,支持常见的三个参数值
  • IMREAD_UNCHANGED (<0) 表示加载原图,不做任何改变
  • IMREAD_GRAYSCALE ( 0)表示把原图作为灰度图像加载进来
  • IMREAD_COLOR (>0) 表示把原图作为RGB图像加载进来
    *注意:OpenCV支持JPG、PNG、TIFF等常见格式图像文件加载

显示图像 (cv::namedWindos 与cv::imshow)

  • namedWindos功能是创建一个OpenCV窗口,它是由OpenCV自动创建与释放,你无需取销毁它。
  • 常见用法namedWindow(“Window Title”, WINDOW_AUTOSIZE)
  • WINDOW_AUTOSIZE会自动根据图像大小,显示窗口大小,不能人为改变窗口大小
  • WINDOW_NORMAL,跟QT集成的时候会使用,允许修改窗口大小。
  • imshow根据窗口名称显示图像到指定的窗口上去,第一个参数是窗口名称,第二参数是Mat对象

修改图像 (cv::cvtColor)

  • cvtColor的功能是把图像从一个彩色空间转换到另外一个色彩空间,有三个参数,第一个参数表示源图像、第二参数表示色彩空间转换之后的图像、第三个参数表示源和目标色彩空间如:COLOR_BGR2HLS 、COLOR_BGR2GRAY 等
  • cvtColor( image, gray_image, COLOR_BGR2GRAY );

保存图像(cv::imwrite)

  • 保存图像文件到指定目录路径
  • 只有8位、16位的PNG、JPG、Tiff文件格式而且是单通道或者三通道的BGR的图像才可以通过这种方式保存
  • 保存PNG格式的时候可以保存透明通道的图片
  • 可以指定压缩参数

图像处理结果及分析

1.原始的图像(1.jpg),此图像本身是3通道的,看着像单通道二值图像,但其为3通道图像在这里插入图片描述

1.1 经过imagewatch插件可以看到其通道状况(原始的图像)
在这里插入图片描述
2.经过cvtColor(src, output_image, CV_BGR2GRAY); 将原始BGR图像灰度化后,由三通道变为单通道后的灰度图像。
在这里插入图片描述
3.经过threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);处理,二值化后的图像,单通道内的值只有0或255,此为二值图像。
在这里插入图片描述
1.原始的图像(2.bmp),此本身为单通道二值图像,当以Imread原图方式IMREAD_UNCHANGED读取时,后面就不需要进行色彩空间的转换为灰度图像了,否则的话使用COLOR_BGR2GRAY方式进行色彩空间转换可能会报错
在这里插入图片描述
2.使用imagewatch可查看其内部数值,单通道且只有255和0的值。
在这里插入图片描述

代码实现

#include 
#include
using namespace std;//后面的cout需要用到using namespace cv;int main(){
//Mat src = imread("2.bmp"); //此处默认是以三通道RGB的方式读取图像(无论原始图像是单通道二值(2.bmp)的都会变为RGB图像) //Mat src = imread("3.PNG",IMREAD_GRAYSCALE);//IMREAD_GRAYSCALE (0)以灰度图的方式读取(可以将3通道的转换成单通道的),使用imagewatch可以看到 //Mat src = imread("FigFindCountours1.bmp", IMREAD_COLOR);//IMREAD_COLOR(>0) 表示把原图作为RGB图像加载进来(可以将单通道的二值图像变成3通道的) Mat src = imread("1.jpg", IMREAD_UNCHANGED);//IMREAD_UNCHANGED (<0) 以原始图像的方式读取,此张图片3.PNG本身为三通道的,使用imagewatch可以更直观的看到 //cout << src.type() << endl; //通过此值可以查看所读取的图像属于什么类型,如16表示8位无符号整型3通道的数据类型,https://blog.csdn.net/jeffdeen/article/details/52401526 if (src.empty()){
printf("could not load image...\n"); return -1; } namedWindow("opencv setup demo",CV_WINDOW_AUTOSIZE);//由opencv自动创建窗口并释放的,在早期版本还需要销毁 //namedWindos功能是创建一个OpenCV窗口,它是由OpenCV自动创建与释放,你无需取销毁它。 // 常见用法namedWindow("Window Title", WINDOW_AUTOSIZE) // WINDOW_AUTOSIZE会自动根据图像大小,显示窗口大小,不能人为改变窗口大小 // WINDOW_NORMAL, 跟QT集成的时候会使用,允许修改窗口大小。 // imshow根据窗口名称显示图像到指定的窗口上去,第一个参数是窗口名称,第二参数是Mat对象 imshow("opencv setup demo", src);//将图像显示到指定窗口 Mat gray; //进行灰度化 cvtColor(src, gray, CV_BGR2GRAY);//将读取得到的BGR图像转换为灰度图像,此处与前方读取图像的IMREAD_GRAYSCALE功能相同 //此处应注意,当参数为CV_BGR2GRAY(BGR转成GRAY)等时,前方的输入图像必须为3通道的BGR图像,否则程序会崩溃 //cvtColor(src, output_image,CV_BGR2HLS);//将RGB转换成HLS图像,H代表色相,L代表亮度,S代表饱和度转换到此空间我们就有很多东西可以控制了,还可以将其转换为rgb空间 namedWindow("gray windows", CV_WINDOW_AUTOSIZE); imshow("gray windows", gray); imwrite("gray.png", gray); Mat binary; //进行二值化 threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU); namedWindow("binary windows", CV_WINDOW_AUTOSIZE); imshow("binary windows", binary); imwrite("binary.png", binary);//imwrite保存图像文件到指定目录路径 /*只有8位、16位的PNG、JPG、Tiff文件格式而且是单通道或者三通道的BGR的图像才可以通过这种方式保存 保存PNG格式的时候可以保存透明通道的图片 可以指定压缩参数*/ waitKey(0); return 0;}
你可能感兴趣的文章