為什么使用Python-OpenCV?
基本操作
1、圖像讀入
使用函數cv2.imread(filepath,flags) 讀入圖像。這幅圖像應該在此程序的工作路徑,或者給函數提供完整路徑,第二個參數是要告訴函數應該如何讀取這幅圖片,可省略。
- filepath:要讀入圖片的完整路徑
- flags:讀入圖片的標志
- cv2.IMREAD_COLOR:默認參數,讀入一副彩色圖片,忽略alpha通道
- cv2.IMREAD_GRAYSCALE:讀入灰度圖片
- cv2.IMREAD_UNCHANGED:顧名思義,讀入完整圖片,包括alpha通道
import cv2 import numpy as np img = cv2.imread('1.jpg', cv2.IMREAD_GRAYSCALE)
2、顯示圖片
使用函數cv2.imshow(wname,img)顯示圖像,第一個參數是顯示圖像的窗口的名字,第二個參數是要顯示的圖像(imread讀入的圖像),窗口大小自動調整為圖片大小。
cv2.imshow('image',img) cv2.waitKey(0) cv2.destroyAllWindows() #cv2.destroyWindow(wname)
- cv2.waitKey顧名思義等待鍵盤輸入,單位為毫秒,即等待指定的毫秒數看是否有鍵盤輸入,若在等待時間內按下任意鍵則返回按鍵的ASCII碼,程序繼續運行。若沒有按下任何鍵,超時后返回-1。參數為0表示無限等待。不調用waitKey的話,窗口會一閃而逝,看不到顯示的圖片。
- cv2.destroyAllWindow()銷毀所有窗口
- cv2.destroyWindow(wname)銷毀指定窗口
3、保存圖片
使用函數cv2.imwrite(file,img,num)保存一個圖像。第一個參數是要保存的文件名,第二個參數是要保存的圖像。可選的第三個參數,它針對特定的格式:對於JPEG,其表示的是圖像的質量,用0 - 100的整數表示,默認95;對於png ,第三個參數表示的是壓縮級別,默認為3。
注意:
- cv2.IMWRITE_JPEG_QUALITY類型為 long ,必須轉換成 int
- cv2.IMWRITE_PNG_COMPRESSION, 從0到9 壓縮級別越高圖像越小
cv2.imwrite('1.png',img, [int( cv2.IMWRITE_JPEG_QUALITY), 95]) cv2.imwrite('1.png',img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
變換操作
1、翻轉圖片
使用函數cv2.flip(img,flipcode)翻轉圖像,flipcode控制翻轉效果。
- flipcode = 0:沿x軸翻轉
- flipcode > 0:沿y軸翻轉
- flipcode < 0:x,y軸同時翻轉
imgflip = cv2.flip(img,1)
2、復制圖片
imgcopy = img.copy()
3、顏色空間轉換
注意,matplotlib 中圖像通道為 RGB,而 OpenCV 中圖像通道為 BGR。因此進行顯示的時候,要注意交換通道的順序。
彩色圖像轉為灰度圖像
img2 = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
灰度圖像轉為彩色圖像
img3 = cv2.cvtColor(img,cv2.COLOR_GRAY2RGB)
4、裁剪圖片
裁剪出自己感興趣的部分(ROI,region of interest),需要用到numpy的切片功能,因為OpenCV中,圖像就是用numpy.ndarray存儲的。
可以先通過image.shape查看行列數
print(image.shape)
例如返回(708,1000,4)分別表示圖片的高、寬和通道數。
對圖片的裁剪其實就是切片,例如
#得到區域高100~800步長為2,寬200~600步長為1, 通道0 image2 = image[100:800:2, 20:600:1, 0] #得到原圖,通道2 image3 = image[:, :, 2]
綜合示例
讀入一張圖片並顯示出來,經過操作后,選擇退出或保存。
1 import cv2 2 import numpy as np 3 4 img = cv2.imread('a.jpg') 5 cv2.imshow('image',img) 6 7 # Wait for keys to exit or save 8 k = cv2.waitKey(0) 9 if k == 27: 10 cv2.destroyAllWindows() 11 elif k == ord('s'): 12 cv2.imwrite('save_image.jpg', img) 13 cv2.destroyAllWindows()
ord('s')表示返回字符s的ASCII值,ASCII值27對應‘Esc’
參考鏈接:
1、https://blog.csdn.net/fu6543210/article/details/80835280
2、http://www.runoob.com/python/python-func-ord.html