1. 程式人生 > >4 用python進行OpenCV實戰之影象變換1(平移)

4 用python進行OpenCV實戰之影象變換1(平移)

前言

到目前為止,經過前幾節的介紹,我們已經有了一個堅實的基礎去做一些影象處理,在本節我們先將介紹影象變換中的平移,為後面幾節學習影象變換中的旋轉、改變大小、映象、裁剪打下一個好的基礎

1 平移

1.1 平移基本操作

新建

translation.py

平移的意思就是將影象沿著x軸、y軸移到,我們可以進行上下左右等各個方向的移動。

# -*- coding: utf-8 -*-
import numpy as np #1
import argparse #2
import imutils #3
import cv2 #4

ap = argparse.ArgumentParser
() #5 ap.add_argument("-i", "--image", required=True, help="Path to the image") #6 args = vars(ap.parse_args()) #7 image = cv2.imread(args["image"]) #8 cv2.imshow("原始圖片", image) #9 M = np.float32([[1, 0, 25], [0, 1, 50]]) #10 shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape
[0])) #11 cv2.imshow("Shifted Down and Right", shifted) #12 M = np.float32([[1, 0, -50], [0, 1, -90]]) #13 shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0])) #14 cv2.imshow("Shifted Up and Left", shifted) #15 shifted = imutils.translate(image, 0, 100) #16 cv2.imshow("Shifted down", shifted) #17
cv2.waitKey(0) #18

#1-9:
與前幾節一樣的操作,進行導包,然後顯示原始圖片,但是需要注意的是在第三行 import imutils,這裡的imutils是什麼呢?這不是一個OpenCV或者NumPy的包,而是我們自己寫的一個庫,裡面包含了諸如平移、旋轉等操作的方法,以便於我們使用起來更加的方便,具體將在後面進行詳細介紹。

#10:

M = np.float32([[1, 0, 25], [0, 1, 50]]) #10

我們通過NumPy定義了一個平移矩陣M,它將決定我們我們將平移多少畫素,我們的矩陣是定義成的浮點形式,這在OpenCV中至關重要的。
平移矩陣
在矩陣第一行中表示的是[1,0,x],其中x表示影象將向左或向右移動的距離,如果x是正值,則表示向右移動,如果是負值的話,則表示向左移動。
在矩陣第二行表示的是[0,1,y],其中y表示影象將向上或向下移動的距離,如果y是正值的話,則向下移動,如果是負值的話,則向上移動。為什麼呢?還記得我們前幾節說過的OpenCV的影象座標系麼?
OpenCV影象座標系
所以第10行的程式碼表示我們將向右移動25pix,向下移動50pix(pix表示畫素)。
#11-12:
在第11行我們的呼叫了cv2.warpAffine()方法,這是進行一個仿射變換,至於什麼是仿射變換?簡單的說就是:“線性變換”+“平移”,深入瞭解點這裡

shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0])) #11

其中第一個引數表示我們希望進行變換的圖片,第二個引數是我們的平移矩陣,第三個希望展示的結果圖片的大小,這裡保持和原始圖片一樣大小。然後我們將變換後的圖片顯示出來。

#13-15:
與上面的變換方式是一樣的,但是你是向上和向左移動

#16-18:
在第16行我們使用了:imutils這個自己寫的庫,然後呼叫了translate()方法。第一個引數是需要操作的影象,第二個引數是在x軸上平移,第三個引數是在y軸上平移。

shifted = imutils.translate(image, 0, 100) #16

1.2 自寫的變換函式庫

我們為了在translation.py中匯入使用imutils,我們需要在translation.py的同一個目錄下新建

imutils.py

在其中寫入如下程式碼:

import numpy as np #1
import cv2 #2

def translate(image, x, y): #3
    M = np.float32([[1, 0, x], [0, 1, y]]) #4
    shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0])) #5
    return shifted #6

#1-2:
匯入使用的包

#3-6:
我們定義了一個translate函式,在這個函式中我們只是將平移的操作寫在裡面了,然後返回了平移之後的結果shifted,通過這個例子,我們是不是感受到了封裝的力量?不管你有沒有,反正我是有。這樣當我再在translation.py中要對影象進行變換時候是不是將很方便了?敲黑板:這個imutils.py我們將在後面的幾個變換操作中,都會用到,也會將其他變換的操作,都封裝在裡面。

2 效果展示

平移效果展示