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)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)