圖像處理之幾何變換
(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)