图像处理的最基本工作,也是第一步工作:读取、显示和输出图片。

1.图像读取

opencv图像读取的函数是:imread(图像路径,加载模式);输入参数有2个:

  1. “图像路径”是一个字符串;使用绝对路径和相对路径都是可以的,但相对路径必须是程序的工作路径。一般的图像格式都是支持的,如bmp,jpg,png,tiff等。
  2. “读取模式”是一个枚举型的整数,用于指定读取图像的颜色类型。缺省值是1,一般在调用时我们可以不输入这个参数,默认值1表示载入三通道的彩色图像。有如下取值:
    • IMREAD_UNCHANGED:取值:-1。不改变原始图像的读取模式。
    • IMREAD_GRAYSCALE:取值:0。将图像转换成灰度图读取。
    • IMREAD_COLOR:取值:1。为默认缺省值,将图像转换成3通道彩色图像读取。
    • IMREAD_ANYDEPTH:取值:2。读取后是灰度图。这个没搞明白是什么意思。知道的朋友不妨留言指教,不甚感激。
    • IMREAD_ANYCOLOR:取值:4。无损读取原始图像。源图像为彩色图像就读取为3通道彩色图像,源图像为灰度图就读取为灰度图。

为更一步准确掌握这些参数的区别,用3幅图像测试下,这三幅图像分别为:”scooter.png” :带alpha通道的彩色图像; “lenna.bmp”:3通道彩色图像; “moon.bmp”:灰度图像。如下图所示:

import cv2scooter_path = "scooter.png"  # 带alpha通道的彩色图像
lenna_path = "lenna.bmp"  # 3通道彩色图像
moon_path = "moon.bmp"  # 灰度图像pic = [scooter_path, lenna_path, moon_path]for p in pic:for i in [-1, 0, 1, 2, 4]: # 加载模式的取值img = cv2.imread(p, i)print(p, i, img.shape)

输出结果:

scooter.png -1 (512, 512, 4)
scooter.png 0 (512, 512)
scooter.png 1 (512, 512, 3)
scooter.png 2 (512, 512)
scooter.png 4 (512, 512, 3)
lenna.bmp -1 (512, 512, 3)
lenna.bmp 0 (512, 512)
lenna.bmp 1 (512, 512, 3)
lenna.bmp 2 (512, 512)
lenna.bmp 4 (512, 512, 3)
moon.bmp -1 (640, 662)
moon.bmp 0 (640, 662)
moon.bmp 1 (640, 662, 3)
moon.bmp 2 (640, 662)
moon.bmp 4 (640, 662)

我们可以从读入图像后的shape中看出一些端倪。

  • 当取值为-1时,即读取模式为IMREAD_UNCHANGED时,源图像是什么样就是什么样。
  • 当取值为0时,即读取模式为IMREAD_GRAYSCALE时,都读取成灰度图像。
  • 当取值为1时,即读取模式为IMREAD_COLOR时,不管源图像是什么,都转换成3通道图像。
  • 当取值为2时,即读取模式为IMREAD_ANYDEPTH时,都读取成了灰度图,没搞明白与上面的IMREAD_GRAYSCALE有什么区别。
  • 当取值为4时,即读取模式为IMREAD_ANYCOLOR时,源图像为彩色图像就读取为3通道彩色图像,源图像为灰度图就读取为灰度图。

一般来说,将图像读取成统一的模式对于后续的处理非常重要,一般都使用3通道的彩色图像进行处理,所以默认值是1,即不管源图像是什么,统一转成3通道的图像。对于灰度图,也是3通道,只不过每个通道的值都相等。

如果需要特殊处理,例如只处理灰度图,或需要alpha通道,那么就可以灵活使用其它的读取模式。

2.图像显示

import cv2
lenna_path = "lenna.bmp"
img = cv2.imread(lenna_path)
cv2.imshow('lenna', img)
cv2.waitKey()

opencv中的图像显示函数是imshow(title,img),title是显示图片的窗口标题,img就是要显示的图像。如果不添最后一句cv2.waitKey(),执行时窗口是一闪而过。waitKey()表示无限等待。中间可以输入数值,如5000,cv2.waitKey(5000),表示5000毫秒即5秒后自动关闭窗口。

lenna_path = "lnnea.bmp"
img = cv2.imread(lenna_path)
cv2.imshow('lenna', img)
cv2.waitKey()

输出:

error: (-215) size.width>0 && size.height>0 in function cv::imshow

从报错信息可以推断,是图像的size有问题,即没有得到图像的size。换句话说就是没有读取到源图像。仔细检查发现是文件名弄错了。

这里需要注意,调用imread(),就算图像的路径是错的,或者没有这张图片, 也不会报错,但得到的是None。接着往下使用imshow()显示的话就会报错。
所以下次看到这个size的报错信息,一定是图片路径或图片名称错了。

opencv对多个图片输出在同一个窗口并没有直接的支持手段,但有时候我们会有这个需求,这时使用matplotlib搭配使用比较合适,这个以后再说。

3.图像输出

lenna_path = "Input\\lenna.bmp"
img = cv2.imread(lenna_path)
cv2.imwrite('Output\\lenna.jpg', img)

opencv中的图像输出函数是imwrite(path, img);path是输出图片的路径和名称,格式转换在这里只需要换个后缀名即可。img就是要保存的图像。

需要注意的是,如果输出时,指定的输出目录不存在,例如不存在Output目录,imwrite()不会报错,但也不会自动创建目录然后输出。这样做的结果是什么也没有发生。

数字图像的加载、显示和输出相关推荐

  1. thinkphp+ajax无刷新分页并加载显示图片

    2019独角兽企业重金招聘Python工程师标准>>> 最近自己用thinkphp和bootstrap做一个小站点,在用到ajax与后台数据库交互实现无刷新分页时,因为我需要返回的数 ...

  2. OpenCV:01图片视频的加载显示

    文章目录 **学习目标:** 图像与视频的加载显示 导入OpenCV的包`cv2` 窗口操作 计算按键的`ASCII`值 读取图片 用其他插件来读取(以`matplotlib`为例) 用`OpenCV ...

  3. three.js 加载显示文字

    three.js 加载显示文字 代码放到 ./three.js/examples/ 下 <!DOCTYPE html> <html lang="en">&l ...

  4. Android 四大组件之——Acitivity(四) Activity是如何加载显示内容的?

    1. 在Activity调用onCreate()等生命周期之前,Activity会调用attach()方法,而在attach()方法中会调用如下代码 onAttach() {PolicyManager ...

  5. Ionic+Angular+Express实现前后端交互使用HttpClient发送get请求数据并加载显示(附代码下载)

    场景 Ionic介绍以及搭建环境.新建和运行项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/106308166 在上面搭建起 ...

  6. opengl加载显示3D模型UC类型文件

    opengl加载显示3D模型UC类型文件 前置条件 注意事项 项目展示 项目完整C++源代码 前置条件 opengl三方库freeglut,显示uc格式的三维模型文件, 注意事项 源代码 model_ ...

  7. opengl加载显示3D模型3d类型文件

    opengl加载显示3d模型UC类型文件 前置条件 注意事项 项目展示 项目完整C++源代码 前置条件 opengl三方库freeglut,显示3d格式的三维模型文件, 注意事项 源代码 model_ ...

  8. opengl加载显示3DS模型3DS类型文件

    opengl加载显示3DS模型UC类型文件 前置条件 注意事项 项目展示 项目完整C++源代码 前置条件 opengl三方库freeglut,显示3DS格式的三维模型文件 注意事项 源代码 model ...

  9. opengl加载显示3D模型3MF类型文件

    opengl加载显示3D模型3MF类型文件 前置条件 注意事项 项目展示 项目完整C++源代码 前置条件 opengl三方库freeglut,显示3MF格式的三维模型文件 注意事项 源代码 model ...

  10. opengl加载显示3D模型AC类型文件

    opengl加载显示3D模型AC类型文件 前置条件 注意事项 项目展示 项目完整C++源代码 前置条件 opengl三方库freeglut,显示AC格式的三维模型文件 注意事项 源代码 model_f ...

最新文章

  1. Nginx从基本原理到开发实践
  2. ie浏览器修复工具_电脑故障修复不求人!50个小工具可帮你一键修复
  3. linux系统负载检查方法
  4. postgres外部表
  5. shiro的简单使用
  6. cinder与ceph的区别_分布式存储基础、Ceph、cinder及华为软件定义的存储方案 -
  7. supervisor python_使用supervisor运行python脚本
  8. 怎么在服务器上注册vbs组件,Windows下查看PC服务器硬件序列号的vbs脚本
  9. Flume 1.7 源码分析(五)从Channel获取数据写入Sink
  10. 用9种办法解决 JS 闭包经典面试题之 for 循环取 i
  11. “最强”博士论文答辩阵容:6位院士,副院长任答辩秘书!
  12. 20135234mqy-——信息安全系统设计基础第七周学习总结
  13. Linux系统如何把一个文件传递到另一个机器上
  14. mysql安装教程8.0
  15. android手写计算器,MyScript Calculator(高级手写计算器) V1.2.2.479 安卓版
  16. Bootstrap学习心得
  17. go 语言环境安装 WIMDOWS + LINUX 系统
  18. 服务器C盘内存不足,发现C盘TEMP文件夹占用44G
  19. 【人工智能】【1024】谷歌量子计算突破登Nature封面,号称200秒顶超算10000年!
  20. randn函数 python_Python numpy matrix randn()用法及代码示例

热门文章

  1. 【Mybatis 之应用篇】 3_Lombok、多对一处理和一对多处理
  2. 别再用 httpClient了,快试试这款优雅的 HTTP 客户端工具!
  3. 用Java实现天天酷跑(附源码),只能用牛逼来形容了!
  4. Java 中这些常用关键字,总有那么些被你遗忘的
  5. WebSocket 实现 Web 端即时通信
  6. nod32用户名和密码每天更新_忘记登录密码没有U盘怎么办?无U盘重置密码Win7篇
  7. LeetCode 08字符串转整数09回文数
  8. 阿里云MySQL远程登录异常
  9. 类与面向对象的精华:继承【C++继承】
  10. 解析java中的数组