OpenCV中的图像处理 —— 改变颜色空间+图像几何变换

这一部分主要介绍OpenCV图像处理中的改变颜色空间和图像的几何变换,颜色空间的改变应用非常广泛,在处理图像的实际问题中,经常需要要图像变换为单通道灰度图像等形式操作,在文中会有一个追踪颜色的小实例便于理解,图像的几何变换是老生常谈的东西了,但是在图像处理中有一些新的概念,例如仿射变换和透视变换,废话不多说直接开干!

目录

  • OpenCV中的图像处理 —— 改变颜色空间+图像几何变换
  • 1. 改变颜色空间
    • 1.1 改变颜色空间
    • 1.2 颜色对象追踪
  • 2. 图像几何变换
    • 2.1 缩放
    • 2.2 平移
    • 2.3 旋转
    • 2.4 仿射变换
    • 2.5 透视变换

1. 改变颜色空间

关于颜色空间的改变我们要掌握两个重要的功能函数:cv.cvtColorcv.inRange

1.1 改变颜色空间

OpenCV中有超150中颜色空间转换方法,但是我们只掌握应用最广泛的两种即可:

BGR <-> 灰度 和 BGR <-> HSV

颜色转换的函数cv.cvtColor()非常简单,往其中传入两个参数即可吗,第一个参数是我们的图像对象,第二个参数代表我们要转换称为的类型标志

对于BGR→灰度转换,我们使用标志cv.COLOR_BGR2GRAY。类似地,对于BGR→HSV,我们使用标志cv.COLOR_BGR2HSV

要获取其他标志只需要在python终端把库中的标志名全部输出即可查看

>>> import cv2 as cv
>>> flags = [i for i in dir(cv) if i.startswith('COLOR_')]
>>> print( flags )

1.2 颜色对象追踪

我们通过一个实例来展示颜色对象追踪,其本质上就是在显示的视频中只显示我们要求的颜色,以达到追踪颜色的效果

在HSV中比在BGR中更容易显示颜色

代码实现

import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)
while(1):# 读取帧_, frame = cap.read()# 转换颜色空间 BGR 到 HSVhsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)# 定义HSV中蓝色的范围lower_blue = np.array([110,50,50])upper_blue = np.array([130,255,255])# 设置HSV的阈值使得只取蓝色mask = cv.inRange(hsv, lower_blue, upper_blue)# 将掩膜和图像逐像素相加res = cv.bitwise_and(frame,frame, mask= mask)cv.imshow('frame',frame)cv.imshow('mask',mask)cv.imshow('res',res)k = cv.waitKey(5) & 0xFFif k == 27:break
cv.destroyAllWindows()

首先我们创建了一个VideoCapture对象用来捕获视频,再通过while来逐帧读取视频,在读取视频的过程中因为我们要单独筛出蓝色,所以还需要一些列操作

HSV比BGR更容易显示颜色,为了显示效果能够更好所有我们选择使用HSV的图像,这个过程用cv.cvtColor()将BGR转换为HSV,在代码中有一个很重要的函数cv.inRange()函数,这个函数就用来筛选处于给定像素区间的图像,其中有三个参数,第一个便是当前“帧”,第二第三个参数就是给定的像素区间了

这里还有一个很重要的函数cv.bitwise_and(),这个函数主要有两个用途:

  • 提取掩膜选定的区域:cv.bitwise_and(img1,img2,mask = mask)

首先我们要知道我们是掩膜mask,我们在处理一些图像时,需要选定我们要处理的部分,我们怎么确定这一块儿部分呢?那就是用一块儿掩膜mask来遮住这一块儿区域

  • 求两种图片的交集:cv.bitwise_and(img1,img2)

这个用法就很简单了,传入的两个参数就是两个图像对象,返回的结果就是这两个图像的交集

2. 图像几何变换

对于OpenCV的图像几何变换,其提供了两个转换函数:cv.warpAffine()和cv.warpPerspective()

cv.warpAffine采用2x3转换矩阵,而cv.warpPerspective采用3x3转换矩阵作为输入

2.1 缩放

图像的缩放我们可以通过cv.resize()没错就是重置图像的大小,这里有两个插值方式值得注意,一个是cv.INTER_AREA用于缩小,另一个是cv.INTER_CUBIC用于缩放

import numpy as np
import cv2 as cv
img = cv.imread('messi5.jpg')
res = cv.resize(img,None,fx=2, fy=2, interpolation = cv.INTER_CUBIC)
#或者
height, width = img.shape[:2]
res = cv.resize(img,(2*width, 2*height), interpolation = cv.INTER_CUBIC)

2.2 平移

图像的平移我们通过创建转换矩阵M来完成,并且需要使用函数cv.wrapAffine()

我们把转换矩阵放入np.float32类型的Numpy数组中,并将其传递给cv.wrapAffine()函数

import numpy as np
import cv2 as cv
img = cv.imread('messi5.jpg',0)
rows,cols = img.shape
M = np.float32([[1,0,100],[0,1,50]])
dst = cv.warpAffine(img,M,(cols,rows))
cv.imshow('img',dst)
cv.waitKey(0)
cv.destroyAllWindows()

cv.wrapAffine()函数的参数:第一个为显示的图像,第二个是转换矩阵,第三个是图像的尺寸

2.3 旋转

图像的旋转同样需要一个转换矩阵,这个转换矩阵我们通过**cv.getRotationMatrix2D()**这个函数来得到,其中需要传递三个参数,第一个参数是旋转位置的坐标,它通过一个二元组来传递,第二个参数是旋转角度吗,第三个参数是用来做调整的参数,如果传入1,则按照正常的逆时针旋转,如果传入0则不会显示图片,如果传入-1会显示顺时针旋转的结果

import numpy as np
import cv2 as cv# cols-1 和 rows-1 是坐标限制
img = cv.imread(r'E:\image\wqw.png', 0)
rows, cols = img.shape
M = cv.getRotationMatrix2D(((cols - 1) / 2.0, (rows - 1) / 2.0), 90, 1)
dst = cv.warpAffine(img, M, (cols, rows))
cv.imshow('img', dst)
cv.waitKey(0)
cv.destroyAllWindows()

2.4 仿射变换

还记得我们在上面说的另一个函数cv.getAffineTransform吗?现在我们要开始使用它了

在仿射变换中,原始图像中的所有平行线在输出图像中仍将平行,为了找到变换矩阵,我们需要输入图像中的三个点的位置,然后使用cv.getAffineTransform()函数创建一个2*3的矩阵,再将其传入cv.wrapAffine()完成仿射变换

img = cv.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 = cv.getAffineTransform(pts1,pts2)
dst = cv.warpAffine(img,M,(cols,rows))
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')

2.5 透视变换

对于透视变换,需要3x3变换矩阵,即使在转换后,直线也将保持直线,要找到此变换矩阵,需要在输入图像上有4个点(在这四个点中,其中三个不应共线)

可以通过函数cv.getPerspectiveTransform找到变换矩阵。然后将cv.warpPerspective应用于此3x3转换矩阵

img = cv.imread('sudoku.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 = cv.getPerspectiveTransform(pts1,pts2)
dst = cv.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()


(注:文章内容参考OpenCV4.1中文官方文档)
如果文章对您有所帮助,记得一键三连支持一下哦

OpenCV中的图像处理 —— 改变颜色空间+图像几何变换相关推荐

  1. OpenCV 中的图像处理 004_平滑图像

    本文主要内容来自于 OpenCV-Python 教程 的 OpenCV 中的图像处理 部分,这部分的全部主要内容如下: 改变色彩空间 学习在不同色彩空间之间改变图像.另外学习跟踪视频中的彩色对象. 图 ...

  2. python识别图像中绿色的部分_[OpenCV-Python] OpenCV 中的图像处理 部分 IV (四)

    部分 IV OpenCV 中的图像处理 21 OpenCV 中的轮廓 21.1 初识轮廓 目标 • 理解什么是轮廓 • 学习找轮廓,绘制轮廓等 • 函数:cv2.findContours(),cv2. ...

  3. OpenCV中的图像处理 —— 图像阈值+图像平滑+形态转换

    OpenCV中的图像处理 -- 图像阈值+图像平滑+形态转换 目录 OpenCV中的图像处理 -- 图像阈值+图像平滑+形态转换 1. 图像阈值 1.1 简单阈值 1.2 自适应阈值 1.3 Otsu ...

  4. OpenCV中的图像处理 —— 图像梯度+Canny边缘检测+图像金字塔

    OpenCV中的图像处理 -- 图像梯度+Canny边缘检测+图像金字塔 目录 OpenCV中的图像处理 -- 图像梯度+Canny边缘检测+图像金字塔 1. 图像梯度 1.1 Sobel和Schar ...

  5. 第四章:OpenCV中的图像处理

    第四章:OpenCV中的图像处理 本章节你将学习图像的改变色彩空间.提取对象.图像的几何变换.图像的阈值.平滑图像等OpenCV图像处理的基本内容. 更多内容请关注我的GitHub库:TonyStar ...

  6. python去除图片复杂背景_[OpenCV-Python] OpenCV 中的图像处理 部分 IV (五)

    部分 IV OpenCV 中的图像处理 22 直方图 22.1 直方图的计算,绘制与分析 目标 • 使用 OpenCV 或 Numpy 函数计算直方图 • 使用 Opencv 或者 Matplotli ...

  7. OpenCV中的图像处理 —— 傅里叶变换+模板匹配

    OpenCV中的图像处理 -- 傅里叶变换+模板匹配 现在也在逐渐深入啦,希望跟大家一起进步越来越强 目录 OpenCV中的图像处理 -- 傅里叶变换+模板匹配 1. 傅里叶变换 1.1 Numpy实 ...

  8. OpenCV中的图像处理 —— 霍夫线 / 圈变换 + 图像分割(分水岭算法) + 交互式前景提取(GrabCut算法)

    OpenCV中的图像处理 -- 霍夫线 / 圈变换 + 图像分割(分水岭算法) + 交互式前景提取(GrabCut算法)

  9. OpenCV中的图像处理 目录 v4.7.0

    改变色彩空间 学习在不同的色彩空间之间改变图像.另外,还要学习在视频中跟踪一个彩色物体. 图像的几何变换 学习对图像应用不同的几何变换,如旋转.平移等. 图像阈值处理 学习使用全局阈值.自适应阈值.大 ...

最新文章

  1. Servlet: server applet与执行原理
  2. 详介oracle的RBO/CBO优化器
  3. java 页面输出一个页面_java学习之:一个完整页面输出信息的过程(以输出Doctor表中信息为例)...
  4. 眼坐标系和世界坐标系的相互转换
  5. oracle数组转换字符串函数,Oracle 字符串转数组的函数
  6. spark DataSet与DataFrame的区别
  7. 活动目录(Active Directory)域故障解决实例(转载)
  8. LOJ 2743(洛谷 4365) 「九省联考 2018」秘密袭击——整体DP+插值思想
  9. 使用CSS来美化你的javafx滚动条
  10. 深度学习图像分类(四): GoogLeNet(V1,V2,V3,V4)
  11. diskgenius数据恢复软件,亲测可用!
  12. 查看linux vnc用户名,VNC远程连接Linux
  13. python selenium 跳转网页_selenium关于页面跳转
  14. 【无人机】【2017.12】基于AGENT的防御群建模分析
  15. 玩转移远SC60 Android开发板------(1)LCD
  16. Windows动态链接库使用详解
  17. 全新动态视频壁纸微信小程序源码下载支持多种分类短视频另外也有静态壁纸
  18. 【中国人口金字塔2019,python,pandas,matplotlib,numpy 】
  19. linux编译poco静态库,iOS——为Xcode编译POCO C++静态库
  20. 【linux内核-源码编译之centos7】

热门文章

  1. java 微信转账 ca_error_【微信支付】企业付款开发者文档
  2. Sandboxie Plus v0.9.5 / v5.51.5 电脑裸奔沙盘工具箱开源版
  3. 计算机 统计学考研科目,有关统计学考研的科目?
  4. 常用的meta标签以及作用
  5. 浦软孵化器 10 周年科创盛典 | 七牛云斩获「创业独角兽」荣誉称号
  6. 《CCIE路由和交换认证考试指南(第5版) (第2卷)》——1.4节构建IP路由表
  7. 环境监测空气保护网站搭建模板
  8. 聆听「创业」与「AI+教育」 | 爱莫×众里 in FM105.7
  9. 毕业论文内容指导与格式检查指南
  10. win7服务器ip地址为空,win7服务器ip地址为空