一、圖像的生成———生成一個純色圖像
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()