Python+OpenCV數(shù)字圖像處理之ROI區(qū)域的提取
利用mask(掩模)技術(shù)提取純色背景圖像ROI區(qū)域中的人和物,并將提取出來(lái)的人或物添加在其他圖像上。
1、實(shí)現(xiàn)原理
先通過(guò)cv.cvtColor()函數(shù),將原RGB彩色圖像轉(zhuǎn)換為hsv色彩空間的圖像,然后通過(guò)cv.inRange()函數(shù)獲得ROI區(qū)域的Mask,最后利用cv.bitwise()函數(shù)提取得到ROI區(qū)域。
2、使用的函數(shù)簡(jiǎn)述
(1) cv.cvtColor(img, cv.COLOR_BGR2HSV)函數(shù)
img為要進(jìn)行色彩空間轉(zhuǎn)換的原圖
cv.COLOR_BGR2HSV即將原圖RGB色彩空間轉(zhuǎn)換為HSV色彩空間
(2) cv.inRange(hsv, (h_min, s_min, v_min), (h_max, s_max, v_max))函數(shù)
cv.inRange函數(shù)通過(guò)設(shè)置不同的h、s、v的min和max閾值可以獲取不同色彩的一個(gè)二值的mask圖,下圖為各顏色的閾值表:

(3)cv.bitwise_and(img1, img2, mask),cv.bitwise_or(img1, img2, mask)和cv.bitwise_not(img)
第一個(gè)函數(shù)為按位與操作函數(shù),將img1和img2在mask的區(qū)域內(nèi),R,G,B三個(gè)分量分別進(jìn)行按位與操作。第二個(gè)函數(shù)為按位或操作函數(shù),將img1和img2在mask的區(qū)域內(nèi),R,G,B三個(gè)分量分別進(jìn)行按位或操作。第三個(gè)函數(shù)為按位取反操作函數(shù),將img在R,G,B三個(gè)分量分別進(jìn)行按位取反操作。
(4)cv.add(img1, img2)函數(shù)
將img1和img2 進(jìn)行相加操作,img1和img2的尺寸必須要相同。
3、代碼實(shí)現(xiàn)過(guò)程
原圖如下:

如圖,要從圖中提取出卡通人物,并將其貼在其他背景上。
(1)讀入原始圖像
src = cv.imread('person.jpg')
cv.imshow('src', src)

(2)獲取mask
hsv = cv.cvtColor(src, cv.COLOR_BGR2HSV) # 轉(zhuǎn)換成hsv色彩風(fēng)格
mask = cv.inRange(hsv, (35, 43, 46), (99, 255, 255)) # 利用inRange產(chǎn)生mask
cv.imshow('mask1', mask)

由于背景為綠色,可以提取綠色背景的mask,由上表可以查出綠色和青色的值,設(shè)置好參數(shù)后,就可以獲得mask(白色區(qū)域才是mask區(qū)域):
注意:這里獲取的mask為背景的mask,我們要獲得人物的mask。
(3)獲取人物mask
通過(guò)邏輯非操作取反,即可獲得人物的mask區(qū)域(白色區(qū)域):
mask = cv.bitwise_not(mask)
cv.imshow('mask2', mask)

(4)獲取人物
將原始圖像與原始圖像在mask區(qū)域進(jìn)行邏輯與操作,即可獲取
timg1 = cv.bitwise_and(src, src, mask=mask)
cv.imshow('timg1', timg1)

以上操作即提取了圖像中的ROI(卡通人)區(qū)域,下面介紹將介紹將提取出來(lái)的圖貼到其他背景上。
(5)新建一張與原始圖一樣大小的藍(lán)色的背景圖
background = np.zeros(src.shape, src.dtype) background[:,:,0] = 255
(6)得到藍(lán)色背景的mask
mask = cv.bitwise_not(mask)
dst = cv.bitwise_or(timg1, background, mask=mask)
cv.imshow('dst1', dst)

(7)將人物圖貼到藍(lán)色背景上
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) # 轉(zhuǎn)換成hsv色彩風(fēng)格
mask = cv.inRange(hsv, (35, 43, 46), (99, 255, 255)) # 利用inRange產(chǎn)生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數(shù)字圖像處理之ROI區(qū)域的提取的詳細(xì)內(nèi)容,更多關(guān)于Python OpenCV ROI區(qū)域的提取的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python PyAutoGUI 模擬鼠標(biāo)鍵盤(pán)操作和截屏功能
一款跨平臺(tái)/無(wú)依賴的自動(dòng)化測(cè)試工具,目測(cè)只能控制鼠標(biāo)/鍵盤(pán)/獲取屏幕尺寸/彈出消息框/截屏。這篇文章主要介紹了python PyAutoGUI 模擬鼠標(biāo)鍵盤(pán)操作和截屏功能,需要的朋友可以參考下2019-08-08
python中g(shù)etattr函數(shù)使用方法 getattr實(shí)現(xiàn)工廠模式
這篇文章主要介紹了python中g(shù)etattr()這個(gè)函數(shù)的一些用法,大家參考使用吧2014-01-01
基于Python實(shí)現(xiàn)自制CV剪貼板功能
云桌面的win10不能調(diào)出剪貼板,對(duì)于CV工程師來(lái)說(shuō)十分不方便,所以這篇文章主要介紹了如何使用Python實(shí)現(xiàn)一個(gè)CV剪貼板,提升常用語(yǔ)句的復(fù)制粘貼效率,感興趣的可以了解下2024-02-02
Python的string模塊中的Template類字符串模板用法
通過(guò)string.Template我們可以為Python定制字符串的替換標(biāo)準(zhǔn),這里我們就來(lái)通過(guò)示例解析Python的string模塊中的Template類字符串模板用法:2016-06-06
Python+Selenium實(shí)現(xiàn)無(wú)頭瀏覽器網(wǎng)頁(yè)截圖
這篇文章主要為大家詳細(xì)介紹了Python+Selenium實(shí)現(xiàn)無(wú)頭瀏覽器網(wǎng)頁(yè)截圖的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-03-03

