給源圖像增長邊界html
cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value)
src:源圖像數組
top,bottem,left,right: 分別表示四個方向上邊界的長度函數
borderType: 邊界的類型spa
有如下幾種:3d
BORDER_REFLICATE # 直接用邊界的顏色填充, aaaaaa | abcdefg | gggg
BORDER_REFLECT # 倒映,abcdefg | gfedcbamn | nmabcd BORDER_REFLECT_101 # 倒映,和上面相似,但在倒映時,會把邊界空開,abcdefg | egfedcbamne | nmabcd BORDER_WRAP # 額。相似於這種方式abcdf | mmabcdf | mmabcd BORDER_CONSTANT # 常量,增長的變量統統爲value色 [value][value] | abcdef | [value][value][value]
value: 僅僅是常量型邊界纔有意義code
代碼及結果如示:orm
import numpy as np import cv2 from matplotlib import pyplot as plt RED=[255,0,0] img = cv2.imread('/home/zh/pic/3.png') img1 = cv2.resize(img, (0,0), fx=0.5, fy=0.5) replicate = cv2.copyMakeBorder(img1, 10,100,100,100, cv2.BORDER_REPLICATE) reflect = cv2.copyMakeBorder(img1, 100,10,100,100, cv2.BORDER_REFLECT) reflect101 = cv2.copyMakeBorder(img1, 100,100,10,100, cv2.BORDER_REFLECT_101) wrap = cv2.copyMakeBorder(img1, 100,100,100,10, cv2.BORDER_WRAP) constant = cv2.copyMakeBorder(img1, 100,100,100,100, cv2.BORDER_CONSTANT, value=RED) plt.subplot(231),plt.imshow(img1),plt.title('ORIGINAL') plt.subplot(232),plt.imshow(replicate),plt.title('REFLECT') plt.subplot(233),plt.imshow(reflect),plt.title('REFLECT') plt.subplot(234),plt.imshow(reflect101),plt.title('REFLECT_101') plt.subplot(235),plt.imshow(wrap),plt.title('WRAP') plt.subplot(236),plt.imshow(constant),plt.title('CONSTANT') plt.show()
圖像的幾何變換:htm
常見的幾何變換有縮放,仿射,透視變換,能夠經過以下函數完成對圖像的上述變換blog
dst = cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) dst = cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) dst = cv2.warpPerspective(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
首先是縮放變換cv2.resize()get
非關鍵字參數組有2個:src,dsize,分別是源圖像與縮放後圖像的尺寸
關鍵字參數爲dst,fx,fy,interpolation
dst爲縮放後的圖像,fx,fy爲圖像x,y方向的縮放比例,
interplolation爲縮放時的插值方式,有三種插值方式:
cv2.INTER_AREA # 使用象素關係重採樣。當圖像縮小時候,該方法能夠避免波紋出現。當圖像放大時,相似於 CV_INTER_NN 方法
cv2.INTER_CUBIC # 立方插值
cv2.INTER_LINEAR # 雙線形插值
cv2.INTER_NN # 最近鄰插值
仿射變換cv2.warpAffine()
非關鍵字參數有src, M, dsize,分別表示源圖像,變換矩陣,變換後的圖像的長寬
這裏說一下放射變換的變換矩陣
位移變換矩陣爲:
旋轉變換矩陣:
標準旋轉變換矩陣爲
,但該矩陣沒有考慮旋轉變換時進行位移以及縮放操做,OpenCV中的旋轉變換以下:
,其中
OpenCV中提供了一個函數得到這樣一個矩陣
M=cv2.getRotationMatrix2D(rotate_center, degree, scale)
rotate_center爲一個2元的元組,表示旋轉中心座標,degree表示逆時針旋轉的角度,scale表示縮放的比例
仿射變換矩陣:
透視變換cv2.warpPerspective()
非關鍵字參數src, M, dsize分別表示源圖像,變換矩陣,以及輸出圖像的大小
關鍵字參數爲flags, borderMode, borderValue,這幾個參數的意思理解的還不是很清楚,能夠去
http://docs.opencv.org/modules/imgproc/doc/geometric_transformations.html 查找warpPerspective函數
透視變換矩陣通常不容易直接知道,可以直接知道的每每是變換先後的點的位置,所以,OpenCV中提供了getPersepectiveTransform()函數得到透視變換矩陣
M = cv2.getPerspectiveTransform(pts1, pts2)
pts1,pts2分別爲變換前點的位置以及變換後點的位置
(其實全部的變換的變換矩陣均可以經過變換先後點的座標獲得,即經過上面這個函數,由於全部的變換都是透視變換中的特例而已)
最後用一個實例將上述變換函數做用呈現以下:
import numpy as np import cv2 from matplotlib import pyplot as plt #scaling: img = cv2.imread('/home/zh/pic/3.png') rows, cols, channels = img.shape res = cv2.resize(img, (cols/2, rows/2)) #Translation: # 1.shift M_shift = np.float32([[1,0,100],[0,1,50]]) img_shift = cv2.warpAffine(img, M_shift, (cols, rows)) # 2.rotate M_rotate = cv2.getRotationMatrix2D((cols/2, rows/2), 90, 1) img_rotate = cv2.warpAffine(img, M_rotate, (cols, rows)) # 3.affine pts1 = np.float32([[50,50],[200,50],[50,200]]) pts2 = np.float32([[10,100],[200,50],[100,250]]) M_affine = cv2.getAffineTransform(pts1,pts2) img_affine = cv2.warpAffine(img, M_affine, (cols, rows)) # 4.perspective pts3 = np.float32([[56,65],[368,52],[28,387],[389,390]]) pts4 = np.float32([[0,0],[300,0],[0,300],[300,300]]) M_perspective = cv2.getPerspectiveTransform(pts3,pts4) img_perspective = cv2.warpPerspective(img, M_perspective, (cols, rows)) print 'shift:\n', M_shift print 'rotate:\n', M_rotate print 'affine:\n', M_affine print 'perspective:\n', M_perspective plt.subplot(231),plt.imshow(img),plt.title('src') plt.subplot(232),plt.imshow(res),plt.title('scale') plt.subplot(233),plt.imshow(img_shift),plt.title('shift') plt.subplot(234),plt.imshow(img_rotate),plt.title('rotate') plt.subplot(235),plt.imshow(img_affine),plt.title('affine') plt.subplot(236),plt.imshow(img_perspective),plt.title('perspective') plt.show()
結果以下: