4 用python进行OpenCV实战之图像变换1(平移)
前言
到目前為止,經(jīng)過(guò)前幾節(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 #4ap = argparse.ArgumentParser() #5
ap.add_argument("-i", "--image", required=True,help="Path to the image") #6
args = vars(ap.parse_args()) #7image = cv2.imread(args["image"]) #8
cv2.imshow("原始圖片", image) #9M = 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) #12M = 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) #15shifted = 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的包,而是我們自己寫(xiě)的一個(gè)庫(kù),里面包含了諸如平移、旋轉(zhuǎn)等操作的方法,以便于我們使用起來(lái)更加的方便,具體將在后面進(jìn)行詳細(xì)介紹。
#10:
M = np.float32([[1, 0, 25], [0, 1, 50]]) #10
我們通過(guò)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é)說(shuō)過(guò)的OpenCV的圖像坐標(biāo)系么?
所以第10行的代碼表示我們將向右移動(dòng)25pix,向下移動(dòng)50pix(pix表示像素)。
#11-12:
在第11行我們的調(diào)用了cv2.warpAffine()方法,這是進(jìn)行一個(gè)仿射變換,至于什么是仿射變換?簡(jiǎn)單的說(shuō)就是:“線性變換”+“平移”,深入了解點(diǎn)這里。
shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0])) #11
其中第一個(gè)參數(shù)表示我們希望進(jìn)行變換的圖片,第二個(gè)參數(shù)是我們的平移矩陣,第三個(gè)希望展示的結(jié)果圖片的大小,這里保持和原始圖片一樣大小。然后我們將變換后的圖片顯示出來(lái)。
#13-15:
與上面的變換方式是一樣的,但是你是向上和向左移動(dòng)
#16-18:
在第16行我們使用了:imutils這個(gè)自己寫(xiě)的庫(kù),然后調(diào)用了translate()方法。第一個(gè)參數(shù)是需要操作的圖像,第二個(gè)參數(shù)是在x軸上平移,第三個(gè)參數(shù)是在y軸上平移。
shifted = imutils.translate(image, 0, 100) #16
1.2 自寫(xiě)的變換函數(shù)庫(kù)
我們?yōu)榱嗽趖ranslation.py中導(dǎo)入使用imutils,我們需要在translation.py的同一個(gè)目錄下新建
imutils.py
在其中寫(xiě)入如下代碼:
import numpy as np #1
import cv2 #2def translate(image, x, y): #3M = np.float32([[1, 0, x], [0, 1, y]]) #4shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0])) #5return shifted #6
#1-2:
導(dǎo)入使用的包
#3-6:
我們定義了一個(gè)translate函數(shù),在這個(gè)函數(shù)中我們只是將平移的操作寫(xiě)在里面了,然后返回了平移之后的結(jié)果shifted,通過(guò)這個(gè)例子,我們是不是感受到了封裝的力量?不管你有沒(méi)有,反正我是有。這樣當(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
簡(jiǎn)書(shū):樓上小宇:http://www.jianshu.com/u/1621b29625df
總結(jié)
以上是生活随笔為你收集整理的4 用python进行OpenCV实战之图像变换1(平移)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 3 用python进行OpenCV实战之
- 下一篇: 5 用python进行OpenCV实战之