IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> OpenCV中的图像处理 —— 改变颜色空间+图像几何变换 -> 正文阅读

[人工智能]OpenCV中的图像处理 —— 改变颜色空间+图像几何变换

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

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

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 到 HSV
     hsv = 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) & 0xFF
     if 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中文官方文档)
如果文章对您有所帮助,记得一键三连支持一下哦

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 20:50:48  更:2022-03-21 20:50:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:51:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码