一、必備前提:
Python3.5及以上版本、pip、windows環境
二、搭建opencv
該部分可以創建隔絕的Python環境來引入,參照virtualenv的使用
在目標的cmd窗口,依次輸入以下命令:
pip install --upgrade setuptools
pip install numpy Matplotlib
pip install opencv-python
如果下載中間出現error或wrong,重新輸入命令即可。
如果多次下載失敗,可以從http://www.lfd.uci.edu/~gohlke/pythonlibs/直接下載whl包安裝,安裝whl包依然使用pip
pip install 包的位置(如:C:\download\xxx.whl)
三、示例代碼
讀入圖片:
cv.imread(filepath,flags)
filepath:要讀入圖片的完整路徑
flags:讀入圖片的標志
cv2.IMREAD_COLOR:默認參數,讀入一副彩色圖片,忽略alpha通道(1)
cv2.IMREAD_GRAYSCALE:讀入灰度圖片(0)
cv2.IMREAD_UNCHANGED:顧名思義,讀入完整圖片,包括alpha通道(-1)
支持 bmp、jpg、png、tiff 等常用格式,詳情可以查看imread()方法的文檔注釋
顯示圖片:
cv.imshow('image',img) cv.waitKey(0) cv.destroyAllWindows()#cv.destroyWindow(wname)
cv2.imshow(wname,img)顯示圖像,第一個參數是顯示圖像的窗口的名字,第二個參數是要顯示的圖像(imread讀入的圖像),窗口大小自動調整為圖片大小
cv2.waitKey顧名思義等待鍵盤輸入,單位為毫秒,即等待指定的毫秒數看是否有鍵盤輸入,若在等待時間內按下任意鍵則返回按鍵的ASCII碼,程序繼續運行。若沒有按下任何鍵,超時后返回-1。參數為0表示無限等待。不調用waitKey的話,窗口會一閃而逝,看不到顯示的圖片。
cv2.destroyAllWindow()銷毀所有窗口
cv2.destroyWindow(wname)銷毀指定窗口
保存圖片:
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.jpeg',img, [int( cv2.IMWRITE_JPEG_QUALITY), 95]) cv2.imwrite('1.png',img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
此處需注意,按照默認質量保存圖片為JPEG files(\*.jpeg, \*.jpe, \*.jpg)時,由於jpeg壓縮版本在壓縮過程中導致了部分像素丟失,會導致保存后的像素點值與寫入前有差別。
保存圖片為png格式,即可以解決此問題
示例代碼:讀入一副圖像,按’s’鍵保存后退出,其它任意鍵則直接退出不保存
import cv2 as cv img = cv.imread('D:\python\test.jpg',cv2.IMREAD_UNCHANGED) cv.imshow('image',img) k = cv.waitKey(0) if k == ord('s'): # wait for 's' key to save and exit cv.imwrite('1.png',img) cv.destroyAllWindows() else: cv.destroyAllWindows()
四、圖像的基本操作
創建圖片
1.創建三通道
import numpy as np import cv2 as cv # 三通道 creat_img3 = np.zeros([400, 400, 3], np.uint8) # 高400*寬400*通道3 單通道8位 creat_img3[:, :, 0] = np.ones([400, 400]) * 255 # 0(Blue)通道全部賦值255 creat_img3[:, :, 2] = np.ones([400, 400]) * 255 # 2(Red)通道全部賦值255 cv.imshow("create image3", creat_img3)
2.創建單通道
# 單通道 creat_img1 = np.zeros([400, 400, 1], np.uint8) creat_img1[:, :, 0] = np.ones([400, 400]) * 127 # 單通道灰度圖像 cv.imshow("create image1", creat_img1)
3.創建小尺寸
# 生成小尺寸圖片 mini_img = np.ones([3, 3], np.float) mini_img.fill(127.1) # .fill方法填充數據 mini_img2 = mini_img.reshape([1, 9]) # reshape只改變形狀,不改變數據 print(mini_img, mini_img2)
以上內容摘自:https://blog.csdn.net/l0ve777/article/details/88715704
讀取圖片並編輯
import cv2 as cv img = cv.imread("D://test.jpeg") #對 BGR 圖像而言,返回值為 B, G, R 的值,對灰度圖像而言,會返回他的灰度值。即彩圖返回三通道三維數組,灰度圖返回單通道三維數組,小圖返回二維數組 print(img[100,100]) #[ 42 57 130] print(img.item(100,100,2)) #130 img.itemset((100,100,2),25) #img[100,100,2]=25 print(img.item(100,100,2)) #25
獲取圖像屬性
import cv2 as cv img = cv.imread("D://test.jpeg") # img.shape 可以獲取圖像的形狀。他的返回值是一個包含行數,列數,通道數的元組。行數對應坐標軸上的y軸,即高度;而列數對應x軸,即寬度。返回值可以理解為高度,寬度,通道數。 print(img.shape) #(512, 512, 3) # img.size 可以返回圖像的像素數目。 print(img.size) #786432 #img.dtype 返回的是圖像的數據類型。 print(img.dtype) #uint8
設置ROI
ROI(Region of Interest)是指圖像中的一個矩形區域,如果后續需要單獨處理某一個小區域,可以設置ROI
import cv2 as cv ballImg = img[380:512,230:350] #利用numpy中的數組切片設置ROI區域 img[0:132,0:120] = ballImg #將設置的ROI區域添加到原圖像的左上方 cv.namedWindow("Image") cv.imshow("Image", img) cv.waitKey(0)
拆分及合並圖像通道
要對單個通道進行操作的時候,需要拆分出單個通道,有2種方法
1)用opencv自帶的split函數
保存圖片
需注意按照需要,保存不同格式
1 mini_img = np.ones([3, 3], np.uint8) 2 mini_img.fill(127) # .fill方法填充數據 3 #mini_img2 = mini_img.reshape([1, 9]) # reshape只改變形狀,不改變數據 4 #print(mini_img, mini_img2) 5 print(mini_img) 6 cv.imshow("mini_img", mini_img) 7 cv.waitKey(0) #毫秒級,0為無限等待 8 cv.imwrite('mini.jpg', mini_img) 9 10 image = cv.imread('mini.jpg',0) #0表示灰度圖 11 print(image) 12 13 image[0][0] = 100 #image.itemset(0,100) 14 image[1][0] = 40 #image.itemset((1,0),40) 15 cv.imshow("mini_img", image) 16 cv.waitKey(0) 17 cv.imwrite('mini2.jpg', image) 18 19 image = cv.imread('mini2.jpg',0) 20 print(image)
以上三處打印分別為:
[[127 127 127] [127 127 127] [127 127 127]] [[127 127 127] [127 127 127] [127 127 127]] [[100 126 125] [ 39 131 127] [128 127 124]]
發現,為灰度圖(即像素數相同,為127)時,讀圖數據與寫入一致,但是當改變了其中某些像素值后,讀圖數據發生了變化,
是由於jpeg壓縮版本在壓縮過程中導致了部分像素丟失,保存圖片為tif格式或者png格式,即可以解決此問題
cv.imwrite('mini2.png', image) image = cv.imread('mini2.png',0)