图像处理之几何变换

图像处理之几何变换

(1)图片缩放

1.图片缩放1

# 缩放其实顾名思义就是改变图片的宽度和高度,可以放大和缩小等等
# 1.加载图片load   2.获取图片的信息info  3.调用resize方法,改变图片的宽度和高度  4.检查最终的结果check
import tensorflow as tf
import cv2
# 以彩色图片的形式加载图片,读取图片。
img = cv2.imread('image0.JPG',1)

# 获取图片的info信息,这是一个三维的矩阵
imgInfo = img.shape
print(imgInfo)  # (547, 730, 3) 输出图片的信息info  547是表示高度  730是表示宽度  3是表示颜色组成方式
height = imgInfo[0] # 获取图片的高
width = imgInfo[1] # 获取图片的宽
mode = imgInfo[2] # 获取图片的颜色组成方式

print(height)
print(width)
print(mode)

# 1.放大 缩小  2 等比例  非等比例 
# 对于同一个原始图片来说,如果原始图片的宽高乘以了同一个系数,那么这个是等比例的缩放。
# 如果不是乘以同一个系数,那么这个不是等比例缩放。
dstHeight = int(height*0.5)
dstWidth = int(width*0.5)

print(dstHeight)
print(dstWidth)
# 最近临域插值  双线性插值  像素关系重采样  立方插值
dst = cv2.resize(img,(dstHeight,dstWidth))
cv2.imshow('image',dst)
cv2.waitKey(0)
# 输出的结果为:
# (547, 730, 3)

# 547
# 730
# 3

# 273
# 365

实现的结果为:

2.图片缩放2

1)最近临域插值

理解最近临域插值  双线性插值的原理

1.先看一下最近临域插值法
src 10*20  -->dst 5*10 
dst <--src  目标图像的每一个点其实都来自于原图像。我们可以用原图像的每一个点来表示原图像的每一个点。
例如目标图像的(1,2),可以用原图像的(2,4)来表示   (1,2)<-(2,4)  目标图像的每一个点其实都是来至于原图像。
dst x -> src x  2    计算newX
newX = src x*(src 行/dst 行)    newX=1*(10/5)=2
newY = src y*(src 列/dst 列)    newX=2*(20/10)=4
有时候我们取出来的值不是整数,例如是12.3,那么我们就取离12.3最近的值12。这个就是我们说的最近临域插值法。

使用代码实现最近临域插值。

# 使用代码实现上面的步骤
# 1.info 2.空白模板 3.x y
import cv2
import numpy as np
img = cv2.imread('image0.JPG',1)# 这里的img是一个数组,读取图片。
imgInfo = img.shape
print(imgInfo) # (547, 730, 3)
Height = imgInfo[0]
Width = imgInfo[1]
mode = imgInfo[2]
# print(Height)# 547
# print(Width)# 730
# print(mode)# 3

dstHeight =  int(Height/2)
dstWidth = int(Width/2)

dstImage = np.zeros((dstHeight,dstWidth,3),np.uint8) # 0-255
# print(dstImage)
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('dst',dstImage)
cv2.waitKey(0)

实现的结果为:

2)双线性插值的原理

# 2.再看一下双线性插值的原理
# 对A1 = 20% X上面的点 +80%X下面的点  A2 = 20% X上面的点 +80%X下面的点
# 对B2 = 30% X左面的点 +70%X右面的点  B2 = 30% X左面的点 +70%X右面的点 
# 最终点的求值有两种方法。
# 1.A = A1*30% + A2*70%
# 2.B = B1*20% + B2*80%

3.图片缩放3

通过矩阵的变化实现图片的缩放。

# 使用矩阵实现图片的缩放
import cv2
import numpy as np
img = cv2.imread('image0.JPG',1)
cv2.imshow('src',img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]

matshift = np.float32([[0.5,0,0],[0,0.5,0]])

dst = cv2.warpAffine(img,matshift,(int(height/2),int(width/2)))

cv2.imshow('dst',dst)
cv2.waitKey(0)

(2)图片剪切

如下图所示,图片的剪切效果图如下所示。

# 图片的剪切
# 100 -》200 y
# 100 -》300 x
import cv2
img = cv2.imread('image0.JPG',1)
imgInfo = img.shape
dst = img[100:200,100:300]
cv2.imshow('image',dst)
cv2.waitKey(0)

实现的结果为:

(3)图片移位

1.图片移位1

# 1.opencv api实现图片移位  2.算法原理  3.源代码实现
import cv2
import numpy as np
img = cv2.imread('image0.JPG',1)
cv2.imshow('src',img)
imgInfo = img.shape
print(imgInfo)# (547, 730, 3)
height = imgInfo[0]
width = imgInfo[1]
###
matShift = np.float32([[1,0,100],[0,1,200]]) # (2,3)
print(matShift)
dst = cv2.warpAffine(img,matShift,(height,width)) # 参数1:原始图片的data信息img。
# 参数二:移位矩阵 参数三:图片的宽度和高度,图片的info信息。最后显示的图片的宽度和高度
# 当前行数的功能是完成图片的移位,进行的是矩阵的运算
cv2.imshow('dst',dst)
cv2.waitKey(0)
# 在水平方法移动100个像素,在竖直方向移动200个像素。

# 输出的结果为:
# (547, 730, 3)
# [[  1.   0. 100.]
#  [  0.   1. 200.]]

实现的结果为:

以上代码的原理分析。

# 图像移位的算法原理
# 移位矩阵 [1,0,100],[0,1,200]  把这个矩阵分为两个部分:一个是两行两列的矩阵2*2  一个是两行一列的矩阵2*1
# 将一个2*3的矩阵分为两个矩阵,一个是2*2的矩阵,一个是2*1的矩阵
# [[1,0],[0,1]]   2*2  A
# [[100],[200]]  2*1   B


# 输入的xy 为C。这里的xy是原图像的位置。

# A*C + B = 移位之后的矩阵 [[1*x+0*y],[0*x+1*y]] + [[100],[200]] = [[1*x+0*y+100],[0*x+1*y+100]] = [[x+100],[y+200]]


# (10,20) - >(110,120)这样新的点,就相当于x加上100,和y加上100

2.图片移位2

# 使用代码实现图片移位的算法
import cv2
import numpy as np
img = cv2.imread('image0.JPG',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):
        # 这里的width-100表示的是移动不会是的图片的宽度变大,依然保持原图片的大小。还是一样的宽和高。
        dst[i,j+100] = img[i,j]
cv2.imshow('image',dst)
cv2.waitKey(0)

实现的结果为:

(4)图片镜像

我们可以看出如下所示的图片显示,我们就可以看出图片镜像的含义。

# 图片的镜像
import cv2
import numpy as np
img = cv2.imread('image0.JPG',1)
cv2.imshow('src',img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
deep = imgInfo[2]

newImgInfo = (height*2,width*2,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 = 2*h -y-1
        dst[height*2-i-1,j]=img[i,j]
for i in range(0,width):
    dst[height,i] = (0,0,255) # BGR
cv2.imshow('dst',dst)
cv2.waitKey(0)

实现的结果为:

(5)图片仿射变化

矩阵的仿射变化过程如下所示:

import cv2
import numpy as np
img = cv2.imread('image0.JPG',1)
imageInfo = img.shape
height = imageInfo[0]
width = imageInfo[1]
mode = imageInfo[2]

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,(height,width))
cv2.imshow('dst',dst)
cv2.waitKey(0)

(6)图片的旋转

import cv2
import numpy as np

img = cv2.imread('image0.JPG',1)
imageInfo = img.shape
height = imageInfo[0]
width = imageInfo[1]
mode = imageInfo[2]
matRotate = cv2.getRotationMatrix2D((height*0.5,width*0.5),45,0.5)
# 参数一:Point2f center:表示旋转的中心点
# 参数二:double angle:表示旋转的角度
# 参数三:double scale:图像缩放因子
dst = cv2.warpAffine(img,matRotate,(height,width))
cv2.imshow('dst',dst)
cv2.waitKey(0)

posted @ 2020-07-05 21:44  AndreasZhou  阅读(1264)  评论(1编辑  收藏  举报