python3+Opencv 搭建環境和基本操做

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)
相關文章
相關標籤/搜索