图像处理入门四

图像处理入门四

1.图像几何变换之平移缩放旋转

(1)图像几何变换
几何变换常常作为图像处理应用的预处理步骤,是图像归一化的核心工作之一。在几何变换中会在原像素和变换后的像素间建立一种映射关系,通过这种关系,可以计算出图像像素的坐标位置(分为向前映射和向后映射)。一个几何变换需要两部分运算:
**空间变换:**包括平移、缩放、旋转和正平行投影等,需要用它来表示输出图像与输入图像之间的像素映射关系。
**灰度插值算法:**按照这种变换关系进行计算,输出图像的像素可能被映射到输入图像的非整数坐标上。
图像处理入门四_第1张图片
对图像而言就是把连续的图像离散化,通过数学方法对它进行变换(主要是矩阵运算)。像素的坐标是离散型非负整数,但是在进行变换的过程中有可能产生浮点坐标值。这在图像处理中是一个无效的坐标。为了解决这个问题需要用到插值算法。常见算法如下:
~ 最近邻插值
~ 双线性插值
~ 双立方插值
(2)图像平移
原矩阵 X M(变换矩阵)
result=cv2.warpAffine(scr,M,(cols,rows))
X:水平平移量,Y:垂直平移量
M = np.float32([[1, 0, x], [0, 1, y]])
图像处理入门四_第2张图片

import cv2
import numpy as np
#读取图片
scr=cv2.imread('scecery.png')
#图像平移矩阵
M=np.float32([[1,0,100],[0,1,50]])
#获取原始图像列数和行数
rows,cols=scr.shape[:2]
#图像平移
result=cv2.warpAffine(scr,M,(cols,rows))
#显示图像
cv2.imshow('original',scr)
cv2.imshow('result',result)
#等待显示
cv2.waitKey(0)
cv2.destoryAllwindows()

图像处理入门四_第3张图片
下面一个案例是将图像分别向下、向上、向右、向左平移,再调用 matplotlib绘图库依次绘制的过程

import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图片
img=cv2.imread('scenery.png')
image=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#图像平移
#垂直方向 向下平移100
M=np.float32([[1,0,0],[0,1,100]])
img1=cv2.warpAffine(image,M,(image.shape[1],image.shape[0]))
#垂直方向 向上平移100
M=np.float32([[1,0,0],[0,1,-100]])
img2=cv2.warpAffine(image,M,(image.shape[1],image.shape[0]))
#水平方向 向右平移100
M=np.float32([[1,0,100],[0,1,0]])
img3=cv2.warpAffine(image,M,(image.shape[1],image.shape[0]))
#水平方向 向左平移100
M=np.float32([[1,0,-100],[0,1,0]])
img4=cv2.warpAffine(image,M,(image.shape[1],image.shape[0]))
#循环显示图片
titles=['image1','image2','image3','image4']
images=[img1,img2,img3,img4]
for i in range(4):
	plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
	plt.title(titles[i])
	plt.xticks([]),plt,yticks([])
plt.show()

图像处理入门四_第4张图片
(3) 图像缩放
result = cv2.resize(src, dsize[, result[. fx[, fy[, interpolation]]]]) 。常见的图像缩放两种方式如下所示,第一种方式是将原图像设置为(160, 160)像素大小,第二种方式是将原始图像缩小为 0.5 倍。
result = cv2.resize(src, (160,160))
result = cv2.resize(src, None, fx=0.5, fy=0.5)
图像处理入门四_第5张图片

import cv2
import numpy as np
#读取图片
src=cv2.imread('scenery.png')
rows,cols=scr.shape[:2]
print(rows,cols)

#图像缩放-方法1
result1=cv2.resize(scr,(200,100)) #先列后行
print(result.shape)
# 图像缩放-方法2(原始图像像素乘以缩放系数)
result2=cv2.resize(scr,(int(cols*0.6),int(rows*1.2)))
# 调用(fx,fy)参数设置缩放倍数,对原始图像进行放大或缩小操作
result3=cv2.resize(scr,None,fx=0.3,fy=0.3)

#显示图像
cv2.imshow('original',src)
cv2.imshow('result1',result1)
cv2.imshow('result2',result2)
cv2.imshow('result3',result3)
#等待显示
cv2.waitKey(0)
cv2.destoryAllWindows()

(4)图像旋转

import cv2
import numpy as np
#读取图片
scr=cv2.imread('scenery.png')
#源图像的高、宽以及通道数
rows,cols,channel=scr.shape

#绕图像的中心旋转
#函数参数:旋转中心 旋转度数 scale(逆时针旋转)
M=cv2.getRotationMatrix2D((cols/2,rows/2),30,1)
#函数参数:原始图像 旋转参数 元素图像宽高
rotated=cv2.warpAffine(scr,M,(cols,rows))

#显示图像
cv2.imshow('scr',scr)
cv2.imshow('rotated1',rotated1)
#等待显示
cv2.waitKey(0)
cv2.destoryAllWindows()

2.图像几何变换之镜像仿射透视

(1)图像镜像(水平镜像/垂直镜像)
dst = cv2.flip(src, flipCode)
flipCode表示翻转方向,flipCode=0–X轴对称翻转,>0–Y轴对称翻转,<0在X轴、Y轴方向同时翻转

import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图片
img=cv2.imread('scenery.png')
scr=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#图像翻转
img1=cv2.flip(scr,0)
img2=cv2.flip(scr,1)
img3=cv2.flip(scr,-1)
#显示图像
titles=['Source','img1','img2','img3']
images=[scr,img1,img2,img3]
for i in range(4):
	plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
	plt.title(titles[i])
	plt.xticks([]),plt.yticks([])
plt.show()

图像处理入门四_第6张图片
(2)图像仿射
cv2.getAffineTransform(pos1,pos2)–pos1,2是变换前后的对应位置关系
cv2.warpAffine(src, M, (cols, rows)) 实现图像仿射变换, (cols, rows)表示变换后的图像大小

import cv2
import matplotlib.pyplot as plt
#读取图片
src=cv2.imread('scenery.png')
#获取图像大小
rows,cols=src.shape[:2]

#设置图像仿射变换矩阵
pos1=np.float32([[50,50],[200,50],[50,200]])
pos2=np.float32([[10,100],[200,50],[100,250]])
M=cv2.getAffine Transform(pos1,pos2)

#图像的仿射变换
result=cv2.warpAffine(src,M,(cols,rows))

#显示图像
cv2.imshow('orignal',src)
cv2.imshow('result',result)
#等待显示
cv2.waitKey(0)
cv2.destoryAllWindows()

图像处理入门四_第7张图片

(3)图像透视
M=cv2.getPerspectiveTransform(pos1,pos2)
cv2.warpPerspective(scr,M,(cols,rows))

import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图片
src=cv2.imread('paper.png')
#获取图像大小
rows,cols=src.shape[:2]

#设置图像透视变换矩阵
pos1=np.floa32([[114,82],[287,156],[216,333]])
pos2=np.float32([[0,0],[188,0],[0,262],[188,262]])
M=cv2.getPerspectiveTransform(pos1,pos2)

#图像透视变换
result=cv2.warpPerspective(scr,M,(190,272))
#显示图像
cv2.imshow('orignal',src)
cv2.imshow('result',result)
#等待显示
cv2.waitKey(0)
cv2.destoryAllWindows()

图像处理入门四_第8张图片
图像处理入门四_第9张图片

你可能感兴趣的:(图像处理,图像处理,opencv,python)