1. 程式人生 > 其它 >OpenCV Python(2、影象元素的訪問、通道分離與合併

OpenCV Python(2、影象元素的訪問、通道分離與合併

訪問元素

OpenCV影象是numpy.array型別的二維或三維陣列。一個8位灰度影象是一個包含位元組值的二維陣列。一個24位的BGR映像是一個三維陣列,也包含位元組值。

我們可以通過使用諸如影象[0,0]或影象[0,0,0]等表示式來訪問這些值。

第一個索引是畫素的y座標,或者行,0是頂部。第二個索引是畫素的x座標,或者列,0是最左邊的。第三個索引(如果適用)表示一個顏色通道。

畫素的訪問和訪問numpy中ndarray的方法完全一樣,灰度圖為:

img[j,i] = 255

其中j,i分別表示影象的行和列。對於BGR影象,為

img[j,i,0]= 255
img[j,i,1]= 255
img[j,i,
2]= 255

第三個數表示通道。對於BGR影象,有三個通道

下面通過對影象新增人工的椒鹽現象來進一步說明OpenCV Python中需要注意的一些問題。完整程式碼如下

import cv2
import numpy as np
#模擬隨機椒鹽噪聲,因為BGR影象是三通道,所以每一個畫素點都是三維的值,B,G,R=255時表示白色
def salt(img, n): for k in range(n): i = int(np.random.random() * img.shape[1]); #產生0-1的隨機浮點數

j = int(np.random.random() * img.shape[0]);
if img.ndim == 2: 
            img[j,i] = 255
        elif img.ndim == 3: 
            img[j,i,0]= 255
            img[j,i,1]= 255
            img[j,i,2]= 255
    return img
 
if __name__ == '__main__':
    img = cv2.imread("ustcred.jpg")
    saltImage = salt(img, 500)
    cv2.imshow("Salt", saltImage)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == '__main__':的作用(來源:(18條訊息) Python中if __name__ == '__main__':的作用和原理_二黑的部落格-CSDN部落格

一個python檔案通常有兩種使用方法,第一是作為指令碼直接執行,第二是 import 到其他的 python 指令碼中被呼叫(模組重用)執行。因此if __name__ == 'main':的作用就是控制這兩種情況執行程式碼的過程,在if __name__ == 'main': 下的程式碼只有在第一種情況下(即檔案作為指令碼直接執行)才會被執行,而 import 到其他指令碼中是不會被執行的。舉例說明如下:

  • 直接執行

直接執行 test.py,結果如下圖,可以成功 print 兩行字串。即,if __name__=="__main__": 語句之前和之後的程式碼都被執行。

  • import 執行

然後在同一資料夾新建名稱為 import_test.py 的指令碼,輸入如下程式碼:

執行import_test.py 指令碼,輸出結果如下:

只輸出了第一行字串。即,if __name__=="__main__": 之前的語句被執行,之後的沒有被執行。

if __name__ == '__main__':的執行原理

每個python模組(python檔案,也就是此處的 test.py 和 import_test.py)都包含內建的變數 __name__,當該模組被直接執行的時候,__name__ 等於檔名(包含字尾 .py );如果該模組import到其他模組中,則該模組的 __name__ 等於模組名稱(不包含字尾.py)。

而“__main__” 始終指當前執行模組的名稱(包含字尾.py)。進而當模組被直接執行時,__name__ == 'main' 結果為真。

通道分離和合並

    #通道分離
    #使用opencv的split
    b,g,r=cv2.split(img)
    #觀察上句可知,split返回的是一個列表,如果只想獲得其中一個通道,只需要使用[]獲得其中元素即可,如b=cv2.split(img)[0]
    cv2.imshow("cheongsam_blue",b)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    #通道合併
    merged = cv2.merge([b, g, r])  # 前面分離出來的三個通道