前言
到目前為止速梗,經(jīng)過前幾節(jié)的介紹,我們已經(jīng)有了一個(gè)堅(jiān)實(shí)的基礎(chǔ)去做一些圖像處理枚碗,在本節(jié)我們先將介紹圖像變換中的平移钞啸,為后面幾節(jié)學(xué)習(xí)圖像變換中的旋轉(zhuǎn)几蜻、改變大小喇潘、鏡像、裁剪打下一個(gè)好的基礎(chǔ)
1 平移
1.1 平移基本操作
新建
translation.py
平移的意思就是將圖像沿著x軸梭稚、y軸移到颖低,我們可以進(jìn)行上下左右等各個(gè)方向的移動(dòng)。
# -*- 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:
與前幾節(jié)一樣的操作弧烤,進(jìn)行導(dǎo)包忱屑,然后顯示原始圖片,但是需要注意的是在第三行 import imutils,這里的imutils是什么呢暇昂?這不是一個(gè)OpenCV或者NumPy的包莺戒,而是我們自己寫的一個(gè)庫,里面包含了諸如平移急波、旋轉(zhuǎn)等操作的方法从铲,以便于我們使用起來更加的方便,具體將在后面進(jìn)行詳細(xì)介紹澄暮。
#10:
M = np.float32([[1, 0, 25], [0, 1, 50]]) #10
我們通過NumPy定義了一個(gè)平移矩陣M名段,它將決定我們我們將平移多少像素,我們的矩陣是定義成的浮點(diǎn)形式泣懊,這在OpenCV中至關(guān)重要的伸辟。
在矩陣第一行中表示的是[1,0,x],其中x表示圖像將向左或向右移動(dòng)的距離,如果x是正值馍刮,則表示向右移動(dòng)信夫,如果是負(fù)值的話,則表示向左移動(dòng)卡啰。
在矩陣第二行表示的是[0,1,y],其中y表示圖像將向上或向下移動(dòng)的距離静稻,如果y是正值的話,則向下移動(dòng)碎乃,如果是負(fù)值的話姊扔,則向上移動(dòng)。為什么呢梅誓?還記得我們前幾節(jié)說過的OpenCV的圖像坐標(biāo)系么恰梢?
所以第10行的代碼表示我們將向右移動(dòng)25pix,向下移動(dòng)50pix(pix表示像素)。
#11-12:
在第11行我們的調(diào)用了cv2.warpAffine()方法梗掰,這是進(jìn)行一個(gè)仿射變換嵌言,至于什么是仿射變換?簡單的說就是:“線性變換”+“平移”及穗,深入了解點(diǎn)這里摧茴。
shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0])) #11
其中第一個(gè)參數(shù)表示我們希望進(jìn)行變換的圖片,第二個(gè)參數(shù)是我們的平移矩陣埂陆,第三個(gè)希望展示的結(jié)果圖片的大小苛白,這里保持和原始圖片一樣大小娃豹。然后我們將變換后的圖片顯示出來。
#13-15:
與上面的變換方式是一樣的购裙,但是你是向上和向左移動(dòng)
#16-18:
在第16行我們使用了:imutils這個(gè)自己寫的庫懂版,然后調(diào)用了translate()方法。第一個(gè)參數(shù)是需要操作的圖像躏率,第二個(gè)參數(shù)是在x軸上平移躯畴,第三個(gè)參數(shù)是在y軸上平移。
shifted = imutils.translate(image, 0, 100) #16
1.2 自寫的變換函數(shù)庫
我們?yōu)榱嗽趖ranslation.py中導(dǎo)入使用imutils薇芝,我們需要在translation.py的同一個(gè)目錄下新建
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:
導(dǎo)入使用的包
#3-6:
我們定義了一個(gè)translate函數(shù)蓬抄,在這個(gè)函數(shù)中我們只是將平移的操作寫在里面了,然后返回了平移之后的結(jié)果shifted夯到,通過這個(gè)例子嚷缭,我們是不是感受到了封裝的力量?不管你有沒有黄娘,反正我是有峭状。這樣當(dāng)我再在translation.py中要對(duì)圖像進(jìn)行變換時(shí)候是不是將很方便了克滴?敲黑板:這個(gè)imutils.py我們將在后面的幾個(gè)變換操作中逼争,都會(huì)用到,也會(huì)將其他變換的操作劝赔,都封裝在里面誓焦。
2 效果展示
轉(zhuǎn)載請(qǐng)注明出處:
CSDN:樓上小宇__home:http://blog.csdn.net/sty945
簡書:樓上小宇:http://www.reibang.com/u/1621b29625df