圖像處理之幾何變換


圖像處理之幾何變換

(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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM