Mat類:
是用於保存圖像以及其他矩陣數據的數據結構。
圖像載入函數imread():
Mat imread(const string& filename, int flags=1);
filename表示圖像載入的路徑;
flags爲載入標識。
flags=0 將圖像轉換爲灰度再返回;
flags=1 將圖像轉換成彩色再返回;
flags=2 若載入圖像的深度是16位或者32位,就返回對應的圖像深度,否則,將圖像轉換爲8位圖像再返回。
flags=2|4 載入最真實無損的源圖像
若flags不在枚舉類型當中,flags>0 返回一個三通道的彩色圖像;flags=0 返回灰度圖像;flags<0 返回包含Alpha通道的加載圖像。
圖像顯示函數imshow():
void imshow(const string& winname, InputArray mat);
winname填寫要顯示的窗口標識名稱;
mat填需要顯示的圖像。
輸出圖像到文件imwrite():
bool imwrite(const string& filename, InputArray img, const vector& params=vector());
第一個參數filename表示要寫入的文件名
第二個參數img表示Mat類型的圖像數據
通道分離split()函數;
void split(const Mat& src, Mat* mvbegin);
void split(InputArray m, OutputArrayofArray mv);
第一個參數表示需要進行分離的多通道數組;
第二個參數表示函數 輸出數組或輸出的vector容器。
通道合併merge()函數:
void merge(const Mat* mv, size_t count, OutputArray dst)
void merge(InputArrayOfArray mv, OutputArray dst);
第一個參數mv表示需要被合併的輸入矩陣或vector容器的陣列,mv參數中所有矩陣必須擁有一樣的尺寸;
第二個參數count表示當mv爲空白的C數組時,代表輸入矩陣的個數,通常可以省略不寫;
第三個參數dst表示輸出矩陣,和mv擁有一樣的尺寸和深度
Python與OpenCV圖像簡單操作
OpenCV安裝
打開命令行輸入 pip install opencv-python(前提是有python環境)
1.讀取圖片
使用 cv2.imread()
函數,給出了幾種讀取圖片路徑的寫法
import cv2#導入opencv包
#python中不需要聲明變量
img1 = cv2.imread("D:/test/1.jpg")#絕對路徑,推薦
img2 = cv2.imread("D:\\test\\2.jpg")#通常是兩個斜線,單右斜線會被當成轉義符
img3 = cv2.imread("3.jpeg")#相對路徑,將圖片放在py文件對應目錄下
cv2.imshow("test1", img1)
cv2.imshow("test2", img2)
cv2.imshow("test3", img3)
cv2.waitKey(0)#沒有這一句圖片會一閃而過
##waitkey(delay=0),等待用戶輸入按鍵,返回該按鍵的值
2.保存圖片
使用 cv2.write()
函數保存圖片
import cv2# 導入OpenCV包
img=cv2.imread("D:/test/3.png",cv2.IMREAD_COLOR)
cv2.imshow("test",img)#OpenCV可以實現不同格式圖片轉換,支持jpg、bmp、png等圖片格式相互無損轉換
cv2.imwrite("D:/test/3.1.png",img)#將改變後的圖像保存
cv2.imwrite("D:/test/3.2.bmp",img)
cv2.waitKey(0)
3.截取部分圖像
import cv2
img = cv2.imread("D:\\test\\2.jpg")
frame = img[200:400,200:400] #截取部分圖像,200-400行,200-400列
cv2.imshow("test",frame)#顯示截取後的圖像
cv2.waitKey(0)
4.圖片翻轉
使用cv2.flip(img,flipcode)來進行圖片翻轉
flipcode控制圖片翻轉方向
import cv2
img=cv2.imread("D:/test/5.jpg",cv2.IMREAD_COLOR)
flipCode1=1#大於0左右翻轉
flipCode2=0#等於0上下翻轉
flipCode3=-1#小於0先上下翻轉再左右翻轉
img1 = cv2.flip(img, flipCode1)#filpCode控制圖片翻轉方向
img2 = cv2.flip(img, flipCode2)
img3 = cv2.flip(img, flipCode3)
cv2.imshow("test",img)
cv2.imshow("test1",img1)
cv2.imshow("test2",img2)
cv2.imshow("test3",img3)
cv2.waitKey(0)
5.縮放圖片
cv2.resize(img,dsize,fx,fy),dsize和fx,fy都可以設置圖片大小,不能同時爲0
import cv2# 導入OpenCV包
img = cv2.imread("D:/test/2.jpg",cv2.IMREAD_COLOR)
img1 = cv2.resize(img, (700, 700))#設置輸出圖片的尺寸
img2 = cv2.resize(img, None, fx=0.7, fy=0.7)#None的位置本來是輸出圖片的尺寸,這裏設置了縮放因子
#fx-水平軸上的比例因子,fy-垂直軸上的比例因子
cv2.imshow("test", img)
cv2.imshow("test1", img1)
cv2.imshow("test2", img2)
cv2.imwrite("D:/test/resize.jpg", img1)# 保存圖像
cv2.waitKey(0)
6.轉換爲灰度圖像
cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
cv2.COLOR_RGB2GRAY表示把RGB圖像轉爲灰度圖像,2前是轉換前,2後是轉換後
import cv2#導入opencv包
#python中不需要聲明變量
img = cv2.imread("D:/test/1.jpg")#cv2.imread讀進來的圖片格式是BGR(W,H,C),而不是RGB
cv2.imshow("BGR", img)
#將圖像轉換爲RGB格式
img1 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)#因爲opencv讀取圖片是按BGR讀的,所以轉換爲RGB反而不像原圖
cv2.imshow("RGB",img1)
#將圖像轉換爲灰度圖像
img2 = cv2.cvtColor(img1, cv2.COLOR_RGB2GRAY)
cv2.imshow("GRAY",img2)
cv2.waitKey(0)
7.在一個窗口中顯示兩張圖片
import cv2
import numpy as np
img = cv2.imread("D:/test/resize.jpg")
img2 = cv2.imread("D:/test/resize.jpg")
#imgs = np.hstack([img,img2])#在水平方向上平鋪
imgs = np.vstack([img,img2])#在豎直方向上堆疊
cv2.imshow("mutil_pic", imgs)
cv2.waitKey(0)
8.繪圖功能
import cv2
import numpy as np
img = 255*np.ones((350,512,3),np.uint8)#unit8:0~255
#ones()爲創建一個元素均爲一的矩陣
font = cv2.FONT_HERSHEY_DUPLEX
#font = cv2.FONT_HERSHEY_COMPLEX# 設置字體
#文本 # 圖片對象、文本、 位置、 字體、字體大小、顏色、 字體粗細
cv2.putText(img, "happy day", (50,300), font, 0.8, (25, 25, 25), 2,)#顏色可以自己調整,範圍爲0-255
#線 #起點 終點 顏色 粗細
cv2.line(img, (50,310), (185,310), (0, 0,0),4)
#矩形 #左上頂點 右下頂點
cv2.rectangle(img, (80,8), (200,100), (0, 255,0),2)
#圓形 #圓心 半徑 顏色 控制是否填充 -1表示填充
cv2.circle(img,(60,60),30,(0,0,213),1)
#橢圓 #中心點 長軸 短軸 偏轉角度,起始角度,終止角度
cv2.ellipse(img,(100,300),(100,50),180,0,360,(20,213,79),1)
cv2.imshow("Draw", img)
cv2.waitKey(0)
1.np.vstack([img1,img2]) 當img1和img2圖片矩陣維度相同時才能堆疊
2.除了imread,imwrite 函數沒有返回值以外,flip,resize,cvtColor,vstack,hstack都有返回一個圖片回來。