一、图片缩放
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)
效果图如下: