目錄
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)灰度圖像返回 [行數 列數] ;
(2)彩色圖像返回 [行數 列數 通道數] 。
代碼如下:
# -*- coding:utf-8 -*-
import cv2
import numpy
#讀取圖片
img = cv2.imread("lena.tiff", cv2.IMREAD_UNCHANGED)
#獲取圖像形狀
print(img.shape)
#獲取像素數目
print(img.size)
運行結果如下圖所示:(512,512,3)共 5125123=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