作者:抑制不L挑逗烛 | 来源:互联网 | 2023-09-25 18:20
Opencv的图片读取,显示,保存是图片操作的基础,实验用的图片来自于lenan:http://www.lenna.org/
为了使用方
便,主要是使用opencv的python版本的接口,其官网链接为http://docs.opencv.org/
Read an image
opencv读取图片API为cv.read,其API原型为:
retval = cv.imread( filename[, flags] )
参数意义:
filename: 必选项,为要读取到的图片文件名,包括其文件所在的路径
flags:可选项,默认为cv.IMREAD_COLOR,该参数主要为要读取到的图片方式,经常用到的主要由以下几个选项
Flags | Description |
cv.IMREAD_COLOR | 读取其彩色图片,为RGB通道,其值为1 |
cv.IMREAD_GRAYSCALE | 读取灰色图,单通道,其值为0 |
cv.IMREAD_UNCHANGED | 除了读取彩色图片外,还包括alpha通道,其值为-1 |
目前,opencv imread支持的图片名后缀格式:
- Windows bitmaps - *.bmp, *.dib (always supported)
- JPEG files - *.jpeg, *.jpg, *.jpe (see the Note section)
- JPEG 2000 files - *.jp2 (see the Note section)
- Portable Network Graphics - *.png (see the Note section)
- WebP - *.webp (see the Note section)
- Portable image format - *.pbm, *.pgm, *.ppm *.pxm, *.pnm (always supported)
- PFM files - *.pfm (see the Note section)
- Sun rasters - *.sr, *.ras (always supported)
- TIFF files - *.tiff, *.tif (see the Note section)
- OpenEXR Image files - *.exr (see the Note section)
- Radiance HDR - *.hdr, *.pic (always supported)
- Raster and Vector geospatial data supported by GDAL (see the Note section)
其用例如下:
import numpy as np
import cv2 as cvimg = cv.imread(".././datasheet/len_top.jpg",cv.IMREAD_COLOR)
cv.imshow('lenna',img)
读取图片的C++接口如下,和python接口类似:
Mat cv::imread (const String & filename,int flags = IMREAD_COLOR )
返回为Mat, flags参数列表如下:
flags | Description |
IMREAD_UNCHANGED = -1 | 按照原图进行加载,不做任何改变 |
IMREAD_GRAYSCALE = 0 | 将图片按照单通道灰度图进行加载,加载结果为单通道灰度值 |
IMREAD_COLOR = 1 | 将图片按照BGR3通道进行加载,加载结果为彩色三通道 |
IMREAD_ANYDEPTH = 2 | 读取其深度图片,个人理解是可以读取16位或者32位图片,与输入的原图位数一致 |
IMREAD_ANYCOLOR = 4 | 读取原图为任意彩色图模式 |
IMREAD_LOAD_GDAL = 8 | 使用gdal驱动程序加载图像(暂时不知道又何用处,做了下实验如果是彩色图,加载出来的mat是多通道) |
IMREAD_REDUCED_GRAYSCALE_2 = 16 | 将图片加载为灰度图,且图像长和宽为分别为原图的1/2 |
IMREAD_REDUCED_COLOR_2 = 17 | 将图片按照BGR3通道进行加载,且图像长和宽为分别为原图的1/2 |
IMREAD_REDUCED_GRAYSCALE_4 = 32 | 将图片加载为灰度图,且图像长和宽为分别为原图的1/4 |
IMREAD_REDUCED_COLOR_4 = 33 | 将图片按照BGR3通道进行加载,且图像长和宽为分别为原图的1/4 |
IMREAD_REDUCED_GRAYSCALE_8 = 64 | 将图片加载为灰度图,且图像长和宽为分别为原图的1/8 |
IMREAD_REDUCED_COLOR_8 = 65 | 将图片按照BGR3通道进行加载,且图像长和宽为分别为原图的1/8 |
IMREAD_IGNORE_ORIENTATION = 128 | 不以EXIF的方向旋转图像 |
对上述flags的值划分理解可以参考下面的一篇博客:
https://blog.csdn.net/ruibin_cao/article/details/80312799
Display an image
将图片加载到内存后,在程序运行过程中经常需要调试,图片无法想其他的程序打印debug信息,但是在调试过程中经常需要查看算法的效果,把图片显示出来,这就需要用到图片的显示功能,opencv中图片显示使用cv.imshow()可以直接把图片显示到屏幕上,其API接口为:
None = cv.imshow( winname, mat )
参数
winname:必选项,为显示图片的windows窗口的title
mat:为使用imread读取到的图片到mat数据结构中
一般在使用cv.imshow之后,需要使用cv.waitKey()其参数为毫秒,在多少毫秒之内等待敲入一个键盘,超时或者在时间之内按下一个键盘,程序将继续往前走,经常用到cv.imshow之后,用于观察图片算法之后的效果,waitkey(0)表示为无限等待,只有敲入一个键盘之后才能往下走, waitKey返回的值就是所敲入键盘的ascii的值。
注意在处理完之后需要使用cv.destroyAllWindows将创建的窗口销毁。
示范用例:
cv.imshow('lenna',img)
cv.waitKey(0)
cv.destroyAllWindows()
其C++接口类似:
void cv::imshow (const String & winname,InputArray mat )
Write an image
保存图片是图像处理中经常用到的,其API原型为:
retval = cv.imwrite( filename, img[, params] )
filename:为要保存的文件名(可以带路径)
img:图片数据
其C++接口为:
bool cv::imwrite ( const String & filename,InputArray img,const std::vector & params = std::vector() )
- JPEG格式的图片, param参数表示为从0到100的图片质量,默认为95
- 对于PNG格式的图片,这个参数表示为压缩级别从0到9。较高的值意味着更小的尺寸和更长的压缩时间,默认值是3
- 对于PPM,PGM或PBM格式图片,这个参数表示一个二进制格式标志,取值为0或1,默认值是1.
一个完整的读取,显示,保存图片用例:
import numpy as np
import cv2 as cvimg = cv.imread(".././datasheet/len_top.jpg",cv.IMREAD_COLOR )
cv.imshow('lenna',img)
cv.waitKey(0)
cv.destroyAllWindows()
cv.imwrite('save.png',img)
读取到的图片:
![](https://img.php1.cn/3cd4a/1eebe/cd5/bff2716168d1ed7b.webp?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly96aGlrdW5odW8uYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70)