opencv学习(一)——图像入门
图像入门
一、读取图像
在opencv中使用cv.imread(filename, flags)函数读取图像。filename参数表示读取图像的路径。读取图像的路径应完整给出,且不能含有中文,否则在调用cv.show()函数显示图片时会显示以下错误:
第二个参数是一个flag,表示读取图像的方式,分别是:
cv.IMREAD_COLOR: 加载彩色图像。任何图像的透明度都会被忽视。它是默认标志cv.IMREAD_GRAYSCALE:以灰度模式加载图像cv.IMREAD_UNCHANGED:加载图像,包括alpha通道

除了这三种读取方式,还可以分别用1、0或1表示以上三种方式
我们运行以下代码,通过这三种模式,来看一下实际效果:
import cv2
import numpy as np
img1 = cv2.imread('../../../datasets/image/cat.jpg', 1)#加载彩色图像
img2 = cv2.imread('../../../datasets/image/cat.jpg', 0)#加载灰度图像
img3 = cv2.imread('../../../datasets/image/cat.jpg', -1)#加载图像,包括alpha通道
def cv_show(name, img):
cv2.imshow(name, img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv_show('img1_3', np.hstack((img1, img3)))
cv_show('img2', img2)

注意看中间和最右侧的图片并没什么肉眼可见的差异,但实际上以cv.IMREAD_UNCHANGED方式读取图像会包含alpha通道,即加载一张图片的透明和半透明度。
二、显示图像
使用函数cv.imshow(winname, mat)在窗口中显示图像。窗口自动适合图像尺寸。
第一个参数是窗口名称,它是一个字符串。第二个参数是我们的对象。你可以根据需要创建任意多个窗口,可以使用不同的窗口名称。
代码如下:
img = cv2.imread('../../../datasets/image/cat.jpg')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv.waitKey(delay)是一个键盘绑定函数。其参数是以毫秒为单位的时间。该函数等待任何键盘事件指定的毫秒。如果您在这段时间内按下任何键,程序将继续运行。如果delay=0,它将无限期地等待一次敲击键。它也可以设置为检测特定的按键,例如,如果按下键 a 等,我们将在下面讨论。
除了键盘绑定事件外,此功能还处理许多其他GUI事件,因此你必须使用它来实际显示图像
cv.destroyAllWindows()只会破坏我们创建的所有窗口。如果要销毁任何特定的窗口,请使用函数cv.destroyWindow(winname)在其中传递确切的窗口名称作为参数。
在特殊情况下,你可以创建一个空窗口,然后再将图像加载到该窗口。在这种情况下,你可以指定窗口是否可调整大小。这是通过功能
cv.namedWindow(winname, flags)完成的。默认情况下,该标志为cv.WINDOW_AUTOSIZE。但是,如果将标志指定为cv.WINDOW_NORMAL,则可以调整窗口大小。当图像尺寸过大以及向窗口添加跟踪栏时,这将很有帮助。
img = cv2.imread('../../../datasets/image/cat.jpg')
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

三、保存图像
保存图像,用这个函数cv.imwrite(filename, img)。
第一个参数是文件名,第二个参数是你要保存的图像。
cv2.imwrite('../../../datasets/image/cat_gray.jpg', img2)
如果图像保存成功,会返回一下结果:

来让图像显示一下:
img = cv2.imread('../../../datasets/image/cat_gray.jpg')
cv_show('img', img)

四、总结
在下面的程序中,以灰度加载图像,显示图像,按 s 保存图像并退出,或者按 ESC 键直接退出而不保存。
img = cv2.imread('../../../datasets/image/cat.jpg', 0)
cv2.imshow('img', img)
k = cv2.waitKey(0)
if k == 27: #等待ESC退出
cv2.destroyAllWindows()
elif k == ord('s'): #等待关键字‘s’,保存并退出
cv2.imwrite('../../../datasets/image/cat.png', img)
cv2.destroyAllWindows()
如果你使用的是 64 位机器,你需要修改
k = cv.waitKey(0)像这样:k = cv.waitKey(0) & 0xFF
五、彩色图像、灰度图像、二值图像图像和伪彩色图像的区别
- 彩色图像:RGB图像,有255 x 255 x 255种颜色。

- 灰度图像:有不同深度的灰色和黑白两色。三个通道的数值一样。

- 二值图像:非黑即白,即只有黑色和白色,表现在像素上就是只有0和255。

- 伪彩色图像:伪彩色图像的每个像素值实际上是一个索引值或代码,该代码值作为色彩查找表中某一项的入口地址,根据该地址可查找出包含实际R、G、B的强度值。这种用查找映射的方法产生的色彩称为伪彩色,生成的图像为伪彩色图像。

- 色彩丰富程度:彩色图像>伪彩色图像>灰度图像>二值图像
opencv学习(一)——图像入门的更多相关文章
- opencv学习笔记-图像叠加、混合
在图像处理中,目标区域定义为感兴趣区域ROI(region of Interest),这是后期图像处理的基础,在获取ROI后,进行一些列的处理.ROI区域在Opencv中就是Rect,先构建Rect, ...
- opencv学习笔记-图像对比度、亮度调节
在数学中我们学过线性理论,在图像亮度和对比度调节中同样适用,看下面这个公式: 在图像像素中其中: 参数f(x)表示源图像像素. 参数g(x) 表示输出图像像素. 参数a(需要满足a>0)被称为增 ...
- Python下的OpenCV学习 02 —— 图像的读取与保存
OpenCV提供了众多对图片操作的函数,其中最基本的就是图片的读取与输出了. 一.读取图片 利用OpenCV读取一张图片是非常容易的,只需要用到 imread() 函数,打开shell或者cmd,进入 ...
- opencv学习笔记——图像缩放函数resize
opencv提供了一种图像缩放函数 功能:实现对输入图像缩放到指定大小 函数原型: void cv::resize ( InputArray src, OutputArray dst, Size ds ...
- OpenCV学习(11) 图像的腐蚀与膨胀(2)
先对一副灰度图像进行腐蚀操作,然后在腐蚀后的图像上再进行膨胀操作,我们定义这个操作为开操作. 先对一副图像进行膨胀操作,然后在膨胀后的图像上再进行腐蚀操作,我们定义这个操作为闭操作. 开操 ...
- OpenCV学习(10) 图像的腐蚀与膨胀(1)
建议大家看看网络视频教程:http://www.opencvchina.com/thread-886-1-1.html 腐蚀与膨胀都是针对灰度图的形态学操作,比如下面的一副16*16的灰度图. ...
- opencv学习(六)——图像基本操作
图像基本操作 一.访问和修改像素值 先来理解一下,图像与一般的矩阵或张量有何不同(不考虑图像的格式,元数据等信息).首先,一张图像有自己的属性,宽,高,通道数.其中宽和高是我们肉眼可见的属性,而通道数 ...
- OpenCV学习笔记——图像的腐蚀与膨胀
顺便又复习了一下cvcopy如何进行图像拼接(最近觉得打开多幅图像分别看不如缩小掉放拼接到一幅图像上对比来的好) 首先把拼接的目标图像设置兴趣区域ROI,比如我有一个total,要把a.b.c分别从左 ...
- OpenCV学习(12) 图像的腐蚀与膨胀(3)
通过使用不同的结构元素来进行膨胀腐蚀操作,可以检测图像中的角点,下面就一步一步看这个算法如果实现角点检测. 原图像: 首先我们创建四个结构元素 先用十字结构元素对原图像进行膨胀操作,得到下面的图像 再 ...
随机推荐
- Vue开发多人聊天室 复盘总结
前言 在上个月初,接到一个需求,要开发一个 聊天通讯 模块 并且 集成到 项目中的多个 入口,实现业务数据的记录追踪. 接到需求后,还挺开心,这是我第一次 搞 通讯 类的需求,之前一直是 B 端 的业 ...
- js设计模式之发布订阅模式
1. 定义 发布-订阅模式其实是一种对象间一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都将得到状态改变的通知. 订阅者(Subscriber)把自己想订阅的事件注册(Subscri ...
- switchery插件:多个按钮,用jquery进行切换
单个按钮可以参照这个链接https://blog.csdn.net/u012233776/article/details/53305846 多个按钮时, html中其中想操作这个按钮开启与关闭 < ...
- Docker DevOps实战:Docker+Jenkins+Python+Pytest+Allure(1)- 创建Jenkins容器、安装Python环境、安装项目依赖类库、安装Allure报告插件
前言: 本文实操笔记参照菠萝笔记,安装过程中的坑大家可以参考下 创建Jenkins容器 # 下载Jenkins镜像 [root@localhost ~]# docker pull jenkins/je ...
- Docker系列(28)- 自定义网络
自定义网络 网络模式 bridge:桥接docker(默认,自己创建也可以使用bridge模式) none:不配置网络 host:和宿主机共享网络 container:容器网络联通!(用的少!局限性大 ...
- 有哪些浏览器还支持flash?
Flash是大名鼎鼎的全家桶公司Adobe设计的一款网页动画软件,早期的动态网页基本都是基于Flash开发的.但是后来不断爆出关于Flash的安全漏洞和运行效率问题,虽然Adobe公司一直在尝试解决, ...
- WireShark高级用法
报文注释 分组注释 尽量使用英文注释 时间显示 显示实际时间 抓包过滤器 按照规则抓取报文 显示过滤器 按照规则显示报文 自动生成过滤条件:做为过滤器应用 着色规则 默认 可自定义着色规则 追踪数据流 ...
- lua文件修改为二进制文件
注意:lua编译跟luajit编译的二进制文件是不兼容,不能运行的 如果是使用luajit,请直接使用luajit直接编译二进制 第一种:luajit编译(以openresty为例,跟luac是相反的 ...
- vue 改变路由参数
更改路由传递的参数: const query = JSON.parse(JSON.stringify(this.$route.query)) // 获取路由参数信息 query.id = Name / ...
- P2012-拯救世界2【EGF】
正题 题目链接:https://www.luogu.com.cn/problem/P2012 题目大意 \(12\)种东西排列成长度为\(n\)的序列,要求前四种出现奇数次,后四种出现偶数次,求方案. ...