Python-OpenCV教程-5

OpenCV版本要求在2.3.1以上

本文主要介绍OpenCV中颜色通道相关的操作,以及图像的旋转和平移操作等。

1.改变颜色通道

在OpenCV中,一共有超过150种改变颜色通道的方法,不过我们主要研究其中最重要的两个:BGR和Gray的转换和BGR和HSV的转换。

转换颜色通道时,我们使用cv2.cvtColor(input_img,flag)这个函数,其中flag主要决定了转换的类型。BGR到Gray的转换用的flag是cv2.COLOR_BGR2GRAY,BGR到HSV的转换用的flag是cv2.COLOR_BGR2HSV。在HSV图像中,H表示色调取值范围为0到179,S表示饱和度取值范围为0到255,V表示亮度取值范围为0到255。

举个应用的例子,我们可以用改变颜色通道的方法去追踪物体:相比BGR颜色通道,HSV可以更加容易得在一个范围内去表示一种颜色。所以,在追踪特定颜色的物体时,我们经常把BGR的颜色通道转换成HSV的通道,用摄像机捕捉一个蓝色瓶盖的过程如下:

一.得到摄像机的每一帧图像

二.把图像从BGR转换成HSV

三.在HSV中过滤掉蓝色以外的所有其他颜色

四.最后提取出蓝色的物体,然后就可以用各种方法去追踪这个蓝色的物体了。

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while(1):

    # Take each frame
    _, frame = cap.read()

    # Convert BGR to HSV
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    # define range of blue color in HSV
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])

    # Threshold the HSV image to get only blue colors
    mask = cv2.inRange(hsv, lower_green, upper_green)

    # Bitwise-AND mask and original image
    res = cv2.bitwise_and(frame,frame, mask= mask)

    cv2.imshow('frame',frame)
    cv2.imshow('mask',mask)
    cv2.imshow('res',res)
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break

cv2.destroyAllWindows()
http://docs.opencv.org/trunk/_images/frame.jpg
我们可以注意到,图像中有一些噪声,我们将会在以后的章节中除去这些噪声。这是物体追踪中最简单的方法,当我们学到轮廓检测等更有效的算法时,还可以在上面做更多有趣的事情。

最后还有一个问题,如何找到对应颜色的HSV范围?方法很简单,还是用cv2.cvtColor()这个函数:

>>> green = np.uint8([[[0,255,0 ]]])
>>> hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
>>> print hsv_green
[[[ 60 255 255]]]
获得了[60,255,255]这个值后,我们可以把[H-10,100,100,]和[H+10,255,255]作为绿色的范围。当然,你也可以用其他的图像处理软件去获得这个值比如GIMP等。

2.图像的几何操作

当我们要缩放图像时,要用到cv2.resize()这个函数,缩放的比例可以在函数的参数中调整。同时,因为缩放图像需要对像素点进行处理,所以我们需要为缩放选择一个合适的插值函数(就是告诉计算机放大的图像中那些多出来的像素点的取值是多少,缩小的图像中每个像素点的值该怎么取)。一般,缩小图像时会采用cv2.INTER_AREA,放大图像时可以采用cv2.INTER_CUBIC或者cv2.INTER_LINEAR,以下程序把原图放大了一倍:

import cv2
import numpy as np

img = cv2.imread('messi5.jpg')

res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)

#OR

height, width = img.shape[:2]
res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)

如果我们要平移一幅图像,首先要生成一个转移矩阵,告诉计算机如何去平移这个图像

M = \begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y  \end{bmatrix}

其中,(t_x,t_y)表示了向右和向下平移的坐标量。

而且,这个转移矩阵要求是一个Numpy数组,数据类型是float32,最后把这个数组传递给cv2.warpAffine()函数,实现平移。


import cv2
import numpy as np

img = cv2.imread('messi5.jpg',0)
rows,cols = img.shape

M = np.float32([[1,0,100],[0,1,50]])
dst = cv2.warpAffine(img,M,(cols,rows))

cv2.imshow('img',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
需要注意的是cv2.warpAffine()函数的第三个参数表示输出图像的尺寸。
Translation

如果我们要旋转一幅图像,就需要为OpenCV构建一个关于旋转的转移矩阵:这个矩阵要说明旋转的角度,旋转的中心点和缩放比例

\begin{bmatrix} \alpha &  \beta & (1- \alpha )  \cdot center.x -  \beta \cdot center.y \\ - \beta &  \alpha &  \beta \cdot center.x + (1- \alpha )  \cdot center.y \end{bmatrix}

\begin{array}{l} \alpha =  scale \cdot \cos \theta , \\ \beta =  scale \cdot \sin \theta \end{array}

为了构建这样的转移矩阵,OpenCV提供了一个c2.getRotationMatrix2D()这个函数,只要在这个函数中输入旋转中心点的坐标,旋转角度和缩放大小,函数就能返回一个转移矩阵:

img = cv2.imread('messi5.jpg',0)
rows,cols = img.shape

M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
dst = cv2.warpAffine(img,M,(cols,rows))
Rotation of Image

在仿射变换中,要求所有在原图想中平行的直线在输出图像中也是平行的。因此,我们需要输入三个点在原图中的坐标和变换后的坐标,来形成仿射变换的转移矩阵。把这六个坐标输入到cv2.getAffineTransform()中,就能产生这个转移矩阵:


img = cv2.imread('drawing.png')
rows,cols,ch = img.shape

pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])

M = cv2.getAffineTransform(pts1,pts2)

dst = cv2.warpAffine(img,M,(cols,rows))

plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()
图中绿点就是我们选取的三个点
Affine Transformation

在透视变换中,我们需要构造一个3*3的转移矩阵。为了构造这个矩阵,我们需要输入4个点的变换前后的坐标,并且要求其中的任意三个点不能共线。把这八个坐标先后输入cv2.getPerpectiveTransform()中,就能得到转移矩阵了。

img = cv2.imread('sudokusmall.png')
rows,cols,ch = img.shape

pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])

M = cv2.getPerspectiveTransform(pts1,pts2)

dst = cv2.warpPerspective(img,M,(300,300))

plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()
Perspective Transformation

翻译自http://docs.opencv.org/trunk/doc/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html#converting-colorspaces和http://docs.opencv.org/trunk/doc/py_tutorials/py_imgproc/py_geometric_transformations/py_geometric_transformations.html#geometric-transformations

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值