文章目錄
- opencv的8種圖像變換
- 1. 圖像放大、縮小
- 2. 圖像平移
- 3. 圖像旋轉
- 4. 圖像仿射變換
- 5. 圖像裁剪
- 6. 圖像的位運算(AND, OR, XOR)
- 7. 圖像的分離和融合
- 8. 圖像的顏色空間
opencv的8種圖像變換
1. 圖像放大、縮小
我們先看下原圖
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread(‘image/logo.png’)
plt.imshow(img)
看下圖像大小
#height,width, channel
height,width,channel = img.shape
圖像放大縮小
使用cv2.resize()方法
cv2.resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)
參數解釋
dsize形參是個數組,數組的寬度在前,高度在后(output_width,output_height)
圖像縮放之后,肯定像素要進行重新計算的,就靠這個參數來指定重新計算像素的方式,有以下幾種:
INTER_NEAREST - 最近鄰插值
INTER_LINEAR - 雙線性插值,如果最后一個參數你不指定,默認使用這種方法
INTER_CUBIC - 4x4像素鄰域內的雙立方插值
INTER_LANCZOS4 - 8x8像素鄰域內的Lanczos插值
#圖像放大
resized_img = cv2.resize(img,(width2,height2),interpolation=cv2.INTER_LINEAR)
plt.imshow(resized_img)
看下此時圖像大小,確守放大了1倍
圖像縮小
#圖像縮小
smaller_img = cv2.resize(img,None,fx=0.5,fy=0.5,interpolation=cv2.INTER_LINEAR)
plt.imshow(smaller_img)
可以看到圖像縮小了一倍
2. 圖像平移
warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)
src:輸入圖像
M:運算矩陣,2行3列的,數據類型要求是float32位及以上
dsize:運算后矩陣的大小,也就是輸出圖片的尺寸。是個元祖,寬度在前,高度在后
dst:輸出圖像
flags:插值方法的組合,與resize函數中的插值一樣,可以查看cv2.resize
borderMode:像素外推方法,邊界像素的模型( int 類型),詳情參考官網
borderValue:在恒定邊框的情況下使用的borderValue值; 邊界填充的顏色, 默認為 (0, 0, 0) (黑色)
圖像平移
#圖像平移
#先獲取原來的高和寬
height,width = img.shape[:2]
M = np.float32([[1,0,20],[0,1,10]]) #圖像平移。向右平移20個像素,向下平移10個像素
move_img = cv2.warpAffine(img,M,(width,height))
我們詳細分析下M這個矩陣
下面的M相當于就是一個運算矩陣。2行3列
根據定義,我們的坐標就可以根據A,B來進行運算
可以很輕易的得出以下方程
通過方程我們就可以很輕易的看出,c1和c2就相當于是讓圖像平移,而a和b這2個參數就是對圖像進行旋轉,縮放等操作。
對圖片進行三維旋轉
#圖像旋轉
#先獲取原來的高和寬
height,width = img.shape[:2]
M = np.float32([[1,0.2,0],[0.2,1,0]]) #圖像平移。向右平移20個像素,向下平移10個像素
scoll_img = cv2.warpAffine(img,M,(width,height))
plt.imshow(scoll_img)
3. 圖像旋轉
- rot_mat = cv2.getRotationMatrix2D(center, -5, 1)
參數說明:center表示中間點的位置,-5表示順時針旋轉5度,1表示進行等比列的縮放
- cv2.warpAffine(img, rot_mat, (img.shape[1], img.shape[0]))
參數說明: img表示輸入的圖片,rot_mat表示仿射變化矩陣,(image.shape[1], image.shape[0])表示變換后的圖片大小
#先獲取原來的高和寬
height,width = img.shape[:2]
#設置旋轉的中心
center = (width //2.0, height//2.0) #旋轉中心
M2 = cv2.getRotationMatrix2D(center,180,1) #1表示旋轉過程中有沒縮放,180表示逆時針旋轉,負數表示順時針旋轉
rotation_img = cv2.warpAffine(img,M2,(width,height))
plt.imshow(rotation_img)
等比例旋轉180
4. 圖像仿射變換
對于更復雜仿射變換,OpenCV提供了函數cv2.getAffineTransform()來生成仿射函數cv2.warpAffine()所使用的轉換矩陣M。
該函數的語法格式為:
retval=cv2.getAffineTransform(src, dst)
src代表輸入圖像的三個點坐標。
dst代表輸出圖像的三個點坐標。
參數值src和dst是包含三個一維數組(x, y)點的二維數組。
指代原始圖像和目標圖像內平行四邊形的三個頂點(左上角、右上角、左下角)
上述參數通過函數cv2.getAffineTransform()定義了兩個平行四邊形。
src和dst中的三個點分別對應平行四邊形的左上角、右上角、左下角三個點。
函數cv2.warpAffine()以函數cv2.getAffineTransform()獲取的轉換矩陣M為參數,將src中的點仿射到dst中。
函數cv2.getAffineTransform()對所指定的點完成映射后,將所有其他點的映射關系按照指定點的關系計算確定。
#圖像仿射變換
p1 = np.float32([[120,35],[215,45],[135,120]])
p2 = np.float32([[135,45],[300,110],[130,230]])
M3 = cv2.getAffineTransform(p1,p2) #計算一個變換矩陣
trans_img = cv2.warpAffine(img,M3,(width,height))
plt.imshow(trans_img)
5. 圖像裁剪
#圖像剪裁,裁剪像素范圍
crop_img = img[20:100,20:40]
plt.imshow(crop_img)
6. 圖像的位運算(AND, OR, XOR)
位運算都是針對多張圖形來計算的
我們先創建兩個圖形
繪制長方形
#長方形
rectangle = np.zeros((300,300),dtype=‘uint8’)
rect_img = cv2.rectangle(rectangle,(25,25),(275,275),255,-1)
cv2.rectangle(img, pt1, pt2, color, thickness, lineType, shift )
參數表示依次為: (圖片,長方形框左上角坐標, 長方形框右下角坐標, 字體顏色,字體粗細)
plt.imshow(rect_img)
畫布畫圓
circle(img, center, radius, color, thickness=None, lineType=None, shift=None):
含義:圖片,中心店,半徑,顏色,圓輪廓粗細,線類型。
#畫圓
rectangle = np.zeros((300,300),dtype=‘uint8’)
circle_img = cv2.circle(rectangle,(150,150),150,255,-1)
plt.imshow(circle_img)
#與運算
and_img = cv2.bitwise_and(rect_img,circle_img)
plt.imshow(and_img)
可見兩張圖重合的部分被畫出
#或運算 OR
or_img = cv2.bitwise_or(rect_img,circle_img)
plt.imshow(or_img)
#異或運算 XOR
兩張圖片不重疊的部分
xor_img = cv2.bitwise_xor(rect_img,circle_img)
plt.imshow(xor_img)
7. 圖像的分離和融合
#圖像的分離
B,G,R = cv2.split(img)
plt.imshow(B)
plt.imshow(G)
plt.imshow?
在使用opencv和matplotlib的過程中會遇到圖像反色或者生成的是偽彩色圖像的問題,
原因是兩個讀取RGB通道的順序是不一樣的,opencv的順序是B-G-R,而matplotlib的順序是R-G-B,所以這個區分就會產生一些矛盾。
圖像合并
matplotlib這樣顯示才是正常顏色
plt.imshow(cv2.merge([R,G,B]))
對比下直接用matplotlib和cv2的顯示
8. 圖像的顏色空間
#顏色空間
#灰度
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
plt.imshow(gray)
#HSV(色度,飽和度,純度)
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
plt.imshow(hsv)
#lab
lab = cv2.cvtColor(img,cv2.COLOR_BGR2LAB)
plt.imshow(lab)