1、必備前提:html
Python3.5及以上版本、pip、windows環境python
2、搭建opencvwindows
該部分能夠建立隔絕的Python環境來引入,參照virtualenv的使用數組
在目標的cmd窗口,依次輸入如下命令:函數
pip install --upgrade setuptools
pip install numpy Matplotlib
pip install opencv-python
若是下載中間出現error或wrong,從新輸入命令便可。ui
若是屢次下載失敗,能夠從http://www.lfd.uci.edu/~gohlke/pythonlibs/直接下載whl包安裝,安裝whl包依然使用pipspa
pip install 包的位置(如:C:\download\xxx.whl)
3、示例代碼.net
讀入圖片:rest
cv.imread(filepath,flags)
filepath:要讀入圖片的完整路徑
flags:讀入圖片的標誌
cv2.IMREAD_COLOR:默認參數,讀入一副彩色圖片,忽略alpha通道(1)
cv2.IMREAD_GRAYSCALE:讀入灰度圖片(0)
cv2.IMREAD_UNCHANGED:顧名思義,讀入完整圖片,包括alpha通道(-1)code
支持 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()
4、圖像的基本操做
建立圖片
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)