位置: IT常识 - 正文

OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)【python-Open_CV系列(五)】(opencv几何变换)

编辑:rootadmin
OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)【python-Open_CV系列(五)】

推荐整理分享OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)【python-Open_CV系列(五)】(opencv几何变换),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:opencv图像类型转换,opencv图像缩小怎么实现,opencv 变形,opencv 图像,opencv几何图形识别,opencv几何图形识别,opencv图像几何变换,opencv几何图形识别,内容如对您有帮助,希望把文章链接给更多的朋友!

OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)(python为工具) 【Open_CV系列(五)】

文章目录准备图片1. 缩放 cv2.resize()方法2. 翻转 cv2.flip()方法3. 仿射变换 warpAffine()方法3.1 平移3.2 旋转3.3 倾斜4. 透视

ʚʕ̯•͡˔•̯᷅ʔɞ 🍹欢迎各路大佬来到小啾主页指点☀️欢迎大家前来学习OpenCV图像几何变换专题 - Open_CV系列博文第五篇,我是侯小啾。 本期blog可以作为日常复制的脚手架代码来运用。 ✨博客主页:云雀编程小窝 🌹꧔ꦿ 🌹꧔ꦿ博文内容如对您有所帮助,还请给个点赞 + 关注 + 收藏✨             

如有疑问欢迎随时在评论区交流。☀️

准备图片

选择一张shape为(500,500,3)的梵高的《星月夜》以便示例。            

1. 缩放 cv2.resize()方法

cv2.resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)

src 原图(的数组)dsize: 输出图像的大小 格式:(a,b)。 设定dsize后就无需再设置fx和fyfx 可选参数 水平方向缩放比fy 可选参数 垂直方向缩放比

fx和fy不同于dsize,fx和fy是各是一个比值,如设为2,则表示放大2倍,设为1/2则表示缩小到原来的12\displaystyle \frac{1}{2}21​。

import cv2img = cv2.imread("The_Starry_Night.jpg")dst1 = cv2.resize(img, (200, 200))dst2 = cv2.resize(img, (900, 900))cv2.imshow("img", img)cv2.imshow("dst1", dst1)cv2.imshow("dst2", dst2)cv2.waitKey()cv2.destroyAllWindows()

执行结果如图所示,相比原图,图像得到了指定大小的缩小与放大。

使用fx和fy参数,则需要手动把dsize设为None。

import cv2img = cv2.imread("The_Starry_Night.jpg") # 将宽缩小到原来的1/3、高缩小到原来的1/2dst3 = cv2.resize(img, None, fx=1 / 3, fy=1 / 2) # 将宽高扩大2倍dst4 = cv2.resize(img, None, fx=2, fy=2) cv2.imshow("img", img)cv2.imshow("dst3", dst3) cv2.imshow("dst4", dst4) cv2.waitKey() cv2.destroyAllWindows()

结果呈现:

2. 翻转 cv2.flip()方法

flip(src, flipCode, dst=None)

src 图像(数组)flipCode 翻转代码。可以是0,正数,负数。0表示沿X轴(水平方向的轴)翻转。1表示沿Y轴(竖直方向的轴)翻转。 负数表示同时沿X轴和Y轴翻转。

讲原图经过着三种翻转后,与原图拼在一块,呈现出了这种奇观:

import cv2img = cv2.imread("The_Starry_Night.jpg")dst1 = cv2.flip(img, 0)dst2 = cv2.flip(img, 1)dst3 = cv2.flip(img, -1)cv2.imshow("img", img)cv2.imshow("dst1", dst1)cv2.imshow("dst2", dst2)cv2.imshow("dst3", dst3)cv2.waitKey()cv2.destroyAllWindows()

将翻转结果放在同一张画布中

import cv2import numpy as npimg = cv2.imread("The_Starry_Night.jpg")dst1 = cv2.flip(img, 0)dst2 = cv2.flip(img, 1)dst3 = cv2.flip(img, -1)a, b, c = img.shapecanvas = np.ones((2 * a, 2 * b, c), np.uint8) * 255canvas[0:b, 0:a] = imgcanvas[b:2*b, 0:a] = dst1canvas[0:b, a:2*a] = dst2canvas[b:2*b, a:2*a] = dst3cv2.imshow("pic", canvas)cv2.waitKey()cv2.destroyAllWindows()# 保存图片# cv2.imwrite("final_pic", canvas)

结果呈现:

3. 仿射变换 warpAffine()方法

常见的仿射变换有平移,旋转和倾斜变换。 仿射变换使用cv2.warpAffine()方法完成

warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)

src 原图

M 是一个二行三列的矩阵,也称仿射矩阵。warpAffine方法根据此矩阵的值来变换像素的位置。 M = [[a, b, c], [d, e, f]],则像素的变换公式为: X = x × a + y × b + c Y = x × d + y × e + f 其中x,y指原像素的x、y轴坐标。X,Y指变换后的X,Y坐标。

OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)【python-Open_CV系列(五)】(opencv几何变换)

dsize 输出图像的尺寸。(不带放缩,增大的部分用黑色色素(0)填充)

这三个参数是常用的参数。其余参数建议使用默认值。 flags表示插入方式,borderMode是边界类型,borderValue表示边界值(默认0)。dst表示反射变换后输出的图像。

3.1 平移

以将《星月夜》向左平移50个像素,向下平移100个像素为例。 则M数组应写为[[1, 0, 50], [0, 1, 100]]:

import cv2import numpy as npimg = cv2.imread("The_Starry_Night.jpg")rows = len(img)cols = len(img[0])M = np.float32([[1, 0, 50], [0, 1, 100]]) dst = cv2.warpAffine(img, M, (cols, rows))cv2.imshow("img", img) cv2.imshow("dst", dst) cv2.waitKey() cv2.destroyAllWindows()

如图所示,图像按照我们的预期成功被平移。 只是这样得到的图像有色素损失,我们丢失了超出画布之外的数据。 为了避免损失,可以取设置dsize参数来控制输出图像的大小。

修改后的代码如下:

import cv2import numpy as npimg = cv2.imread("The_Starry_Night.jpg")rows = len(img)cols = len(img[0])M = np.float32([[1, 0, 50], [0, 1, 100]])dst = cv2.warpAffine(img, M, (cols+200, rows+200))cv2.imshow("img", img)cv2.imshow("dst", dst)cv2.waitKey()cv2.destroyAllWindows()

优化后的程序执行效果:

3.2 旋转

旋转也是通过M矩阵来实现的,这个矩阵的运算较复杂, OpenCV提供了getRotationMatrix2D()方法来计算旋转操作的M矩阵

getRotationMatrix2D(center, angle, scale)

center 指旋转中心的坐标angle指旋转的角度scale值缩放的比例。(旋转过程支持缩放)import cv2img = cv2.imread("The_Starry_Night.jpg")rows = len(img) cols = len(img[0]) center = (rows / 2, cols / 2) M = cv2.getRotationMatrix2D(center, 30, 0.8) dst = cv2.warpAffine(img, M, (cols, rows)) cv2.imshow("img", img) cv2.imshow("dst", dst) cv2.waitKey() cv2.destroyAllWindows()

旋转效果如图所示:

3.3 倾斜

OpenCV需要定位到图像的三个点的位置来计算倾斜效果,即左上角,右上角和左下角。 图像的倾斜也是根据M矩阵实现,得出矩阵的运算较复杂,通过getAffineTransform 方法实现。

语法

getAffineTransform(src, dst)

src是原图像的左上角,右上角和左下角三个点的坐标。三维数组格式,形如[[a, b], [c, d], [e, f]]。dst是倾斜后这三个点预期的坐标。格式同上。

要保持左上,右下,左下三个点的顺序不能乱。

以将《星月夜》保持左下角和右上角坐标不变,左上角((0,0)处)向右移动150个像素长度。 代码如下:

import cv2import numpy as npimg = cv2.imread("The_Starry_Night.jpg")rows = len(img)cols = len(img[0])p1 = np.array([[0, 0], [cols - 1, 0], [0, rows - 1]], dtype=np.float32)p2 = np.array([[150, 0], [cols - 1, 0], [0, rows - 1]], dtype=np.float32)M = cv2.getAffineTransform(p1, p2)dst = cv2.warpAffine(img, M, (cols, rows))cv2.imshow('img', img)cv2.imshow('dst', dst)cv2.waitKey()cv2.destroyAllWindows()

程序执行效果如下:

4. 透视

透视的实现使用的是warpPerspective()方法,而不再是用于平移、旋转、倾斜的warpAffine()方法。 使用warpPerspective()方法也需要通过M矩阵来计算透视效果,计算透视的M矩阵可以使用getPerspectiveTransform()方法。

getPerspectiveTransform(src, dst, solveMethod=None)

该方法常用的参数有两个,分别为原图的四个点的坐标(scr) 和 透视后四个点的坐标(dst)。Opcv需要通过定位图像的这四个点来计算透视效果。四个点依次为左上,右上,左下,右下。 坐标格式为二维数组格式,形如[[a, b],[c, d],[e, f],[g, h]]。

示例代码如下:

import cv2import numpy as npimg = cv2.imread("The_Starry_Night.jpg")rows = len(img)cols = len(img[0])# 原图的四点坐标p1 = np.zeros((4, 2), np.float32)p1[0] = [0, 0]p1[1] = [cols - 1, 0]p1[2] = [0, rows - 1]p1[3] = [cols - 1, rows - 1]# 透视后的四点坐标p2 = np.zeros((4, 2), np.float32)p2[0] = [150, 0]p2[1] = [cols - 150, 0]p2[2] = [0, rows - 1] # 不变p2[3] = [cols - 1, rows - 1] # 不变M = cv2.getPerspectiveTransform(p1, p2)dst = cv2.warpPerspective(img, M, (cols, rows))cv2.imshow('The_Starry_Night', img)cv2.imshow('The_Starry_Night2', dst)cv2.waitKey()cv2.destroyAllWindows()

展示原图和透视后的图像效果:

🌹꧔ꦿ本系列blog传送门:   ✨OpenCV图像处理基本操作 【Python-Open_CV系列(一)】   ✨OpenCV像素处理基本操作 【Python-Open_CV系列(二)】   ✨OpenCV之 BGR、GRAY、HSV色彩空间&色彩通道专题 【Python-Open_CV系列(三)】   ✨OpenCV绘制图像与文字(可作为脚手架代码)(python) 【Python-Open_CV系列(四)】   ✨OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)【python-Open_CV系列(五)】   ✨基于梵·高《向日葵》的 图像阈值处理专题(二值处理、反二值处理、截断处理、自适应处理及Otsu方法)【Python-Open_CV系列(六)】   ✨OpenCV基本功 之 图像的掩模、运算 & 合并专题 -小啾带学【Python-Open_CV系列(七)】   ✨《三英战吕布》 - 图像模板匹配 【Python-Open_CV系列(八)】   ✨OpenCV滤波器 龙门石窟篇【Python-Open_CV系列(九)】(均值滤波器、中值滤波器、高斯滤波器、双边滤波器)   ✨Open_CV形态学运算专题 (腐蚀&膨胀、开&闭运算、梯度运算、顶帽运算黑帽运算 )【Python-Open_CV系列(十)】   ✨霍夫变换看不懂?小啾带你串一遍:OpenCV图形检测专题 这样学最简单【Python-Open_CV系列(十一)】   ✨小啾带你开天眼 之 开启py-OpenCV摄像头及视频处理【Python-Open_CV系列(十二)】   ✨小啾带你开天眼 之 人脸检测与识别(以及华强、皇叔、高祖配墨镜特效)【Python-Open_CV系列(十三)】

本文链接地址:https://www.jiuchutong.com/zhishi/300614.html 转载请保留说明!

上一篇:VUE中watch的详细使用教程(vue watch)

下一篇:总结JS中常用的数组的方法大全(总结js中常用的字符)

  • pdf啥意思(pdf啥意思怎么弄)

    pdf啥意思(pdf啥意思怎么弄)

  • 小米手机怎么添加nfc门禁卡(小米手机怎么添加桌面小插件)

    小米手机怎么添加nfc门禁卡(小米手机怎么添加桌面小插件)

  • 华为手机时间在哪里设置24小时(华为手机时间在左上角怎么调在右上角)

    华为手机时间在哪里设置24小时(华为手机时间在左上角怎么调在右上角)

  • 华为nova5手机otg在哪(华为nova5手机ot g在哪儿打开)

    华为nova5手机otg在哪(华为nova5手机ot g在哪儿打开)

  • iphonex充电一晚上不拔可以吗(iphonex充电一晚充不满)

    iphonex充电一晚上不拔可以吗(iphonex充电一晚充不满)

  • 下行速率300mbps是多少宽带(下行速率300mbps快吗)

    下行速率300mbps是多少宽带(下行速率300mbps快吗)

  • 手机号因举报骚扰停机(手机号因举报骚扰停机多久注销)

    手机号因举报骚扰停机(手机号因举报骚扰停机多久注销)

  • 淘宝小铺是阿里巴巴的吗(淘宝小铺是什么)

    淘宝小铺是阿里巴巴的吗(淘宝小铺是什么)

  • 抖音左下角三角形和数字是什么意思(抖音左下角三角形重复看也会显示吗)

    抖音左下角三角形和数字是什么意思(抖音左下角三角形重复看也会显示吗)

  • qq邮箱大于50MB附件的邮件如何发送(qq邮箱超大附件http600)

    qq邮箱大于50MB附件的邮件如何发送(qq邮箱超大附件http600)

  • 快手闪回是什么意思(快手闪进闪出有什么影响)

    快手闪回是什么意思(快手闪进闪出有什么影响)

  • word英文每行长短不一(word英文每行长短不一致)

    word英文每行长短不一(word英文每行长短不一致)

  • 钢化膜多久换(钢化膜多久换一个)

    钢化膜多久换(钢化膜多久换一个)

  • 微信如何取消群代办(微信如何取消群折叠)

    微信如何取消群代办(微信如何取消群折叠)

  • 智行火车票预约抢票可以取消吗(智行火车票预约抢票能抢到吗)

    智行火车票预约抢票可以取消吗(智行火车票预约抢票能抢到吗)

  • 小米手表支持苹果手机吗(小米手表支持苹果微信吗)

    小米手表支持苹果手机吗(小米手表支持苹果微信吗)

  • 华为mate30圆点怎么设置(华为mate30pro小圆点)

    华为mate30圆点怎么设置(华为mate30pro小圆点)

  • 苹果手机内存不够怎么办(苹果手机内存不足怎么扩大)

    苹果手机内存不够怎么办(苹果手机内存不足怎么扩大)

  • 手机低电量怎样拍照(手机电量低怎么样省电)

    手机低电量怎样拍照(手机电量低怎么样省电)

  • iphone11原彩显示是什么意思(iphone11原彩显示有什么用)

    iphone11原彩显示是什么意思(iphone11原彩显示有什么用)

  • 手机定时关机定时开机怎么做(手机定时关机定时开机对手机有影响吗)

    手机定时关机定时开机怎么做(手机定时关机定时开机对手机有影响吗)

  • 淘宝怎么改生日(淘宝怎样改生日)

    淘宝怎么改生日(淘宝怎样改生日)

  • 腾讯青少年模式怎么关闭(腾讯青少年模式时间限制)

    腾讯青少年模式怎么关闭(腾讯青少年模式时间限制)

  • 文件夹中不可存放的是什么(找回删除的文件)

    文件夹中不可存放的是什么(找回删除的文件)

  • 天翼网关2.0怎么设置(天翼网关2.0怎么插线)

    天翼网关2.0怎么设置(天翼网关2.0怎么插线)

  • qq扩列怎么打开步骤(qq扩列如何打开)

    qq扩列怎么打开步骤(qq扩列如何打开)

  • 橡皮树的养殖方法和注意事项(图文)(橡皮树的养殖方法视频教程)

    橡皮树的养殖方法和注意事项(图文)(橡皮树的养殖方法视频教程)

  • 所得税税前扣除凭证管理办法
  • 非营利组织免税资格认定申请表
  • 企业对公账户钱怎么取出来
  • 休产假个人部分社保公司怎么做账
  • 财务费用属于什么科目借贷方向
  • 营业费用和营业收入的关系
  • 卫生清理费计入什么科目
  • 分包部分也享受价格优惠
  • 抵债资产账务处理2021年
  • 存货盘盈属于什么活动
  • 营改增账务处理实例
  • 进口货物的关税完税价格不包括
  • 交增值税入什么科目
  • 电子发票如何查询发票代码
  • 企业多扣个税怎么处理
  • 出售固定资产支付的相关费用计入
  • 普通发票税率为1%吗
  • 收到机动车发票怎么认证
  • 借钱注册公司会计分录
  • 挂靠的工程个人所得税怎么交?
  • 职工教育经费取得证件之后补助多少钱
  • 所得税预缴资产怎么计算
  • 小规模纳税人代账一年多少钱
  • 纳税所得额怎么算个税
  • 小规模纳税人发生销售退回如何申报
  • 破产清算应付账款
  • 会计变更
  • 小规模纳税人买车可以抵税吗
  • Win11错误提示"the pc must support secure boot"怎么解决
  • 苹果今天推送更新内容
  • 金融企业贷款逾期怎么办
  • 竣工结算的依据有哪些?
  • 理财产品利息税
  • php动态页面实例
  • 实际退税能退多少
  • php提交post数据
  • pytorch如何训练模型
  • 收到退回的增值税专用发票账务处理
  • 发放工资时扣除的保险怎么做
  • 房地产开发企业应该具备哪些条件
  • controller层,service层,dao
  • php如何遍历二维数组
  • 增资扩股税务处罚标准
  • 报销人和经办人的含义
  • 财务负责人和法人可以一个人吗
  • 以前年度多计收入今年怎么调整
  • 出口退税没有进项就退不了税吗?
  • 现金日记账年结怎么做
  • 工程款外地预缴哪些税
  • 无形资产减值准备借贷
  • 银行汇票可用于异地结算吗
  • 非房产企业出售土地,能否计算抵减地价款
  • 什么是开办费包括
  • 财务会计与管理会计的区别与联系?谁更棒?
  • innodb.trx
  • w10 2021年更新
  • u盘重装系统电脑
  • qqexternal.exe是什么进程如何删除(CPU的使用率在90%)
  • Win10预览版拆弹
  • subss
  • cpqa1000.exe是安全进程吗 cpqa1000进程有什么作用
  • windows的气泡屏保会加速
  • mac休眠怎么设置
  • centos搭建服务器
  • ipssvc.exe - ipssvc是什么进程 有什么作用
  • win10远程桌面连接教程
  • win10系统样子
  • linux-swap
  • opengl矩形
  • dos 浏览器
  • android EditText 需要输入文本时调不出来软键盘 解决方案(亲测有效)
  • Android 使用的字体
  • Android include 标签注意点
  • jquery中常用动画方法有哪些
  • js function.call
  • 文件管理android访问限制
  • android简单app实例
  • 变更税务局三方协议
  • 土地招标拍卖挂牌
  • 新市税务所电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设