Python+OpenCV數字圖像處理之ROI區域的提取
利用mask(掩模)技術提取純色背景圖像ROI區域中的人和物,並將提取出來的人或物添加在其他圖像上。
1、實現原理
先通過cv.cvtColor()函數,將原RGB彩色圖像轉換為hsv色彩空間的圖像,然後通過cv.inRange()函數獲得ROI區域的Mask,最後利用cv.bitwise()函數提取得到ROI區域。
2、使用的函數簡述
(1) cv.cvtColor(img, cv.COLOR_BGR2HSV)函數
img為要進行色彩空間轉換的原圖
cv.COLOR_BGR2HSV即將原圖RGB色彩空間轉換為HSV色彩空間
(2) cv.inRange(hsv, (h_min, s_min, v_min), (h_max, s_max, v_max))函數
cv.inRange函數通過設置不同的h、s、v的min和max閾值可以獲取不同色彩的一個二值的mask圖,下圖為各顏色的閾值表:
(3)cv.bitwise_and(img1, img2, mask),cv.bitwise_or(img1, img2, mask)和cv.bitwise_not(img)
第一個函數為按位與操作函數,將img1和img2在mask的區域內,R,G,B三個分量分別進行按位與操作。第二個函數為按位或操作函數,將img1和img2在mask的區域內,R,G,B三個分量分別進行按位或操作。第三個函數為按位取反操作函數,將img在R,G,B三個分量分別進行按位取反操作。
(4)cv.add(img1, img2)函數
將img1和img2 進行相加操作,img1和img2的尺寸必須要相同。
3、代碼實現過程
原圖如下:
如圖,要從圖中提取出卡通人物,並將其貼在其他背景上。
(1)讀入原始圖像
src = cv.imread('person.jpg') cv.imshow('src', src)
(2)獲取mask
hsv = cv.cvtColor(src, cv.COLOR_BGR2HSV) # 轉換成hsv色彩風格 mask = cv.inRange(hsv, (35, 43, 46), (99, 255, 255)) # 利用inRange產生mask cv.imshow('mask1', mask)
由於背景為綠色,可以提取綠色背景的mask,由上表可以查出綠色和青色的值,設置好參數後,就可以獲得mask(白色區域才是mask區域):
註意:這裡獲取的mask為背景的mask,我們要獲得人物的mask。
(3)獲取人物mask
通過邏輯非操作取反,即可獲得人物的mask區域(白色區域):
mask = cv.bitwise_not(mask) cv.imshow('mask2', mask)
(4)獲取人物
將原始圖像與原始圖像在mask區域進行邏輯與操作,即可獲取
timg1 = cv.bitwise_and(src, src, mask=mask) cv.imshow('timg1', timg1)
以上操作即提取瞭圖像中的ROI(卡通人)區域,下面介紹將介紹將提取出來的圖貼到其他背景上。
(5)新建一張與原始圖一樣大小的藍色的背景圖
background = np.zeros(src.shape, src.dtype) background[:,:,0] = 255
(6)得到藍色背景的mask
mask = cv.bitwise_not(mask) dst = cv.bitwise_or(timg1, background, mask=mask) cv.imshow('dst1', dst)
(7)將人物圖貼到藍色背景上
dst = cv.add(dst, timg1) cv.imshow('dst2', dst)
4、整體代碼
import cv2 as cv
import numpy as np
src = cv.imread('person.jpg')
cv.imshow('src', src)
hsv = cv.cvtColor(src, cv.COLOR_BGR2HSV) # 轉換成hsv色彩風格
mask = cv.inRange(hsv, (35, 43, 46), (99, 255, 255)) # 利用inRange產生mask
cv.imshow('mask1', mask)
cv.imwrite('mask1.jpg', mask)
# 獲取mask
mask = cv.bitwise_not(mask)
cv.imshow('mask2', mask)
cv.imwrite('mask2.jpg', mask)
timg1 = cv.bitwise_and(src, src, mask=mask)
cv.imshow('timg1', timg1)
cv.imwrite('timg1.jpg', timg1)
# 生成背景
background = np.zeros(src.shape, src.dtype)
background[:,:,0] = 255
# 將人物貼到背景中
mask = cv.bitwise_not(mask)
dst = cv.bitwise_or(timg1, background, mask=mask)
cv.imshow('dst1', dst)
cv.imwrite('dst1.jpg', dst)
dst = cv.add(dst, timg1)
cv.imshow('dst2', dst)
cv.imwrite('dst2.jpg', dst)
cv.waitKey(0)
cv.destroyAllWindows()
以上就是Python+OpenCV數字圖像處理之ROI區域的提取的詳細內容,更多關於Python OpenCV ROI區域的提取的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- 使用python和opencv的mask實現摳圖疊加
- Opencv圖像處理之詳解掩膜mask
- python中opencv圖像疊加、圖像融合、按位操作的具體實現
- python opencv膚色檢測的實現示例
- python-opencv中的cv2.inRange函數用法說明