每次學(xué)習(xí)新東西的時候,橡皮擦都是去海量檢索,然后找到適合自己理解的部分。
再將其拼湊成一個小的系統(tǒng),爭取對該內(nèi)容有初步理解。
今天這 1 個小時,核心要學(xué)習(xí)的是圖像的平移,在電腦上隨便打開一張圖片,實現(xiàn)移動都非常簡單,但是在代碼中,出現(xiàn)了一些新的概念。
檢索 OpenCV 圖像平移相關(guān)資料時,碰到的第一個新概念是就是 仿射變換
。
每次看到這樣子的數(shù)學(xué)名字,必然心中一涼,做為一個數(shù)學(xué)小白,又要瑟瑟發(fā)抖了。
百度一下,看看百科中是如何介紹的。

看過上圖中的一些相關(guān)簡介之后,對于這個概念也并沒有太深刻的理解,本著先用起來,在補充理論的學(xué)習(xí)觀點,我們先實現(xiàn)圖像平移。
學(xué)習(xí)過程中,碰到一些概念性的東西,可以先應(yīng)用起來,然后在后續(xù)的深入學(xué)習(xí)過程中,逐步去完善它們。
cv2.warpAffine() 仿射變換
基于該方法去尋找相關(guān)資料,得到仿射變換的基本概念,從二維坐標(biāo)到二維坐標(biāo)之間的線性變換,并且要保持二維圖形的“平直性” 和 “平行性”。
仿射變換中,包含平移,縮放,翻轉(zhuǎn),旋轉(zhuǎn),剪切。
該方法的語法結(jié)構(gòu)如下:
dst = cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
參數(shù)說明:
- src:輸入圖像
- M:2*3 transformation matrix (轉(zhuǎn)變矩陣)
- dsize:輸出圖像的大小,格式為(cols,rows),width 對應(yīng) cols,height 對應(yīng) rows
- flags: 可選參數(shù),插值方法的組合(int 類型),默認(rèn)值 INTER_LINEAR
- borderMode:可選參數(shù),邊界像素模式(int 類型),默認(rèn)值 BORDER_CONSTANT
- borderValue:可選參數(shù),邊界填充值; 默認(rèn)情況下,默認(rèn)值 Scalar()即 0
官方可查閱的英文資料如下:

插值方式(flags)有如下類型:
- INTER_LINEAR 線性插值
- INTER_NEAREST 最近鄰插值
- INTER_AREA 區(qū)域插值
- INTER_CUBIC 三次樣條插值
- INTER_LANCZOS4 Lanczos 插值
一般情況下,使用 wrapAffine
前三個參數(shù),即 warpAffine(img,M,(rows,cols))
實現(xiàn)基本的仿射變換效果,但是這種情況會出現(xiàn) 黑邊
現(xiàn)象。
最后一個參數(shù)為 borderValue
,邊界填充的顏色,默認(rèn)為黑色,可以自行設(shè)置為其它顏色。
具體代碼
圖像平移是圖像位置的移動。在平移前,需要先轉(zhuǎn)換矩陣 M,,其中 tx
,ty
表示在(x,y)方向上的位移,如下所示:

測試代碼如下,重要部分在注釋中進(jìn)行說明。
import numpy as np
import cv2 as cv
img = cv.imread('10.jpg', 1)
rows, cols, channels = img.shape
# [1,0,100] 右移 100, [0,1,50] 下移 50
M = np.float32([[1, 0, 100], [0, 1, 50]])
res = cv.warpAffine(img, M, (cols, rows))
cv.imshow("img", res)
cv.waitKey()
特別說明:
cv.warpAffine
方法的第三個參數(shù)是輸出圖像的大小,其形式應(yīng)為(width,height)。記住 width =列數(shù)(cols),height =行數(shù)(rows)。
以下為代碼運行結(jié)果。

關(guān)于 borderMode
參數(shù)值的說明:
該部分內(nèi)容涉及邊緣處理,翻閱手冊過程找到的說明指向 BorderTypes
。翻閱了一下,依舊是有些超綱,可以先記錄下相關(guān)內(nèi)容,日后在進(jìn)行回顧,參考地址。
所有值羅列如下:
- BORDER_CONSTANT = 0
- BORDER_REPLICATE = 1
- BORDER_REFLECT = 2
- BORDER_WRAP = 3
- BORDER_REFLECT_101 = 4
- BORDER_TRANSPARENT = 5
- BORDER_REFLECT101 = BORDER_REFLECT_101
- BORDER_DEFAULT = BORDER_REFLECT_101
- BORDER_ISOLATED = 16

borderValue
:當(dāng)圖像邊界處理方式為 BORDER_CONSTANT
時的填充值。
測試代碼如下:
import numpy as np
import cv2 as cv
img = cv.imread('10.jpg', 1)
rows, cols, channels = img.shape
M = np.float32([[1, 0, 100], [0, 1, 50]])
res = cv.warpAffine(img, M, (cols, rows),
borderMode=cv.BORDER_CONSTANT, borderValue=(200, 66, 66))
cv.imshow("img", res)
cv.waitKey()
OpenCV 尾聲
到此這篇關(guān)于Python OpenCV 圖像平移的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)OpenCV 圖像平移內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Python-OpenCV實現(xiàn)圖像缺陷檢測的實例
- OpenCV-Python實現(xiàn)圖像平滑處理操作
- OpenCV-Python直方圖均衡化實現(xiàn)圖像去霧
- python opencv 找出圖像中的最大輪廓并填充(生成mask)
- python基于opencv 實現(xiàn)圖像時鐘
- Python-OpenCV教程之圖像的位運算詳解