OpenCV for Python 學習筆記 三


給源圖像增加邊界

cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value)

src:源圖像

top,bottem,left,right: 分別表示四個方向上邊界的長度

borderType: 邊界的類型

有以下幾種:

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: 僅僅是常量型邊界才有意義

代碼及結果如示:

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()

 

圖像的幾何變換:

常見的幾何變換有縮放,仿射,透視變換,可以通過如下函數完成對圖像的上述變換

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()

非關鍵字參數組有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()

 

結果如下:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM