數字圖像處理(7): 獲取圖像屬性、感興趣區域(ROI) 和 通道拆分與合併

目錄

1 獲取圖像的屬性

1.1 形狀- shape

1.2 像素數目- size

1.3 圖像類型- dtype

2 獲取圖像的感興趣區域(ROI)

3 圖像的通道拆分與合併

3.1 通道拆分- split()

3.2 通道合併- merge()

參考資料


1 獲取圖像的屬性

圖像的屬性有:

(1)形狀:行、列 和 通道數量;

(2)像素數量;

(3)圖像的數據類型。

 

1.1 形狀- shape

通過shape關鍵字獲取圖像的形狀,返回包含行數、列數、通道數的元祖。其中:

(1)灰度圖像返回行數和列數;

(2)彩色圖像返回行數、列數 和 通道數。

例子如下圖所示:

 

代碼如下:

# -*- coding:utf-8 -*-
import cv2
import numpy

#讀取圖片
img = cv2.imread("lena.tiff", cv2.IMREAD_UNCHANGED)

#獲取圖像形狀
print(img.shape)

#顯示圖像
cv2.imshow("Demo", img)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

運行結果:(該圖像爲512行像素、512列像素、3個通道)

 

1.2 像素數目- size

通過size關鍵字獲取圖像的像素數目,其中

(1)灰度圖像返回 [行數 \times 列數]  ;

(2)彩色圖像返回 [行數 \times 列數 \times 通道數] 。

代碼如下:

# -*- coding:utf-8 -*-
import cv2
import numpy

#讀取圖片
img = cv2.imread("lena.tiff", cv2.IMREAD_UNCHANGED)

#獲取圖像形狀
print(img.shape)

#獲取像素數目
print(img.size)

 

運行結果如下圖所示:(512,512,3)共 512\times512\times3=786432個像素

 

1.3 圖像類型- dtype

通過 dtype 關鍵字獲取圖像的數據類型,通常返回uint8。

代碼如下:

# -*- coding:utf-8 -*-
import cv2
import numpy

#讀取圖片
img = cv2.imread("lena.tiff", cv2.IMREAD_UNCHANGED)

#獲取圖像形狀
print(img.shape)

#獲取像素數目
print(img.size)

#獲取圖像類型
print(img.dtype)

 

運行結果如下:

 

 

2 獲取圖像的感興趣區域(ROI)

ROI (Region of Interest) 表示感興趣區域。它是指從被處理圖像以方框、圓形、橢圓、不規則多邊形等方式勾勒出需要處理的區域。可以通過各種算子(Operator) 和函數求得感興趣ROI,並進行圖像的下一步處理,被廣泛應用於熱點地圖、人臉識別、圖像分割等領域。

 

通過像素矩陣可以直接獲取ROI區域,如img[200:400, 200:400]。

 

代碼示例:

# -*- coding:utf-8 -*-
import cv2
import numpy as np

#讀取圖片
img = cv2.imread("lena.tiff", cv2.IMREAD_UNCHANGED)

#定義200*100矩陣 3對應BGR
face = np.ones((200, 150, 3))

#顯示原始圖像
cv2.imshow("Demo", img)

#顯示ROI區域
face = img[200:400, 200:350]
cv2.imshow("face", face)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

運行結果如下:

 

 

下面將提取的ROI圖像 進行覆蓋到原圖的某個位置(就是修改原圖位置的像素值)。

代碼如下:

# -*- coding:utf-8 -*-
import cv2
import numpy as np

#讀取圖片
img = cv2.imread("lena.tiff", cv2.IMREAD_UNCHANGED)

#定義200*100矩陣 3對應BGR
face = np.ones((200, 150, 3))
#顯示原始圖像
cv2.imshow("Demo", img)

#顯示ROI區域
face = img[200:400, 200:350]

#ROI圖像 覆蓋到原圖的某個區域
img[0:200,0:150] = face
cv2.imshow("face", face)
#顯示修改後的原始圖像
cv2.imshow("Demo", img)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

運行結果如下:

 

 

3 圖像的通道拆分與合併

3.1 通道拆分- split()

OpenCV讀取的彩色圖像由B、G、R三原色組成,可以通過下面代碼獲取不同的通道。

b = img[:, :, 0]
g = img[:, :, 1]
r  = img[:, :, 2]

注意OpenCV與Matlab的區別:Matlab的第一個通道是從1開始的,OpenCV是從0開始的。

 

上面的方式,在之前已經用過了,這裏用 split() 函數函數來拆分RGB圖像的三個通道。

代碼如下:

# -*- coding:utf-8 -*-
import cv2
import numpy as np

# 讀取圖片
img = cv2.imread("lena.tiff", cv2.IMREAD_UNCHANGED)

# 拆分通道
b, g, r = cv2.split(img)

# 顯示原始圖像
cv2.imshow("B", b)
cv2.imshow("G", g)
cv2.imshow("R", r)

# 等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

運行結果如下:

 

當然也可以獲取不同的通道,例如:

b = cv2.split(img)[0]

g = cv2.split(img)[1]

r = cv2.split(img)[2]

代碼如下:

# -*- coding:utf-8 -*-
import cv2
import numpy as np

# 讀取圖片
img = cv2.imread("lena.tiff", cv2.IMREAD_UNCHANGED)

# 拆分通道
b = cv2.split(img)[0]

# 顯示原始圖像
cv2.imshow("B", b)

# 等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

運行結果如下:

 

 

3.2 通道合併- merge()

圖像通道合併主要使用 merge() 函數實現。例如:

m = cv2.merge([b, g, r])

代碼如下:(先拆分RGB通道,再合併RGB通道)

# -*- coding:utf-8 -*-
import cv2
import numpy as np

# 讀取圖片
img = cv2.imread("lena.tiff", cv2.IMREAD_UNCHANGED)

# 拆分通道
b, g, r = cv2.split(img)

# 合併通道
m = cv2.merge([b, g, r])
cv2.imshow("Merge", m)

# 等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

運行結果如下:

 

 

注意: 因爲OpenCV是BRG通道,現在將其通道弄反,確認一下,OpenCV是不是按BRG通道組成的。

 

代碼如下:(僅修改了,合併通道時候,使用RGB合成的)

# -*- coding:utf-8 -*-
import cv2
import numpy as np

# 讀取圖片
img = cv2.imread("lena.tiff", cv2.IMREAD_UNCHANGED)

# 拆分通道
b, g, r = cv2.split(img)

# 合併通道
m = cv2.merge([r, g, b])
cv2.imshow("Merge", m)

# 等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

運行結果如下:(由結果可以看出,OpenCV確實是按BRG通道組成的,哈哈還是很好玩的)

 

 

(1)同時,可以提取圖像的不同顏色,提取 B 顏色通道,而G、R通道像素值均設置爲0,則顯示藍色

代碼如下所示:

# -*- coding:utf-8 -*-
import cv2
import numpy as np

# 讀取圖片
img = cv2.imread("lena.tiff", cv2.IMREAD_UNCHANGED)
rows, cols, chn = img.shape

# 拆分通道
b = cv2.split(img)[0]
g = np.zeros((rows, cols), dtype=img.dtype)
r = np.zeros((rows, cols), dtype=img.dtype)

# 合併通道
m = cv2.merge([b, g, r])
cv2.imshow("Merge", m)

# 等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

運行結果如下所示:

 

 

(2)提取 G 顏色通道,而B、R通道像素值均設置爲0,則顯示綠色

代碼如下所示:

# -*- coding:utf-8 -*-
import cv2
import numpy as np

# 讀取圖片
img = cv2.imread("lena.tiff", cv2.IMREAD_UNCHANGED)
rows, cols, chn = img.shape

# 拆分通道
g = cv2.split(img)[1]
b = np.zeros((rows, cols), dtype=img.dtype)
r = np.zeros((rows, cols), dtype=img.dtype)

# 合併通道
m = cv2.merge([b, g, r])
cv2.imshow("Merge", m)

# 等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

運行結果如下所示:

 

(3)提取 R 顏色通道,而B、G通道像素值均設置爲0,則顯示紅色

代碼如下所示:

# -*- coding:utf-8 -*-
import cv2
import numpy as np

# 讀取圖片
img = cv2.imread("lena.tiff", cv2.IMREAD_UNCHANGED)
rows, cols, chn = img.shape

# 拆分通道
r = cv2.split(img)[2]
b = np.zeros((rows, cols), dtype=img.dtype)
g = np.zeros((rows, cols), dtype=img.dtype)

# 合併通道
m = cv2.merge([b, g, r])
cv2.imshow("Merge", m)

# 等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

運行結果如下所示:

 

 

 

 

參考資料

[1] https://blog.csdn.net/eastmount/article/details/82177300

[2] Python+OpenCV圖像處理

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章