OpenCV3 for python3 學習筆記2


  1、安裝

    如果你是第一次使用OpenCV Python開發包,想要安裝OpenCV Python只要執行如下命令行即可:

    pip install opencv-python

     如果你還想使用OpenCV Python的擴展模塊,執行如下命令行即可:

    pip install opencv-contrib-python

     如果你已經安裝了OpenCV以前的3.x版本只需要執行對應的升級安裝命令行如下(假設你已經安裝opencv-python 3.x)

    pip install –upgrade opencv-python

     如果在安裝的時候遇到python命令不識別或者pip命令行不識別,請執行如下的命令行實現安裝:

    python –m pip install opencv-python
    或者
    python –m pip install opencv-contrib-python

 

   2、圖像與原始字節之間的轉換

    從概念上講,一個字節能表示0到255的整數。目前,對於多有的實時圖像應用而言,雖然有其他的表示形式,但一個像素通常由每個通道的一個字節表示。

    一個OpenCV圖像是.array類型的二維或三維數組。8位的灰度圖像是一個含有字節值的二維數組。一個24位的BGR圖像是一個三維數組,它也包含了字節值。

  可使用表達式訪問這些值,如image[0,0]或image[0,0,0]。第一個值代表像素的y坐標啊或行,0表示頂部;第二個值是像素的x坐標或列,0表示最左邊;

    第三個值(如果可用的話)表示顏色通道。如,對於一個左上角有白色像素的8位灰度圖像而言,image[0,0]的值為255. 對於一個左上角有藍色像素的24位BGR圖像而言,image[0,0]是[255,0,0]。

    可以用另外一個表示,如image[0,0]或image[0,0]=128,還可表示成image.item((0,0))或image.setitem((0,0),128)。對於單像素操作,第二種表示方式更有效。

    若一幅圖像的每個通道為8位,則可將其顯示轉換為標准的一維Python bytearray格式:byteArray = bytearray(image)

    反之,bytearray含有恰當順序的字節,可以通過顯示轉換和重構,得到numpy.array形式的圖像:

    garyImage = numpy.array(garyByteArray ).reshape(height, width)

    bgrImage = numpy.array(bgrByteArray ).reshape(height, width, 3)

    下面介紹將含有隨機字節的bytearray轉換為灰度圖像和BGR圖像:

 

import cv2
import numpy as np
import os

# 創建一個120000個隨機字節的數組
randomByteArray = bytearray(os.urandom(120000))  #os.urandom(n) 返回n個隨機byte值的string,作為加密使用
flatNumpyArray = np.array(randomByteArray)

# 將數組轉換為400 x 300的灰度圖像
garyImage = flatNumpyArray.reshape(300, 400)
cv2.imwrite('randomGary.png', garyImage)

# 將數組轉換為400 x 300的彩色圖像
bgrImage = flatNumpyArray.reshape(100, 400, 3)
cv2.imwrite('randomColor.png', bgrImage)

    運行該程序,將會在程序所在目錄中生成兩張灰度圖像(如下所示)。尺寸分別為400 x 100,400 x 400

   

    使用Python標准的os.urandom()函數可隨機生成原始字節,隨后會把該字節轉換為NumPy數組。需要注意的是,諸如numpy.random.randint(0, 256, 120000).reshape(400, 300)

  語句也能直接(並且更高效地)隨機生成NumPy數組。使用os.urandom()函數的原因是該語句有助於展示原始字節的轉換。

 

  3、 使用numpy.array訪問圖像數據

    加載OpenCV圖像最簡單的方式是使用imread()函數,該函數會返回一幅圖像,這幅圖像是一個數組(根據imread()函數輸入參數的不同,該圖像可能是二維數組,也可能是三維數組)。

    y.array結構針對數組操作有很好的優化,它允許某些塊(bulk)操作,這些操作在通常的Python中不可用這些特定的.array操作在OpenCV的圖像處理中會很方便。利用numpy.array

  函數來轉換數組比用普通的Python數組轉換要快得多。

    waitKey()的參數為等待鍵盤觸發的時間,單位為毫秒,其返回值為-1(表示沒有鍵被按下)

img = cv2.imread('flower.png')
img[0,0] = [255, 255, 255]
cv2.imshow('flower', img)
cv2.waitKey()

 

    

    

    在圖像左上方會出現一個白點。

    假設想要改變一個特定像素的藍色值,numpy.array提供了item()方法。該函數有3個參數:x(或左)位置,y(或頂部)位置以及(x,y)位置的數組索引(注意,

  在BGR圖像中,某一位置的數據是按B,G,R的順序保存的三元數組),該函數能返回索引函數的值。另一個方法是通過itemset()函數可設置指定像素在指定通道的值(

  itemset()有兩個參數:一個三元組(x,y和索引)和要設定的值)。如下例子將坐標(150,120)的當前藍色值127變為255

  

img = cv2.imread('flower.png')
print(img.item(150, 120, 0))  # 206 打印當前坐標點的藍色值
img.itemset((150, 120, 0), 255)
print(img.item(150, 120, 0)) #255

    

    建議使用內置的濾波器和方法來處理整個圖像,上述方法只適合於處理特定的小區域。

    下面介紹操作通道:將指定通道(B,G,R)的所有值置為0.(注:通過循環來處理Python數組的效率非常低,應該盡量避免這樣的操作。使用數組索引可以高效地操作像素。

    像素操作是一個高代價的低效操作,特別是在視頻數據處理時,會發現要等很久才能得到結果。可用索引(indexing)來解決該問題)

    以下代碼可將圖像所有的G(綠色)值設為0

    

    通過NumPy數組的索引訪問原始像素,還可設定感興趣區域(Region Of Interest, ROI)。一旦設定了該區域,就可以執行許多操作,例如,將該區域與變量綁定,

  然后設定第二個區域,並將第一個區域的值分配給第二個區域(將圖像的一部分拷貝到該圖像的另一個位置):

    

    

    此外,還可使用numpy.array來獲得圖像其他屬性。

    shape:NumPy返回包含寬度、高度和通道數(如果圖像是彩色的)數組,這在調試圖像類型時很有用;如果圖像是單色或灰度的,將不包含通道值;

    size:該屬性是指圖像像素的大小;

    datatype:該屬性會得到圖像的數據類型(通常為一個無符號整數類型的變量和該類型占的位數,比如unit8類型)

img = cv2.imread('flower.png')
print(img.shape)
print(img.size)
print(img.dtype)

    運行結果:

    (332, 332, 3)

    330672
    uint8

 

 參考:https://www.cnblogs.com/xiaotongtt/p/6601951.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM