2.4 OpenCV随手简记(五)

一、图像翻转
第一个图像翻转,这个可是制作表情包的利器。
图像翻转在 OpenCV 中调用函数 flip() 实现,原函数如下:
flip(src, flipCode, dst=None)
  • src:原始图像。
  • flipCode:翻转方向,
  • 如果 flipCode 0 ,则以 X 轴为对称轴翻转,
  • 如果 fliipCode > 0 则以 Y 轴为对称轴翻转,
  • 如果 flipCode < 0 则在 X 轴、 Y 轴方向同时翻转。
示例如下:
import cv2 as cv
import matplotlib.pyplot as plt
# 读取图片 由 GBR 转 RGB
img = cv.imread('maliao.jpg')
src = cv.cvtColor(img, cv.COLOR_BGR2RGB)
# 图像翻转
# flipCode 为 0 ,则以 X 轴为对称轴翻转,如果 fliipCode > 0 则以 Y 轴为对称轴翻转,如果
flipCode < 0 则在 X 轴、 Y 轴方向同时翻转。
img1 = cv.flip(src, 0)
img2 = cv.flip(src, 1)
img3 = cv.flip(src, -1)
# plt 显示图形
titles = ['Source', 'Ima1', 'Ima2', 'Ima3']
images = [src, img1, img2, img3]
for i in range(4):
plt.subplot(2, 2, i + 1)
plt.imshow(images[i])
plt.title(titles[i])
plt.xticks([])
plt.yticks([])
plt.show()

二、放射变换
1.图像平移
图像平移是通过仿射函数 warpAffine() 来实现的,原函数如下:
warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None,
borderValue=None)
在图像平移中我们会用到前三个参数:
1. 需要变换的原始图像
2. 移动矩阵 M
3. 变换的图像大小(如果这个大小不和原始图像大小相同,那么函数会自动通过插值来调整像素间的关系)。
图像的平移是沿着 x 方向移动 tx 距离, y 方向移动 ty 距离,那么需要构造移动矩阵 :
M = [ [1,0,tx], [0,1,ty]]
M 2x3 矩阵, M 矩阵必须是 float 类型的。
创建 M 矩阵有如下两种方法:
(1) M = np.zeros(2,3,np.float32)
M[0] = [1,0,tx]
M[1] = [0,1,ty]
(2) M = np.float32([1,0,tx], [0,1,ty])
我们通过 Numpy 来产生 M 矩阵(必须是 float 类型的),并将其赋值给仿射函数 warpAffine() ,下
面来看个示例:
import cv2 as cv
import numpy as np
#读取图片
src = cv.imread('maliao.jpg')
rows, cols = src.shape[:2]
# 定义移动距离
tx = 50
ty = 100
# 生成 M 矩阵
M = np.float32([[1, 0, tx], [0, 1, ty]])
# 平移
dst = cv.warpAffine(src, M, (cols, rows))
# 显示图像
cv.imshow('src', src)
cv.imshow("dst", dst)
# 等待显示
cv.waitKey(0)
cv.destroyAllWindows()

注意: warpAffine 函数的第三个参数是输出图像的大小, 这里设置的大小是原图片的大小,所
以结果会有部分遮挡。
2.平移的动态演示
import cv2 as cv
import numpy as np
import time
#读取图片
src = cv.imread('beauty5.jpeg')
rows, cols = src.shape[:2]
# 定义移动距离
tx = 50
ty = 100
i = 0
while cv.waitKey(1) == -1: #等待1毫秒后,用户按下任意键
# 生成 M 矩阵
M = np.float32([[1, 0, tx+i], [0, 1, ty]])
# 平移
dst = cv.warpAffine(src, M, (cols, rows))
# 显示图像
cv.imshow("dst", dst)
time.sleep(1/190)
i = i+1
cv.destroyWindow("dst")

# 斜下方移动,移出后又返回
import cv2 as cv
import numpy as np
import time
#读取图片
src = cv.imread('beauty5.jpeg')
rows, cols = src.shape[:2]
# 定义移动距离
tx = 0
ty = 0
i = 0
while cv.waitKey(1) == -1: #等待1毫秒后,用户按下任意键
# 生成 M 矩阵
if tx+i>src.shape[1]: # 移出后又返回
i = 0
Tx = tx+i
Ty = ty+i
M = np.float32([[1, 0, Tx], [0, 1, Ty]])
# 平移
dst = cv.warpAffine(src, M, (cols, rows))
# 显示图像
cv.imshow("dst", dst)
time.sleep(1/190)
i = i+1
cv.destroyWindow("dst")

3.图像旋转

图像旋转主要调用 getRotationMatrix2D() 函数和 warpAffine() 函数实现,绕图像的某一个中心
点旋转,具体如下:
M = cv2.getRotationMatrix2D((cols/2, rows/2), 30, 1)
参数分别为:旋转中心、旋转度数、 scale
rotated = cv2.warpAffine(src, M, (cols, rows))
参数分别为:原始图像、旋转参数、原始图像宽高
图像旋转:设( x0 , y0 )是旋转后的坐标,( x , y )是旋转前的坐标, ( m , n ) 是旋转中心, a 是旋转 的角度( 顺时针 ) ( left , top ) 是旋转后图像的左上角坐标,则公式如下 :
import cv2 as cv
#读取图片

src = cv.imread('maliao.jpg')
# 原图的高、宽
rows, cols = src.shape[:2]
# 绕图像的中心旋转
# 参数:旋转中心 旋转度数 scale
M = cv.getRotationMatrix2D((cols/2, rows/2), 90, 1)
#
dst = cv.warpAffine(src, M, (cols, rows))
# 显示图像
cv.imshow("src", src)
cv.imshow("dst", dst)
# 等待显示
cv.waitKey()
cv.destroyAllWindows()

4.图片动态旋转效果
# 固定大小旋转
import cv2 as cv
import time
#读取图片
src = cv.imread('beauty5.jpeg')
# 原图的高、宽
5.4 图像倾斜
rows, cols = src.shape[:2]
i = 1
while cv.waitKey(1) == -1: #等待1毫秒后,用户按下任意键
# 生成 M 矩阵
M = cv.getRotationMatrix2D((cols/2, rows/2), 0+i*30, 0.5) # 0-i*30 反转
# 绕图像的中心旋转
# 参数:旋转中心 旋转度数 scale
dst = cv.warpAffine(src, M, (cols, rows))
i = i+1
# 显示图像
cv.imshow("dst", dst)
time.sleep(1/10) # 时间越短,现象越有趣
cv.destroyWindow("dst")
# 由小到大旋转
import cv2 as cv
import time
#读取图片
src = cv.imread('beauty5.jpeg')
# 原图的高、宽
rows, cols = src.shape[:2]
i = 1
while cv.waitKey(1) == -1: #等待1毫秒后,用户按下任意键
# 生成 M 矩阵
M = cv.getRotationMatrix2D((cols/2, rows/2), 0+i*20, 0.01*i)
# 绕图像的中心旋转
# 参数:旋转中心 旋转度数 scale
dst = cv.warpAffine(src, M, (cols, rows))
i = i+1
if i == 100:
i = 1
time.sleep(3)
# 显示图像
cv.imshow("dst", dst)
time.sleep(1/30)
cv.destroyWindow("dst")
5.图像倾斜
import cv2
import numpy as np
img = cv2.imread("demo.png") # 读取图像
rows = len(img) # 图像像素行数
cols = len(img[0]) # 图像像素列数
p1 = np.zeros((3, 2), np.float32) # 32位浮点型空列表,原图三个点
p1[0] = [0, 0] # 左上角点坐标
p1[1] = [cols - 1, 0] # 右上角点坐标
p1[2] = [0, rows - 1] # 左下角点坐标
p2 = np.zeros((3, 2), np.float32) # 32位浮点型空列表,倾斜图三个点
p2[0] = [50, 0] # 左上角点坐标,向右挪50像素
p2[1] = [cols - 1, 0] # 右上角点坐标,位置不变
p2[2] = [0, rows - 1] # 左下角点坐标,位置不变
M = cv2.getAffineTransform(p1, p2) # 根据三个点的变化轨迹计算出M矩阵
dst = cv2.warpAffine(img, M, (cols, rows)) # 按照M进行仿射
cv2.imshow('img', img) # 显示原图
cv2.imshow('dst', dst) # 显示仿射变换效果
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体

6.透视变换

摄像机斜视拍摄一物体后,形成的图像会发生变形,如果将图像映射到拍摄物体平面上,相当于将相机垂直于拍摄平面,这样就会得到图像的真实形状,由于这种映射相当于将原图重新 透视 到另一个平面,这种称之为“ 重投影
  上述仿射变换可以将矩形映射成任意平行四边形, 各边仍保持平行 ;而透视变换可以将矩形映射为 任意四边形 直线仍保持直线 由于不再是平行四边形,需提供四个顶点。
透视变换通过函数 cv2.warpPerspective() 实现,语法为 :
warpPerspective(src, M, dsize, dst=None, flags=None, borderMode=None,
borderValue=None)
'''
dst:透视后的输出图像,dsize决定输出图像大小
src:输入图像
M:3*3变换矩阵
flags:插值方法,默认为INTER_LINEAR
borderMode:边类型,默认为BORDER_CONSTANT
borderValue:边界值,默认为0
'''
透视变换通过函数 cv2.getPerspectiveTransform() 来生成转换矩阵,需输入输入图像和输出图像的
四个顶点的坐标。
cv2.getPerspectiveTransform(p1,p2)
# p1,p2分别为原图像4点坐标和新图像4点坐标
手动获取图像顶点的直接透视变换
1 、获取图像四个顶点(通过 photoshop 等软件手动获取,或用 python-opencv 程序手动获取)
2 、形成变换矩阵
3 、透视变换
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('C:/Users/df/Desktop/pp.png')
H_rows, W_cols= img.shape[:2]
print(H_rows, W_cols)
# 原图中书本的四个角点(左上、右上、左下、右下),获取方法见《鼠标点击图片显示点击点及坐标》
pts1 = np.float32([[124,62], [457,100], [53,576], [559,539]])
#变换后矩阵位置
pts2 = np.float32([[0, 0],[W_cols,0],[0, H_rows],[H_rows,W_cols],])
# 生成透视变换矩阵;进行透视变换
M = cv2.getPerspectiveTransform(pts1, pts2)
dst = cv2.warpPerspective(img, M, (668, 634))
cv2.imshow("original_img",img)
cv2.imshow("result",dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
import numpy as np
img = cv2.imread("pp.png")
print("the shape of the imag is: ",img.shape)
def on_EVENT_LBUTTONDOWN(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
xy = "%d,%d" % (x, y)
print (xy)
cv2.circle(img, (x, y), 1, (255, 0, 0), thickness = -1)
cv2.putText(img, xy, (x, y), cv2.FONT_HERSHEY_PLAIN,
1.0, (0,0,0), thickness = 1)
cv2.imshow("image", img)
cv2.namedWindow("image")
cv2.setMouseCallback("image", on_EVENT_LBUTTONDOWN)
cv2.imshow("image", img)
while(True):
try:
cv2.waitKey(100)
if cv2.getWindowProperty('img',cv2.WND_PROP_VISIBLE) <= 0:
break # 防止直接关闭窗口后的“阻塞”
except Exception:
cv2.destroyWindow("image")
break
cv2.waitKey(0)
#cv2.destroyAllWindow()
  通过创建一个鼠标回调函数,当鼠标事件发生时执行该函数。鼠标事件可以是任何与鼠标相关的事 件,如左键向下、左键向上、左键双击等。 它为我们提供了每个鼠标事件的坐标( x y )。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/687773.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI绘画如何打造高质量数据集?

遇到难题不要怕&#xff01;厚德提问大佬答&#xff01; 厚德提问大佬答11 你是否对AI绘画感兴趣却无从下手&#xff1f;是否有很多疑问却苦于没有大佬解答带你飞&#xff1f;从此刻开始这些问题都将迎刃而解&#xff01;你感兴趣的话题&#xff0c;厚德云替你问&#xff0c;你…

Windows搭建apache网站

1、官网下载安装包&#xff0c;注意下载服务器对应操作系统的安装包&#xff08;此案例为64位操作系统&#xff09; Apache VS17 binaries and modules downloadFor (business) webmasters, developers and home-users who want running always up to date Windows VS17 binar…

【造化弄人:计算机系大学生真的象当年的高速公路收费员一样吗?】

曾经高速公路的收费员是多么的自豪和骄傲&#xff0c;按照常逻辑&#xff0c;车是越来越多&#xff0c;收费员应该越来越多&#xff1f;但现实情况&#xff0c;大家有目共睹&#xff01; 不论你的车子怎么跑&#xff0c;只要上高速就要交费&#xff0c;那时候的收费员&#xf…

qmt量化交易策略小白学习笔记第18期【qmt编程之获取对应周期的北向南向数据--方式2:原生python】

qmt编程之获取对应周期的北向南向数据 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 获取对应周期的北向南向数据 提示 该数据通过get_market_data_ex接口获取获取历史数据前需要先用downl…

【数据分析系列】交叉列联表与卡方检验:数据解读与Python实践应用

目录 一、交叉列联表和卡方检验的关系 &#xff08;一&#xff09;什么是交叉列联表 &#xff08;二&#xff09;什么是卡方检验 &#xff08;三&#xff09;除了卡方检验&#xff0c;列联表分析还可以结合其他统计方法 二、列联表只能用于两个分类变量吗&#xff1f; 三、…

解决富文本中抖音视频无法播放的问题——403

问题 富文本中的抖音视频无法播放&#xff0c;资源状态码是403禁止访问打开控制台&#xff0c;可以看到在项目中打开&#xff0c;数据请求的请求头多了一个Referer: http://localhost:3000/而复制链接在新窗口直接打开&#xff0c;请求头中并不会携带Referer 解决方案 在ind…

windows 系统通过 cmd 命令终止进程

windows 系统通过 cmd 命令终止进程 1、使用 netstat 命令查看特定端口的占用情况 例如&#xff0c;要查看端口号为 8015 的情况&#xff0c;可以执行以下命令&#xff1a; netstat -ano | findstr 8105此命令会显示所有占用端口 8105 的网络连接&#xff0c;并列出 PID&…

2009年408真题解析

2009年408真题解析 【2009.1】为解决计算机主机与打印机之间速度不匹配问题&#xff0c;通常设置一个打印数据缓冲区&#xff0c;主机将要输出的数据依次写入该缓冲区&#xff0c;而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是。 A.栈 B.队列 C.树 D.图 …

2024-06-06 问AI: 在深度学习中,什么是欧几里德长度?

文心一言 在深度学习中&#xff0c;欧几里德长度&#xff08;也称为欧几里得距离或欧氏距离&#xff09;是一个常用的概念&#xff0c;它衡量的是在多维空间中两个点之间的真实距离&#xff0c;或者说是向量的自然长度&#xff08;即该点到原点的距离&#xff09;。以下是关于…

[职场] 缺点范文 #知识分享#经验分享#媒体

缺点范文 回答示范1&#xff1a; 我的公开演讲能力比较差&#xff0c;在公共场合讲话的时候我会感到紧张&#xff0c;不过谈论我熟悉的领域我会比较放松。所以当我需要做公开发言的时候&#xff0c;我必须要准备得很充分。我确实羡慕那些无论什么话题都能够高谈阔论的人。 回…

中国版Wayve决战端到端,等待数据的大力出奇迹

作者 |王博 编辑 |德新 「人工智能的定律只有一个&#xff0c;就是规模定律&#xff08;Scaling Law&#xff09;&#xff0c;大力出奇迹。端到端是描述方式&#xff0c;更应该去考虑如何去生产更多的自动驾驶合适的数据&#xff0c;来喂养更大更合适的模型&#xff0c;取得更…

多目标应用:NSGA2求解无人机三维路径规划(MATLAB代码)

详细介绍 多目标应用&#xff1a;基于非支配排序的鱼鹰优化算法NSOOA求解无人机三维路径规划&#xff08;MATLAB代码&#xff09;-CSDN博客 一次运行结果 完整MATLAB代码 多目标应用&#xff1a;NSGA2求解无人机三维路径规划&#xff08;MATLAB代码&#xff09;

香港优才计划线上申请10大步骤,2024年流程截图,diy照做就可以

我是糖爸&#xff0c;已获批香港优才。10个步骤申请香港优才真的很简单&#xff0c;因为现在入境处只接受线上申请啦&#xff0c;你自己上传资料就可以&#xff0c;找中介也是你自己准备资料给他帮忙上传&#xff0c;何不自己动手上传呢&#xff0c;省个几万。 10大步骤分别是&…

吴恩达深度学习笔记:机器学习(ML)策略(1)(ML strategy(1))1.7-1.8

目录 第三门课 结构化机器学习项目&#xff08;Structuring Machine Learning Projects&#xff09;第一周 机器学习&#xff08;ML&#xff09;策略&#xff08;1&#xff09;&#xff08;ML strategy&#xff08;1&#xff09;&#xff09;1.7 什么时候该改变开发/测试集和指…

智能视频监控平台LntonCVS视频融合共享平台保障露营安全解决方案

在当今社会&#xff0c;都市生活的快节奏和压力使得越来越多的人渴望逃离城市的喧嚣&#xff0c;寻求一种短暂的慢生活体验。他们向往在壮丽的山河之间或宁静的乡村中露营&#xff0c;享受大自然的宁静与美好。随着露营活动的普及&#xff0c;露营地的场景也变得更加丰富多样&a…

Three.js和Babylon.js,webGL中的对比效果分析!

hello&#xff0c;今天分享一些three.js和babylon.js常识&#xff0c;为大家选择three.js还是babylon.js做个分析&#xff0c;欢迎点赞评论转发。 一、Babylon.js是什么 Babylon.js是一个基于WebGL技术的开源3D游戏引擎和渲染引擎。它提供了一套简单易用的API&#xff0c;使开发…

UFS Explorer Professional Recovery: 如何从启用了 mSATA 缓存的 Drobo 设备中恢复数据

天津鸿萌科贸发展有限公司是 UFS Explorer Professional Recovery 数据恢复软件的授权代理商。 UFS Explorer Professional Recovery 数据恢复软件提供综合性的解决方案&#xff0c;用于解决复杂的数据恢复案例&#xff0c;包括那些采用特殊存储技术的案例&#xff0c;或介质受…

如何解决访问网站时IP被限制的问题?

在互联网上&#xff0c;用户可能会面临一个令人困扰的问题——当尝试访问某个特定的网站时&#xff0c;却发现自己的IP地址被该网站屏蔽。 IP地址被网站屏蔽是一个相对常见的现象&#xff0c;而导致这种情况的原因多种多样&#xff0c;包括恶意行为、违规访问等。本文将解释IP地…

jupyter notebook默认工作目录修改

jupyter notebook默认工作目录修改 1、问题2、如何修改jupyter notebook默认工作目录 1、问题 anaconda安装好之后&#xff0c;我们启动jupyter notebook会发现其默认工作目录是在C盘&#xff0c;将工作目录放在C盘会让C盘很快被撑爆&#xff0c;我们应该将jupyter notebook默…