OpenCV之圖像的生成、邊界擴展、縮放變換、平移變換、仿射變換、透射變換——pthon實現

一、圖像的生成———生成一個純色圖像

import cv2
import numpy as np
img = np.ones((650,1000), dtype = np.uint8)
cv2.imshow('img',img)
cv2.waitKey(0)

圖像矩陣各像素點的值均爲0,即黑色圖像。

 

 

二、擴展圖像邊緣

使用的函數:cv2.copyMakeBorder(src,top,bottom,left,right,borderType,value)

                       top、bottom、left、right爲四個方向,上下左右,取值爲拓展的像素值大小

                       src:要拓展的圖像

                       borderType:邊界的類型

                      value:僅僅是常亮時,邊界纔有意義

#在圖像邊緣擴充圖像
import cv2
import numpy as np
img = cv2.imread('Ghostblade.jpg')
#cv2.copyMakeBorder(src,top,bottom,left,right,borderType,value),四個方向,上下左右
img1 = cv2.copyMakeBorder(img,50,50,50,50,cv2.BORDER_CONSTANT,value=[0,0,0])
cv2.imshow('imag1',img1)
cv2.waitKey(0)
  • value = [0,0,0]也可以直接寫成0

原圖:



拓展圖:

 

三、縮放變換

#OpenCV提供了一個可以手動調節圖片大小的函數,cv2.resize()
import cv2
import numpy as np
img = cv2.imread('Ghostblade.jpg')
#方法一:
# res = cv2.resize(img, None, fx = 0.5, fy = 0.5, interpolation= cv2.INTER_CUBIC)
#方法二:
height, width = img.shape[:2]
res = cv2.resize(img,(width//2, height//2), interpolation = cv2.INTER_AREA)
cv2.imshow('img',res)
cv2.waitKey(0)

尺寸變小,cv2.resize()函數中,圖像的尺度信息不能是浮點數,必須是整數

  

 

四、平移變換

import cv2
import numpy as np
img = cv2.imread('Ghostblade.jpg',0)   #讀入時將圖像轉換爲灰度圖像
print(img.shape)  # 圖像的大小爲763*1600
rows, cols = img.shape        #因此img.shape只返回兩個參數值
M = np.float32([[1,0,100], [0,1,50]])  #移動(100,50)
dst = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow('img',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.warpAffine()函數:進行仿射變換

 

五、仿射變換

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('Ghostblade.jpg')
rows, cols= img.shape[:2]
#取變換前後的三對對應點,求解仿射變換矩陣
pst1 = np.float32([[50,50],[200,50],[50,200]])
pst2 = np.float32([[10,100],[200,50],[100,250]])
M = cv2.getAffineTransform(pst1, pst2)    #仿射變換的仿射矩陣
dst = cv2.warpAffine(img, M, (cols, rows))   #求解仿射變換後的圖像

#對像素點進行像素值的更換
color = (0,0,255)
img[50,50] = color
img[200,50] = color
img[50,200] = color
dst[10,100] = color
dst[200,50] = color
dst[100,250] = color
cv2.imwrite('Input.jpg', img)   #保存改變像素點後的圖像
cv2.imwrite('Output.jpg',dst)

#將圖像由BGR空間改成RGB空間(OpenCV處理的是BGR空間,matplotlib處理的是RGB空間)
img = img[:,:,::-1]
dst = dst[:,:,::-1]
plt.figure()
plt.subplot(121), plt.imshow(img), plt.title('Input')
plt.subplot(122), plt.imshow(dst), plt.title('Output')
plt.show()

要使得仿射變換的圖片完整顯示,則可以先擴展圖片,在進行仿射變換。

六、透射變換

#透視變換,需要輸入圖像的四個點和輸出圖像上的對應點
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('Ghostblade.jpg')
#擴展圖像,保證內容不超出可視範圍
img = cv2.copyMakeBorder(img,200,200,200,200,cv2.BORDER_CONSTANT,0)
rows, cols = img.shape[:2]
pst1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pst2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
M = cv2.getPerspectiveTransform(pst1,pst2)
dst = cv2.warpPerspective(img,M,(cols,rows))
#BGR到RGB的轉換
img = img[:,:,::-1]
dst = dst[:,:,::-1]
plt.subplot(121), plt.imshow(img), plt.title('Input')
plt.subplot(122), plt.imshow(dst),plt.title('Output')
plt.show()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章