參考文章:
OpenCV數字影像處理之ROI區域的提取_xiaoheizi_du的博客-CSDN博客_roi區域提取OpenCV數字影像處理之ROI區域的提取利用mask(掩模)技術提取純色背景影像ROI區域中的人和物,并將提取出來的人或物添加在其他影像上,1、實作原理先通過cv.cvtColor()函式,將原RGB彩色影像轉換為hsv色彩空間的影像,然后通過cv.inRange()函式獲得ROI區域的Mask,最后利用cv.bitwise()函式提取得到ROI區域,2、使用的函式簡述(1) cv.c...https://blog.csdn.net/xiaoheizi_du/article/details/88072871?ops_request_misc=&request_id=&biz_id=102&utm_term=python%20opencv%E6%8A%8AROI%E6%8F%90%E5%8F%96&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-88072871.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187
使用的函式
(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 的尺寸必須要相同,
實操
步驟與上面那篇文章相同,將背景換為了紅色
中間程序生成影像如下
原圖

高斯濾波去除噪聲點

BGR2HSV

第一次mask,這種是把綠色和青色位置的區域識別出來了,但我們想要的是人物的區域,所以得進行一次取反操作

取反,得到mask

按位與操作,結合mask,取出doctor人物

新建一張新的背景圖,這里用紅色的

得把背景中doctor位置的像素摳出來,以便后續的cv2.add()操作

doctor占坑,成功!

代碼如下
import cv2 as cv
import numpy as np
# 主要使用的函式:
# cv.cvtColor(img, cv.COLOR_BGR2HSV)
# cv.inRange(hsv, (h_min, s_min, v_min), (h_max, s_max, v_max))
# cv.bitwise_and(img1, img2, mask), cv.bitwise_or(img1, img2, mask), cv.bitwise_not(img)
# cv.add(img1, img2)
def cvshow(name, img):
cv.imshow(name, img)
cv.waitKey(0)
cv.destroyAllWindows()
# 輸入原始影像
src = cv.imread('test1.png')
cvshow('test1', src)
# 影像降噪預處理
src = cv.GaussianBlur(src, (5, 5), 1)
cvshow('gaussianblur', src)
# 獲取mask
hsv = cv.cvtColor(src, cv.COLOR_BGR2HSV)
cvshow('hsv', hsv)
mask = cv.inRange(hsv, (35, 43, 46), (99, 255, 255))
cvshow('mask', mask)
mask = cv.bitwise_not(mask)
cvshow('mask2', mask)
# 獲取人物
doctor = cv.bitwise_and(src, src, mask=mask)
cvshow('doctor', doctor)
# 新建一張與原始圖一樣大小的紅色背景圖
background = np.zeros(src.shape, src.dtype)
background[:, :, 2] = 255 # 紅色,background[:, :, 0]藍色通道,background[:, :, 1]綠色通道
cvshow('background', background)
# 得到紅色背景的mask
mask = cv.bitwise_not(mask)
redback = cv.bitwise_and(background, background, mask=mask)
cvshow('redback', redback)
# 將人物圖貼到紅色背景上
dst = cv.add(redback, doctor)
cvshow('dst', dst)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/382984.html
標籤:其他
下一篇:R-FCN:走向全卷積的網路
