opencv python3 找图片色块_Python 图像处理 OpenCV (3):图像属性、图像感兴趣 ROI 区域及通道处理...
前文傳送門:
圖像屬性
圖像屬性包括行數,列數和通道數,圖像數據類型,像素數等。
1. 形狀:shape
圖像的形狀可以通過 shape 關鍵字進行獲取,使用 shape 關鍵的后,獲取的信息包括行數、列數、通道數的元祖。
示例如下:import cv2 as cv
# 讀取彩色圖片
color_img = cv.imread("maliao.jpg", cv.IMREAD_ANYCOLOR)
print(color_img.shape)
# 結果打印
(310, 560, 3)
# 讀取灰度圖片
gray_img = cv.imread("maliao.jpg", cv.IMREAD_GRAYSCALE)
print(gray_img.shape)
# 結果打印
(310, 560)
2. 像素數量:size
圖像的像素數量可以通過關鍵字 size 進行獲取。import cv2 as cv
# 讀取彩色圖片
color_img = cv.imread("maliao.jpg", cv.IMREAD_ANYCOLOR)
print(color_img.size)
# 結果打印
520800
# 讀取灰度圖片
gray_img = cv.imread("maliao.jpg", cv.IMREAD_GRAYSCALE)
print(gray_img.size)
# 結果打印
173600
3. 圖像類型-dtype
圖像類型是通過關鍵字 dtype 獲取的,通常返回 uint8 ,這個屬性在彩色圖片和灰度圖片中是保持一致的。import cv2 as cv
# 讀取彩色圖片
color_img = cv.imread("maliao.jpg", cv.IMREAD_ANYCOLOR)
print(color_img.dtype)
# 結果打印
uint8
# 讀取灰度圖片
gray_img = cv.imread("maliao.jpg", cv.IMREAD_GRAYSCALE)
print(gray_img.dtype)
# 結果打印
uint8
獲取圖像感興趣 ROI 區域
ROI(Region of Interest)表示感興趣區域。
它是指從被處理圖像以方框、圓形、橢圓、不規則多邊形等方式勾勒出需要處理的區域。可以通過各種算子(Operator)和函數求得感興趣ROI區域,并進行圖像的下一步處理,被廣泛應用于熱點地圖、人臉識別、圖像分割等領域。
如果我們要對于圖像中的眼睛檢測,首先對整個圖像進行人臉檢測。在獲取人臉圖像時,我們只選擇人臉區域,搜索其中的眼睛,而不是搜索整個圖像。它提高了準確性(因為眼睛總是在面部上:D )和性能(因為我們搜索的區域很小)。
我們通過像素矩陣可以直接得到 ROI 區域,如: img[200:400, 200:400] 。
比如下面這個示例我們獲取馬里奧的臉,然后再把它顯示出來:import cv2 as cv
img = cv.imread("maliao.jpg", cv.IMREAD_UNCHANGED)
face = img[10:175, 100:260]
# 原始圖像顯示
cv.imshow("demo", img)
# 馬里奧的臉顯示
cv.imshow("face", face)
#等待顯示
cv.waitKey(0)
cv.destroyAllWindows()
它的結果如下:
如果我們要把這兩張圖像合成一張圖像,可以對圖像進行區域賦值:import cv2 as cv
img = cv.imread("maliao.jpg", cv.IMREAD_UNCHANGED)
# 獲取 ROI 區域
face = img[10:175, 100:260]
# 圖像賦值
img[0:165, 0:160] = face
# 原始圖像顯示
cv.imshow("demo", img)
#等待顯示
cv.waitKey(0)
cv.destroyAllWindows()
結果如下:
這里我稍微偷點懶,直接就把 ROI 區域放在了圖片的左上角,這個位置可以隨意指定,但是指定的區域要和 ROI 的區域一樣大,否則會報一個 ValueError 的錯誤。
拆分和合并圖像通道
1. 拆分圖像通道
有些時候,我們需要分別處理圖像的 B,G,R 通道。的通道,用 PS 摳過圖的人應該都清楚摳圖的時候可以使用單通道進行摳圖操作。
將圖像的通道拆分出來可以使用 split() 函數,如下:import cv2 as cv
img = cv.imread("maliao.jpg", cv.IMREAD_UNCHANGED)
#拆分通道
b, g, r = cv.split(img)
# 分別顯示三個通道的圖像
cv.imshow("B", b)
cv.imshow("G", g)
cv.imshow("R", r)
# 等待顯示
cv.waitKey(0)
cv.destroyAllWindows()
結果如下:
可以看到,三個通道的圖像看起來都是灰白色的,這個玩過 PS 的人應該都很熟悉。
除了使用 split() 函數獲取圖像通道,還可以通過索引進行獲取,代碼如下:b = img[:, :, 0]
g = img[:, :, 1]
r = img[:, :, 2]
如果需要將所有紅色像素都設置為零,無需先拆分通道,索引更快:img[:, :, 2] = 0
2. 合并圖像通道
合并圖像通道我們使用函數 merge() ,示例如下:import cv2 as cv
img = cv.imread("maliao.jpg", cv.IMREAD_UNCHANGED)
# 拆分通道
b, g, r = cv.split(img)
# 合并圖像通道
m = cv.merge([r, g, b])
cv.imshow('merge', m)
# 等待顯示
cv.waitKey(0)
cv.destroyAllWindows()
結果如下:
這里如果是按照 [r, g, b] 進行圖像通道合并,我們的馬里奧就會變身成為藍精靈,因為 OpenCV 是按照 BGR 讀取的,如果想要顯示會原圖,合并的時候也按照 [b, g, r] 合并即可,如下:
如果我們想要做一個真正的藍精靈,可以只提取 B 顏色通道,其余兩個 G 、 R 通道全部設置為 0 ,這樣,我們就獲得了一個真正的藍精靈(整個圖像只有藍色通道),代碼如下:import cv2 as cv
import numpy as np
# 讀取圖片
img = cv.imread("maliao.jpg", cv.IMREAD_UNCHANGED)
rows, cols, chn = img.shape
# 拆分通道
b = img[:, :, 0]
g = np.zeros((rows,cols), dtype=img.dtype)
r = np.zeros((rows,cols), dtype=img.dtype)
# 合并圖像通道
m = cv.merge([b, g, r])
cv.imshow('merge', m)
# 等待顯示
cv.waitKey(0)
cv.destroyAllWindows()
結果如下:
同理,如果想要綠精靈和紅精靈,一樣可以做出來。
示例代碼
如果有需要獲取源碼的同學可以在公眾號回復「OpenCV」進行獲取。
參考
總結
以上是生活随笔為你收集整理的opencv python3 找图片色块_Python 图像处理 OpenCV (3):图像属性、图像感兴趣 ROI 区域及通道处理...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python读什么类型文件最快的软件_使
- 下一篇: python异常处理机制的好处_浅谈Py