二维码

OpenCV-Python提取图像中的ROI

1270 人阅读 | 时间:2021年12月17日 09:51

参考文章:

使用的函数

(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 图,下图为各颜色的阈值表:

OpenCV-Python提取图像中的ROI

(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 的尺寸必须要相同。

实操

步骤与上面那篇文章相同,将背景换为了红色

中间过程生成图像如下

原图

OpenCV-Python提取图像中的ROI

高斯滤波去除噪声点

OpenCV-Python提取图像中的ROI

BGR2HSV 

OpenCV-Python提取图像中的ROI

第一次mask,这种是把绿色和青色位置的区域识别出来了,但我们想要的是人物的区域,所以得进行一次取反操作 

OpenCV-Python提取图像中的ROI

取反,得到mask 

OpenCV-Python提取图像中的ROI

按位与操作,结合mask,取出doctor人物

OpenCV-Python提取图像中的ROI

新建一张新的背景图,这里用红色的 

OpenCV-Python提取图像中的ROI

得把背景中doctor位置的像素抠出来,以便后续的cv2.add()操作 

OpenCV-Python提取图像中的ROI

doctor占坑,成功! 

OpenCV-Python提取图像中的ROI


代码如下

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)




©著作权归作者所有:来自ZhiKuGroup博客作者没文化的原创作品,如需转载,请注明出处,否则将追究法律责任 来源:ZhiKuGroup博客,欢迎分享。

评论专区
  • 昵 称必填
  • 邮 箱选填
  • 网 址选填
◎已有 8 人评论
  • 游客  发表于 4个月前
    1楼

    在这个版块混了这么久了,第一次看见这么给你的帖子!http://m.baishanct.com

  • 游客  发表于 4个月前
    2楼

    这位作者的文笔极其出色,用词精准、贴切,能够形象地传达出他的思想和情感。http://mobile.snjunying.com

  • 游客  发表于 4个月前
    3楼

    楼上的很有激情啊!http://www.hongshanhl.com

  • 游客  发表于 4个月前
    4楼

    我默默的回帖,从不声张!http://www.783coin.com

  • 游客  发表于 4个月前
    5楼

    世界末日我都挺过去了,看到楼主我才知道为什么上帝留我到现在!http://fch3.mandrake-covi.com

  • 游客  发表于 4个月前
    6楼

    大神好强大!http://www.baishanct.com

  • 游客  发表于 4个月前
    7楼

    楼主是一个神奇的青年!http://www.xwqrpmb.com

  • 游客  发表于 4个月前
    8楼

    支持楼上的!http://es5y.bpkmd.com

搜索
作者介绍
30天热门
×
×
本站会员尊享VIP特权,现在就加入我们吧!登录注册×
»
会员登录
新用户注册
×
会员注册
已有账号登录
×