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)

效果图如下:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微机原理——8086中断类型以及中断向量表、中断响应、中断返回

博主联系方式: QQ:1540984562 QQ交流群:892023501 群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。 目录先验知识回顾控制寄存器回顾1、8086中断类型1、外部可屏蔽中断2、外部不可屏蔽…

资料整理-工具篇

* 代码利器 Resharper 作为一个C#er,非常感谢有Resharper这样的代码利器。在VS系列的IDE中,使用Resharper后,你会发现,原来写代码也可以是一种享受! 1. 首先,下载Resharper。下载地址:http://ww…

企业级php第三方支付平台,ThinkPHP新版企业级php第三方api第四方支付平台程序源码商业版 带接口文件等 某宝售价3000元...

本帖最后由 商业源码网 于 2017-12-21 11:23 编辑7 h$ . , C u0 R3 R y$ z! ] q( D D$ s( Y源码说明:) G: y; R# G0 0 g N. ; \0 w, A9 {5 # P今天黑锐给大家分享给好东西!很不错的支付系统!喜欢研究支付接口的朋友别错过!ThinkP…

OpenCV实战【2】HOG+SVM实现行人检测

目录HOG是什么?HOG vs SIFTHOG步骤HOG在检测行人中的方式Opencv实现HOGDescriptor的构造函数:行人检测HOGSVM步骤简化版的HOG计算HOG是什么? 方向梯度直方图( Histogram of Oriented Gradient, HOG )特征是一种在计算机视觉和图像处理中用来进…

03-图像特效

一、灰度处理 方法一:imread方法 彩色图的颜色通道为3,即RGB;而灰度图只有一个颜色通道。 import cv2 img0 cv2.imread(E:\Jupyter_workspace\study\data/cat.png,0) img1 cv2.imread(E:\Jupyter_workspace\study\data/cat.png,1) print…

解析linux根文件系统的挂载过程

------------------------------------------ 本文系本站原创,欢迎转载!转载请注明出处:http://ericxiao.cublog.cn/------------------------------------------ 一:前言前段时间在编译kernel的时候发现rootfs挂载不上。相同的root选项设置旧版的image却可以。为了…

SIFT讲解(SIFT的特征点选取以及描述是重点)

目录SIFT是什么?尺度空间理论SIFT特征点提取SIFT特征点描述SIFT是什么? SIFT ,即尺度不变特征变换( Scale-invariant feature transform,SIFT) ,一种特征描述方法。具有 尺度鲁棒性 旋转鲁棒性 光照鲁棒性 SIFT本身包括了特征点筛选及特征点…

操作系统多线程实现_操作系统中的线程实现

操作系统多线程实现Each process has an address space. There is one thread of control in every traditional OS. Sometimes, it is viable to have multiple threads of control in the similar address space which is running in quasi-parallel. Though they were separ…

04-图像的形状绘制

一、线段绘制 cv2.line(dst,(100,100),(400,400),(0,0,255),2,cv2.LINE_AA) 参数一:目标图片数据 参数二:当前线段绘制的起始位置(也就是两点确定一条直线) 参数三:当前线段绘制的终止位置(也就是两点确定…

(1-e^(-j5w))/(1-e^(-jw))=e^(-j2w)*sin(5w/2)/sin(w/2)的证明过程

问题出现:《数字信号处理第三版》第90页刘顺兰版 最后一步怎么得到的? 思路:观察答案,有一个自然对数项。关键就是如何提取出这一项。 我的证明过程如下: 参考链接: 【和差化积】

05-图像的美化

一、彩色图片直方图 cv2.calcHist([image],[0],None,[256],[0.0,255.0]) 该方法的所有参数都必须用中括号括起来!!! 参数一:传入的图片数据 参数二:用于计算直方图的通道,这里使用的是灰度直方图&#xff…

Eclipse for android 中设置java和xml代码提示功能(转)

1、设置 java 文件的代码提示功能 打开 Eclipse 依次选择 Window > Preferences > Java > Editor - Content Assist > Auto activation triggers for Java ,设置框中默认是一个点, 现在将它改为: 以下为引用内容: .a…

如何利用FFT(基2时间以及基2频率)信号流图求序列的DFT

直接用两个例子作为模板说明: 利用基2时间抽取的FFT流图计算序列的DFT 1、按照序列x[k]序号的偶奇分解为x[k]和x2[k],即x1[k]{1,1,2,1}, x2[k]{-1,-1,1,2} 2、画出信号流图并同时进行计算 计算的时候需要参考基本蝶形单元: 关键在于 (WN) k…

matlab4.0,matlab 4.0

4.1fort-9:0.5:9if(t>0)y-(3*t^2)5;fprintf(y%.2ft%.2f\n,y,t);elsey(3*t^2)5;fprintf(y%.2ft%.2f\n,y,t);endend编译结果:y248.00t-9.00y221.75t-8.50y197.00t-8.00y173.75t-7.50y152.00t-7.00y131.75t-6.50y113.00t-6.00y95.75t-5.50y80.00t-5.00y65.75t-4.50y…

图形学 射线相交算法_计算机图形学中的阴极射线管

图形学 射线相交算法阴极射线管 (Cathode Ray Tube) Ferdinand Barun of Strasbourg developed the cathode ray tube in the year 1897. It used as an oscilloscope to view and measure some electrical signals. But several other technologies exist and solid state mov…

Constructor总结

一个类如果没有构造那么系统为我们在背后创建一个0参数的构造,但是一旦我们创建了但参数的构造,那么默认的构造就没了。 View Code 1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 6 namespace Console…

Python连接MySQL及一系列相关操作

一、首先需要安装包pymysql(python3所对应) 我使用的是Anaconda全家桶,打开cmd,进入Anaconda下的Scripts文件夹下输入命令:pip install pymysql进行下载安装 二、我使用的编译器为Anaconda所带的Jupyter Notebook 1,在mysql中…

微机原理—可编程计数器/定时器8253概念详解

目录前言【1】定时处理方法1、定时的方法:2、定时和计数器【2】8253计数/定时器1、特点:2、芯片引脚以及电路:3、连接方式:4、工作原理:5、寄存器配置a、初始化操作(三个通道单独初始化)b、读出…

形参与实参在函数中的传递

#include <iostream> #include <cstring> using namespace std; void myFun(int a[]); int main() {int a[10];cout<<"aaa"<<sizeof(a)<<endl;//40 int为4&#xff0c;a为10个int&#xff0c;故为40cout<<"yy"<<…

带你走进缓存世界

我们搞程序的多多少少都了解点算法。总体来讲&#xff0c;算法是什么&#xff1f;算法就是“时间”和“空间”的互换策略。我们常常考究一个算法的时间复杂度或空间复杂度&#xff0c;如果我们有绝对足够的时间或空间&#xff0c;那么算法就不需要了&#xff0c;可惜这种条件是…