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

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

  • 引言
  • 函数及参数解释
      • 加载图像(用cv::imread)
      • 显示图像 (cv::namedWindos 与cv::imshow)
      • 修改图像 (cv::cvtColor)
      • 保存图像(cv::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通道图像opencv学习笔记一(imread,imshow,cvtColor,imwrite)_第1张图片
1.1 经过imagewatch插件可以看到其通道状况(原始的图像)
opencv学习笔记一(imread,imshow,cvtColor,imwrite)_第2张图片
2.经过cvtColor(src, output_image, CV_BGR2GRAY); 将原始BGR图像灰度化后,由三通道变为单通道后的灰度图像。
opencv学习笔记一(imread,imshow,cvtColor,imwrite)_第3张图片
3.经过threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);处理,二值化后的图像,单通道内的值只有0或255,此为二值图像。
opencv学习笔记一(imread,imshow,cvtColor,imwrite)_第4张图片
1.原始的图像(2.bmp),此本身为单通道二值图像,当以Imread原图方式IMREAD_UNCHANGED读取时,后面就不需要进行色彩空间的转换为灰度图像了,否则的话使用COLOR_BGR2GRAY方式进行色彩空间转换可能会报错
在这里插入图片描述
2.使用imagewatch可查看其内部数值,单通道且只有255和0的值。
opencv学习笔记一(imread,imshow,cvtColor,imwrite)_第5张图片

代码实现

#include <opencv2/opencv.hpp>
#include <iostream>

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;
}

你可能感兴趣的:(opencv,计算机视觉,c++)