前言
到目前為止,經過前幾節的介紹,我們已經有了一個堅實的基礎去做一些圖像處理,在本節我們先將介紹圖像變換中的平移,為后面幾節學習圖像變換中的旋轉、改變大小、鏡像、裁剪打下一個好的基礎
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的圖像坐標系么?
所以第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 效果展示
轉載請注明出處:
CSDN:樓上小宇__home:http://blog.csdn.net/sty945
簡書:樓上小宇:http://www.lxweimin.com/u/1621b29625df