1.縮放

主要使用 resize() 這個函式,呈現形式如下:

img_INTER_LINEAR = cv2.resize(img, (300,300), interpolation=cv2.INTER_LINEAR)

需指定整數型態的縮放倍數,如上式(300, 300)。而內插法(interpolation)預設為INTER_LINEAR(雙線性內插),可依需求更改內插法。不同內插法效果如下:

<source:Greatway9999>

程式如下:
#縮放
import numpy as np
import cv2
img = cv2.imread('Lenna.jpg')

img_resize = cv2.resize(img, (300,300)) #參數可指定欲縮放的大小,但資料型態必須為int整數
#img_resize = cv2.resize(img, None, fx = 0.94, fy = 0.94) #另一種縮放寫法,fx代表水平方向的縮放比例,fy代表垂直方向的縮放比例

img_INTER_NEAREST = cv2.resize(img, (300,300), interpolation=cv2.INTER_NEAREST)
img_INTER_LINEAR = cv2.resize(img, (300,300), interpolation=cv2.INTER_LINEAR) #預設
img_INTER_AREA = cv2.resize(img, (300,300), interpolation=cv2.INTER_AREA)
img_INTER_CUBIC = cv2.resize(img, (300,300), interpolation=cv2.INTER_CUBIC)
img_INTER_LANCZOS4 = cv2.resize(img, (300,300), interpolation=cv2.INTER_LANCZOS4)

print("img.shape=", img.shape)
print("img_resize.shape=", img_resize.shape)

cv2.imshow("original", img)
cv2.imshow("img_resize", img_resize)
cv2.imshow("img_INTER_NEAREST", img_INTER_NEAREST)
cv2.imshow("img_INTER_LINEAR", img_INTER_LINEAR)
cv2.imshow("img_INTER_AREA", img_INTER_AREA)
cv2.imshow("img_INTER_CUBIC", img_INTER_CUBIC)
cv2.imshow("img_INTER_LANCZOS4", img_INTER_LANCZOS4)

cv2.waitKey()
cv2.destroyAllWindows()


2.翻轉

主要使用 flip() 這個函式,呈現形式如下:

img_x = cv2.flip(img, 0)

img的位置代表輸入圖像,0的位置代表不同的翻轉型式(0表示繞x軸翻轉、1表示繞y軸翻轉、-1表示繞x軸y軸翻轉)。效果如下圖所示:


<source:Greatway9999>

程式如下:

#翻轉

import numpy as np

import cv2

img = cv2.imread('Lenna.jpg')


img_x = cv2.flip(img, 0) #0表示繞x軸翻轉 

img_y = cv2.flip(img, 1) #1表示繞y軸翻轉

img_xy = cv2.flip(img, -1) #-1表示繞x軸y軸翻轉


cv2.imshow("original", img)

cv2.imshow("img_x", img_x)

cv2.imshow("img_y", img_y)

cv2.imshow("img_xy", img_xy)


cv2.waitKey()

cv2.destroyAllWindows()


3.仿射

是指在幾何中,對一個向量空間進行一次線性轉換並接上一個平移,轉換為另一個向量空間。平移的效果如 "img_move"。旋轉的效果如"img_rotation"。仿射的效果如"img_Affine"。透射的效果如"img_Affine"。

<source:Greatway9999>

程式如下:

#仿射

import numpy as np

import cv2

img = cv2.imread('Lenna.jpg')

r, c = img.shape[0:2] #不取channel數


#平移:沿x軸平移50單位,沿y軸平移70個單位

x = 50

y = 70

M = np.float32([[1, 0 ,x], [0, 1, y]])

img_move = cv2.warpAffine(img, M, (r, c)) #參數順序依序為輸入圖像、轉換矩陣、輸出影像大小


cv2.imshow("original", img)

cv2.imshow("img_move", img_move)


#旋轉

rotation_M = cv2.getRotationMatrix2D((r/2, c/2), 60, 1) #參數順序依序為旋轉中心、旋轉角度(正數表示逆時針旋轉)、縮放比例

img_rotation = cv2.warpAffine(img, rotation_M, (r, c))

cv2.imshow("img_rotation", img_rotation)


#圖像仿射

pos1 = np.float32([[0,0], [0, 100], [100, 0]])

pos2 = np.float32([[10,10], [0, 80], [70, 0]])

M_Affine = cv2.getAffineTransform(pos1,pos2) #取得轉換矩陣。pos1代表輸入影像的三點座標,pos2代表輸出影像的三點座標

img_Affine = cv2.warpAffine(img, M_Affine, (r, c))

cv2.imshow("img_Affine", img_Affine)


#圖像透射

pos3 = np.float32([[0,0], [0, 100], [100, 0], [100, 100]])

pos4 = np.float32([[10,10], [0, 80], [70, 0], [80, 50]])

M_Perspective = cv2.getPerspectiveTransform(pos3,pos4) #取得轉換矩陣。pos3代表輸入影像的四點座標,pos4代表輸出影像的四點座標

img_Perspective = cv2.warpPerspective(img, M_Perspective, (r, c))

cv2.imshow("img_Perspective", img_Perspective)


cv2.waitKey()

cv2.destroyAllWindows()


4.重映射

把圖像中某位置的像素放置到另一個圖片指定位置的過程,使用 remap() 函式。

  • 複製影像的效果如 "img_copy"。
  • 繞x軸翻轉的效果如"img_flip_x"。
  • 繞y軸翻轉的效果如"img_flip_y"。
  • x、y軸互換的效果如"img_xy_change"。
  • 縮放的效果如"img_resize"。

<source:Greatway9999>

程式如下:

#重映射

import numpy as np

import cv2

img = cv2.imread('Lenna.jpg')

r, c = img.shape[0:2] #不取channel數


mapx = np.zeros(img.shape[0:2], dtype = np.float32)

mapy = np.zeros(img.shape[0:2], dtype = np.float32)


#複製影像

for i in range(r):

    for j in range(c):

        mapx.itemset((i,j),j)

        mapy.itemset((i,j),i)


img_copy = cv2.remap(img, mapx, mapy, interpolation=cv2.INTER_LINEAR)        


#cv2.imshow("original", img)

cv2.imshow("img_copy", img_copy)


#繞x軸翻轉

for i in range(r):

    for j in range(c):

        mapx.itemset((i,j),j)

        mapy.itemset((i,j),r-1-i) #對稱關係存在 "目前列號+對稱列號=總列數-1"


img_flip_x = cv2.remap(img, mapx, mapy, interpolation=cv2.INTER_LINEAR) 

cv2.imshow("img_flip_x", img_flip_x)


#繞y軸翻轉

for i in range(r):

    for j in range(c):

        mapx.itemset((i,j),c-1-j) #對稱關係存在 "目前行號+對稱行號=總行數-1"

        mapy.itemset((i,j),i) 


img_flip_y = cv2.remap(img, mapx, mapy, interpolation=cv2.INTER_LINEAR) 

cv2.imshow("img_flip_y", img_flip_y)


#繞x軸y軸翻轉

for i in range(r):

    for j in range(c):

        mapx.itemset((i,j),c-1-j) #對稱關係存在 "目前行號+對稱行號=總行數-1"

        mapy.itemset((i,j),r-1-i) #對稱關係存在 "目前列號+對稱列號=總列數-1"


img_flip_xy = cv2.remap(img, mapx, mapy, interpolation=cv2.INTER_LINEAR) 

cv2.imshow("img_flip_xy", img_flip_xy)


#x、y軸互換

for i in range(r):

    for j in range(c):

        mapx.itemset((i,j),i)

        mapy.itemset((i,j),j)


img_xy_change = cv2.remap(img, mapx, mapy, interpolation=cv2.INTER_LINEAR)        

cv2.imshow("img_xy_change", img_xy_change)


#縮放

for i in range(r):

    for j in range(c):

        mapx.itemset((i,j),2*(j-c*0.25)+0.5)

        mapy.itemset((i,j),2*(i-r*0.25)+0.5)


img_resize = cv2.remap(img, mapx, mapy, interpolation=cv2.INTER_LINEAR)        

cv2.imshow("img_resize", img_resize)


cv2.waitKey()

cv2.destroyAllWindows()


---

參考資料:

0 留言