Python+OpenCV数字图像处理之ROI区域的提取
ROI区域又叫感兴趣区域。在机器视觉、图像处理中,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,ROI。本文主要为大家介绍如何通过Python+OpenCV提取ROI区域,需要的朋友可以了解一下
目录
1、实现原理
2、使用的函数简述
3、代码实现过程
(1)读入原始图像
(2)获取mask
(3)获取人物mask
(4)获取人物
(5)新建一张与原始图一样大小的蓝色的背景图
(6)得到蓝色背景的mask
4、整体代码
利用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)读入原始图像
1 2 | src = cv.imread( 'person.jpg' ) cv.imshow( 'src' , src) |
(2)获取mask
1 2 3 | 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区域(白色区域):
1 2 | mask = cv.bitwise_not(mask) cv.imshow( 'mask2' , mask) |
(4)获取人物
将原始图像与原始图像在mask区域进行逻辑与操作,即可获取
1 2 | timg1 = cv.bitwise_and(src, src, mask = mask) cv.imshow( 'timg1' , timg1) |
以上操作即提取了图像中的ROI(卡通人)区域,下面介绍将介绍将提取出来的图贴到其他背景上。
(5)新建一张与原始图一样大小的蓝色的背景图
1 2 | background = np.zeros(src.shape, src.dtype) background[:,:, 0 ] = 255 |
(6)得到蓝色背景的mask
1 2 3 | mask = cv.bitwise_not(mask) dst = cv.bitwise_or(timg1, background, mask = mask) cv.imshow( 'dst1' , dst) |
(7)将人物图贴到蓝色背景上
1 2 | dst = cv.add(dst, timg1) cv.imshow( 'dst2' , dst) |
4、整体代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | 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()<font face = "Arial, Verdana, sans-serif" ><span style = "white-space: normal;" > < / span>< / font> |
以上就是Python+OpenCV数字图像处理之ROI区域的提取的详细内容
原文链接:https://blog.csdn.net/xiaoheizi_du/article/details/88072871