图像的简单几何变换
先看一下关于图像几何变换的简介:
几何变换不改变图像的像素值,只是在图像平面上进行像素的重新安排。
适当的几何变换可以最大程度地消除由于成像角度、透视关系乃至镜头自身原因所造成的几何失真所产生的负面影响。有利于我们在后续的处理和识别工作中将注意力集中子图像内容本身,更确切地说是图像中的对象,而不是该对象的角度和位置等。几何变换常常作为图像处理应用的预处理步骤,是图像归一化的核心工作之一。
一个几何变换需要两部分运算:首先是空间变换所需的运算,如平移、缩放、旋转和正平行投影等,需要用它来表示输出图像与输入图像之间的(像素)映射关系;此外,还需要使用灰度差值算法,因为按照这种变换关系进行计算,输出图像的像素可能被映射到输入图像的非整数坐标上。更多
© Fu Xianjun. All Rights Reserved.
案例一: 图像缩放
import cv2
import numpy as np
img=cv2.imread("pig.jpg")
rows,cols,_ = img.shape
#第一种缩放方式
size1 = (int(rows*0.9),int(cols*0.8))#宽变成0.9倍,长变成0.8倍
img_resize1 = cv2.resize(img,size1)
#第二种缩放方式
img_resize2 = cv2.resize(img,None,fx=2,fy=1.5)#宽变成两倍,长变成1.5倍
cv2.imshow("SRC",img)
cv2.imshow("RESIZE1",img_resize1)
cv2.imshow("RESIZE2",img_resize2)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果图
案例二 图像翻转
img_flip2=cv2.flip(img,-1)#x,y轴同时翻转
cv2.imshow("FLIP2",img_flip2)
img_flip3=cv2.flip(img,1)#y轴翻转
cv2.imshow("FLIP3",img_flip3)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果图
案例三 图像仿射变换
平移:
rows,cols,_ = img.shape
x = 100
y = 200
M = np.float32([[1,0,x],[0,1,y]])#转换矩阵
img_move=cv2.warpAffine(img,M,(cols,rows))#平移操作,注意(cols,rows)
cv2.imshow("MOVE",img_move)
cv2.waitKey(0)
cv2.destroyAllWindows()
旋转:
语法:
retval = cv2.getRotationMatrix2D(center,anle,scale)
center:旋转中心
angle:旋转角度,正数为逆时针旋转,负数为顺时针旋转
scale:缩放大小
height,width,_ = img.shape
M = cv2.getRotationMatrix2D((width/2, height/2), 45, 0.6)
img_rotate=cv2.warpAffine(img,M,(width, height))#平移操作
cv2.imshow("ROTATE",img_rotate)
cv2.waitKey(0)
cv2.destroyAllWindows()
案例四 透视
语法1:
转换矩阵 M = cv2.getPerspectiveTransform(pts_o, pts_d)
pts_o为原始4个点坐标
pts_d为变换后4个点坐标
语法2:
dst = cv2.warpPerspective(img, M, dsize)
img为原图
dst为变换后的图
M为转换矩阵
dsize为变换后图像的大小
#读图
img = cv2.imread('shudu.jpg')
rows, cols,_ = img.shape
# 原始点阵
pts_o = np.float32([[88, 177], [716, 85], [216, 695], [957, 551]]) # 这四个点为原始图片上数独的位置
pts_d = np.float32([[0, 0], [600, 0], [0, 600], [600, 600]]) # 这是变换之后的图上四个点的位置
# 获取转换矩阵
M = cv2.getPerspectiveTransform(pts_o, pts_d)
#应用变换
dst = cv2.warpPerspective(img, M, (600, 600)) # 最后一参数是输出dst的尺寸。可以和原来图片尺寸不一致。按需求来确定
cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像通过透视变换矫正
#读图
img = cv2.imread('lianxi.png')
rows, cols = img.shape[:2]
#原始点阵
pts_o = np.float32([[45, 180], [220, 80], [60, 290], [270, 190]]) # 这四个点为原始图片上数独的位置
pts_d = np.float32([[0, 0], [200, 0], [0, 100], [200, 100]]) # 这是变换之后的图上四个点的位置
#获取转换矩阵
M = cv2.getPerspectiveTransform(pts_o, pts_d)
#应用变换
dst = cv2.warpPerspective(img, M, (200, 100)) # 最后一参数是输出dst的尺寸。可以和原来图片尺寸不一致。按需求来确定
cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果图