02-图像的几何变换
一、图片缩放
imageInfo:图片宽、高、通道个数等 缩放:
等比例缩放:宽高比不变
任意比例缩放:图片拉伸、非拉伸 窗体大小
实现步骤:
1,完成图像的加载,拿到图像的数据信息
2,图片的宽度、高度
3,调用resize方法完成图片的缩放功能
4,检查最终的效果图
import cv2
img = cv2.imread('E:\Jupyter_workspace\study\data/Aa.jpg',1)
imgInfo = img.shape
print(imgInfo)height = imgInfo[0]
width = imgInfo[1]
mode = imgInfo[2]# 放大和缩小 等比例缩放和非等比例缩放
dstHeight = int(height*0.5)
dstWidth = int(width*0.5)#四种常见的图片缩放方法:最近领域插值、双线性插值、图像关系重采样、立方插值
dst = cv2.resize(img,(dstHeight,dstWidth))
cv2.imshow('dst',dst)
cv2.waitKey(0)
运行结果如下:
最近领域插值:
例如:原图像的大小为1020,目标图像的大小为510
新领域的X = X * (原图像的X / 目标图像的X) = X * (10/5)
新领域的Y = Y * (原图像的Y / 目标图像的Y) = Y * (20/10)
若X或Y为小数,则保留整数部分即可
双线性插值:
A1 = 20% 上+80%下 A2
B1 = 30% 左+70%右 B2
方法一: 最终点 = A1 30% + A2 70%
方法二: 最终点 = B1 20% + B2 80%
步骤:
1,获取图片info信息,包含宽度、高度等信息
2,创建一个和缩放之后大小一样的空白模板
3,计算每个缩放过后的X和Y值
import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/zyl.png',1)
imgInfo = img.shape
height = imgInfo[0]#原图像的高度
width = imgInfo[1]#原图像的宽度
dstHeight = int(height/2)#目标图像的高度
dstWidth = int(width/2)#目标图像的宽度#创建空白模板
dstImage = np.zeros((dstHeight,dstWidth,3),np.uint8)#空白模板和目标图像的大小一样,uint8的范围为0-255#计算每个缩放过后的X和Y值
for i in range(0,dstHeight):#目标高度对应的是行for j in range(0,dstWidth):#目标宽度对应的是列iNew = int(i*(height*1.0/dstHeight))jNew = int(j*(width*1.0/dstWidth))dstImage[i,j] = img[iNew,jNew]cv2.imshow('dstImage',dstImage)
cv2.waitKey(0)
二、图片剪切
其实就算通过切片对图片截取而已
#剪切图片X坐标的100-200;Y坐标的200-300这部分的图片
import cv2
img = cv2.imread('E:\Jupyter_workspace\study\data/zyl.png',1)
imgInfo = img.shape
dst = img[100:200,200:300]
cv2.imshow('dst',dst)
cv2.waitKey(0)
三、图片位移
放射方法:
cv2.warpAffine(img,matShift,(height,width))
参数一:图片信息
参数二:当前的旋转矩阵
参数三:展示最终图片的宽高信息
API形式warpAffine仿射变换方法—左移100,右移200
import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]matShift = np.float32([[1,0,100],[0,1,200]])
dst = cv2.warpAffine(img,matShift,(height,width))cv2.imshow('dst',dst)
cv2.waitKey(0)
源码形式—右移100
import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
cv2.imshow('src',img)
imgInfo = img.shape
dst = np.zeros(img.shape,np.uint8)
height = imgInfo[0]
width = imgInfo[1]for i in range(0,height):for j in range(0,width-100):dst[i,j+100] = img[i,j]
cv2.imshow('img',dst)
cv2.waitKey(0)
[1,0,100],[0,1,200]分为22和21两个矩阵对待
[[1,0],[0,1]] 2 * 2 A
[[100],[200]] 2 * 1 B
[x,y] C
A * C + B = [[1 * x + 0 * y],[0 * x + 1 * y]]+[[100],[200]]= [[x+100],[y+200]]
(10,20)->(110,220)
四、图片镜像
实现步骤:
1,创建一个足够大的“画板”
2,将一幅图像分别从前向后、从后向前绘制
3,绘制中心分割线
import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
cv2.imshow('img',img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
deep = imgInfo[2]newImgInfo = (height*2,width,deep)#定义空白模板,为了存储图片镜像
dst = np.zeros(newImgInfo,np.uint8)for i in range(0,height):for j in range(0,width):dst[i,j] = img[i,j]#上半部分#下半部分,x值不变,y值变成了整个高度的两倍-当前y-1 即 y=2*h-y+1#x为横坐标表示宽度信息,y为纵坐标表示高度信息#x对应j,y对应idst[height*2-i-1,j] = img[i,j]for i in range(0,width):dst[height,i] = (0,0,255)#(B,G,R),给条红线以示区分cv2.imshow('dst',dst)
cv2.waitKey(0)
效果如图下:
五、图片缩放
import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
cv2.imshow('src',img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
matScale = np.float32([[0.5,0,0],[0,0.5,0]])
dst = cv2.warpAffine(img,matScale,(int(width/2),int(height/2)))
cv2.imshow('dst',dst)
cv2.waitKey(0)
效果图如下:
六、仿射变换
位移、旋转、缩放
矩阵仿射变换基本算法原理:给三个点,确定整个图片的位置
import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
cv2.imshow('img',img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]matSrc = np.float32([[0,0],[0,height-1],[width-1,0]])
matDst = np.float32([[50,50],[300,height-200],[width-300,100]])matAffine = cv2.getAffineTransform(matSrc,matDst)
dst = cv2.warpAffine(img,matAffine,(width,height))cv2.imshow('dst',dst)
cv2.waitKey(0)
七、图片旋转
旋转矩阵方法:
cv2.getRotationMatrix2D((height*0.5,width*0.5),45,1)
参数一:旋转的中心点
参数二:旋转角度
参数三:缩放系数[0,1],1表示不缩放,容易出格,一般设置为0.5
import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
cv2.imshow('src',img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]matRotate = cv2.getRotationMatrix2D((height*0.5,width*0.5),45,0.5)
#matRotate = cv2.getRotationMatrix2D((height*0.5,width*0.5),45,1)dst = cv2.warpAffine(img,matRotate,(height,width))
cv2.imshow('dst',dst)
cv2.waitKey(0)
效果图如下:
02-图像的几何变换相关推荐
- 图像处理 --- 三、图像变换 3.2 图像的几何变换
2. 图像的几何变换 图像几何变换是指用数学建模的方法来描述图像位置.大小.形状等变化.图像几何变换是图像处理及分析的基础. 图像的几何变换包括:图像平移.比例缩放.旋转和图像插值. 图像几何变换的实 ...
- youcans 的 OpenCV 学习课—5.图像的几何变换
youcans 的 OpenCV 学习课-5.图像的几何变换 本系列面向 Python 小白,从零开始实战解说 OpenCV 项目实战. 几何变换是指对图像的位置.大小.形状.投影进行变换,是将图像从 ...
- 【OpenCV 例程200篇】02. 图像的保存(cv2.imwrite)
[OpenCV 例程200篇]02. 图像的保存(cv2.imwrite) 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更 ...
- 图像处理———图像的几何变换原理及实现
图片引用这篇博客 传送门,外加自己的理解 图像的几何变换有平移.旋转.尺度(放大缩小).偏移.恒等变换等 一.几何变换的变换矩阵 学过坐标变换的应该知道这啥意思,将图像中点的坐标写成齐次坐标的形式,再 ...
- 【OpenCV图像处理】五、图像的几何变换(下)
5.1 图像的缩放变换 图像的缩放指的是将图像的尺寸变小或变大的过程,也就是减少或增加原图像数据的像素个数.简单来说,就是通过增加或删除像素点来改变图像的尺寸.当图像缩小时,图像会变得更加清晰,当图像 ...
- OpenCV计算机视觉(三) —— 图像的几何变换
图像的几何变换主要包括图像的翻转.平移.旋转.透视以及一些镜像变换.主要是对图像的大小.位置.坐标进行操作,来实现图片的几何变换. 思维导图如下: 下面将针对这五个方面进行一一讲解. 图像的翻转 主要 ...
- 图像处理之图像的几何变换
一.前言 图像的几何变换是将一幅图像中的坐标映射到另外一幅图像中的新坐标位置,它不改变图像的像素值,只是改变像素所在的几何位置,使原始图像按照需要产生位置.形状和大小的变化.本文主要介绍图像的基本几何 ...
- Halcon 第七章『图像的几何变换』◆第1节:图像的仿射变换(位置变换、形状变换)及应用
一.介绍 由于相机拍摄的时候可能存在角度偏差,因此实际获得的画面可能会与想象中有所差异.为了校正图像在拍摄中的失真问题,可以对图像进行一些简单的几何变换,如平移.缩放和旋转等,这些是图形学中的基本几何 ...
- 【数字图像处理】图像的几何变换之 图形平移与旋转
(一)基础知识 (1)常见图片几何运算 图像的几何变换主要就是一下这些. 这里只是一些最简单的函数处理 ·图像的平移变换 ·图像的镜像变换 ·图像的转置变换 ·图像的旋转变换 ·图像的缩放 这里我主要 ...
- matlab平面图形的几何变换,matlab图像的几何变换
2. 了解平移.伸缩.对称.旋转等变换. 3. 学习掌握 MATLAB 软件有 实验报告 课程名称:数学实验 实验名称:平面图形的几何变换 指导教师: 实验目的.要求: 1. ...... Matla ...
最新文章
- mysql acer_Acer电脑【no bootable device】引导修复
- mysql查询员工表中所有员工入职20个月之后的日期_Mysql基础教程
- 如何执行超过一百兆(100MB)的sql脚本?
- 用 Apache 发布 ASP.NET 网站
- OC2_点语法(属性关键字)
- 信息学奥赛一本通 1184 | 1934:【06NOIP普及组】明明的随机数 | OpenJudge NOI 1.10 09 | 洛谷 P1059 [NOIP2006 普及组] 明明的随机数
- 黑客是否可以攻击被拔掉网线的电脑?
- ZENG msgbox仿qq提示
- 使用SoapUI测试Web Service
- 多核Cache一致性 伪共享 atomic的实现和cache相关的部分
- 使用原生javaScript创建ul和li对象以及操作
- 从源码分析HashSet集合
- Excel函数公式大全—MATCH函数
- 7z解压crc错误_7-Zip - 常见问题解答(FAQ)
- 三绕组变压器参数计算matlab,三绕组变压器等值参数计算
- PC微信逆向获取聊天表情
- python sep参数_Python sep参数使用方法详解
- 计算机语言输入不见了,电脑输入法不见了怎么处理 输入法修复方法
- java筆試題,Java筆試題附答案 | 學步園
- 《linux多线程服务端编程》---- C++基础前奏
热门文章
- php 时间周期,php 的生命周期
- linux安装程序过程,linux 应用程序安装过程
- uni-app微信获取手机号,第一次解密总是失败
- angularjs 利用filter进行表单查询及分页查询
- 用 CSS 实现元素垂直居中,有哪些好的方案?
- JQ实现情人节表白程序
- Effeckt.css – CSS3 Transitions Animations 精妙应用
- vue2.0 element-ui中的el-select选择器无法显示选中的内容
- 基于React的表单开发的分析(上)
- 关于background-*的一些属性