OpenCV与Python基础实例集:图像变换

整理一下以前学习 OpenCV 时的一些基础实例。基于 OpenCV 3 (截至目前,最新的是4)和 Python。安装 OpenCV 的过程就省略了,毕竟网络已经有太多太多了。

安装完 OpenCV 后,在 Python 的 REPL 环境中可以加载出 cv2 模块,就算安装成功了。

>>> import cv2

读取、显示、保存图片

这大概就是 OpenCV 的 Hello World了:

import cv2

img = cv2.imread('./images/cat.jpg')
cv2.imshow('Input image', img)
cv2.waitKey()

读取图片

OpenCV 使用 NumPy 来存储图片。换句话说,要在 Python 中使用 OpenCV,需要先安装 NumPy 作为依赖。

>>> import cv2
>>> img = cv2.imread('./images/cat.jpg')
>>> type(img)
<class 'numpy.ndarray'>

cv2.waitKey() 用来绑定键盘,它接受一个表示毫秒的参数。基本上,这个函数被用来等待一个键盘事件。在这里就是用来等待键盘输入任意字符,然后就退出。如果没有传递参数或者传递了 0 作为参数,它会一直等待,直到键盘输入。

OpenCV 提供了很多加载图片的模式,比如计算机视觉中最常用的灰度图片:

import cv2

gray_img = cv2.imread('./images/cat.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('Grayscale', gray_img)
cv2.waitKey()

灰度图
当然,还有很多的读取模式。

改变图片格式

比如,把 .jpg 的图片转换成 .png 格式的(不是把文件后缀名改了这么简单的):

import cv2

img = cv2.imread('./images/cat.jpg')
cv2.imwrite('./images/output_cat.png', img, [cv2.IMWRITE_PNG_COMPRESSION])

显然,可以通过 ImwriteFlag 的参数改变图片的格式或者图片的质量等等。

图像的色彩空间

色彩空间实际就是颜色模型和映射函数这两个的组合。有很多不同的色彩空间,最著名的就是 RGB,除此之外,像 YUV、HSV、Lab 等等也是很有名的。

  • RGB颜色空间:基于颜色的加法混色原理,从黑色不断叠加 Red,Green,Blue 的颜色,最终可以得到白色光。在计算机中编程RGB每一个分量值都用8位(bit)表示,可以产生 256 × 256 × 256 = 16777216 256\times256\times256=16777216 256×256×256=16777216 种颜色,这就是经常所说的“24位真彩色”。
  • HSV颜色空间:根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。RGB 是面向硬件的,而HSV(Hue Saturation Value)颜色模型是面向用户的。这个模型中颜色的参数分别是:色调(H:hue),饱和度(S:saturation),亮度(V:value)。这是根据人观察色彩的生理特征而提出的颜色模型(人的视觉系统对亮度的敏感度要强于色彩值,这也是为什么计算机视觉中通常使用灰度即亮度图像来处理的原因之一)。
  • YUV色彩空间:在现代彩色电视系统中,通常采用三管彩色摄像机或彩色 CCD(电耦合器件)摄像机,它把得到的彩色图像信号,经分色、分别放大校正得到RGB,再经过矩阵变换电路得到亮度信号 Y 和两个色差信号 R-Y、B-Y,最后发送端将亮度和色差三个信号分别进行编码,用同一信道发送出去。这就是我们常用的YUV颜色空间。采用YUV颜色空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V分量,那么这样表示的图就是黑白灰度图。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色信号。

色彩空间转换

考虑所有的颜色,OpenCV 大概提供了 190 种转换选项,可以在任意两种色彩空间中进行转换。如果你想要看所有的转换类型,可以在 Python 的 REPL 中输入下面的代码:

>>> import cv2
>>> print([x for x in dir(cv2) if x.startswith('COLOR_')])

比如,把彩色图片转换成灰度图:

import cv2

img = cv2.imread('./images/cat.jpg', cv2.IMREAD_COLOR)
gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
cv2.imshow('Grayscale', gray_img)
cv2.waitKey()

效果和上面那张灰度图是一样的,就不再截图了。

当然,也可以将图片转换成 YUV:

yuv_img = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)

图片现在看起来是这样的:
YUV图像
看起来,好像图片有点反人类。这样说,也没错。但我们可以把它的通道分开:

# 第一种写法
y, u, v = cv2.split(yuv_img)
cv2.imshow('Y channel', y)
cv2.imshow('U channel', u)
cv2.imshow('V channel', v)

当然,利用 NumPy 切片语法,还有第二种写法,而且一般而言,更加快速。

cv2.imshow('Y channel', yuv_img[:,:,0])
cv2.imshow('U channel', yuv_img[:,:,1])
cv2.imshow('V channel', yuv_img[:,:,2])

前面已经介绍了 YUV,假如只有 Y 通道,它就是一张灰度图:
Y通道

U 通道是这样的:
U 通道
V 通道是这样的:
V 通道

合并图像通道

尝试一下将图片划分到不同的通道,再通过不同的组合合并通道。

import cv2

img = cv2.imread('./images/cat.jpg', cv2.IMREAD_COLOR)
g, b, r = cv2.split(img)
rbg_img = cv2.merge((r,b,g))
rbr_img = cv2.merge((r,b,r))
cv2.imshow('Original', img)
cv2.imshow('RBG', rbg_img)
cv2.imshow('RBR', rbr_img)

cv2.waitKey()

原始照片就不贴上了,RBG 是这样的:
RBG

RBR 是这样的:
RBR

嗯,都充满一股神秘的色彩。

图像平移

接下来,看一看怎么在参考系中平移图像。

import cv2
import numpy as np

img 
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值