【Opencv3+Python3入门(8)分割ROI兴趣区域与漫水填充】

在常见的计算机视觉问题中,通常我们只对图像中的某一部分区域感兴趣,比如人脸区域等,因此我们只需要对人脸区域部分进行提取,然后再进行后续的操作。

 

图像ROI兴趣区域
 

对于图像ROI区域,只需要将自己预先计算好的区域大概范围的图像值赋值给新的变量并显示即可。最方便的方式是使用Numpy来进行获取图像数组数据。

#8.1,图片ROI切割
import cv2 as cv
import numpy as np

def image_Clip(image):
    #自己预先数好的大概位置范围
    mask=image[30:160,100:240]
    cv.namedWindow("mask",0)
    cv.imshow("mask",mask)
    cv.imshow("image",image)
src=cv.imread('F:\OutputResult\SrcImage\saber18.jpg')
print(src.shape)
image_Clip(src)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果:

 

漫水填充

#8.2,漫水填充floodfill函数
import cv2 as cv
import numpy as np

def floodFill_Demo(image):
    #复制创建一个图像副本
    print(image.shape)
    copyImage=image.copy()
    h,w=copyImage.shape[:2]
    #此处注意掩膜的高宽要比原始图像多2,
    #即上下左右各多一个像素大小,防止填充失败。
    #注意:模板mask为单通道8位。
    mask=np.zeros([h+2,w+2],image.dtype)
    cv.floodFill(copyImage,mask,(30,30), (255,0, 255),(100, 100, 100), (50, 50, 50),cv.FLOODFILL_FIXED_RANGE)
    cv.imshow("floodImage",copyImage)

src=cv.imread('F:\OutputResult\SrcImage\saber18.jpg')
floodFill_Demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

函数参数说明:

cv.floodFill(image, mask, seedPoint, newVal[, loDiff[, upDiff[, flags]]])

填充规则:

src(seed.x,seed.y)-loDiff<=src(x,y)<=src(seed.x,seed.y)+upDiff

上述案例:

(image,mask,(0,80), (22, 22, 222),(100, 100, 100), (50, 50, 100),cv.FLOODFILL_FIXED_RANGE)

image:图像输入/输出1或3通道、8位或浮点图像。

mask:填充模板,整体填充不能跨越输入遮罩中的非零像素。例如,边缘检测器输出可以用作遮罩,以停止边缘填充。输出时,像素

与图像中填充像素对应的遮罩设置为1或标志中指定的值。

seedPoint:参数种子点起始点。

newVal:重新绘制的域像素的新值。表示填充区域颜色

loDiff:(100, 100, 100)表示种子点位置的像素三通道的像素值减去该值,表示为低值

upDiff:(50, 50, 50)表示表示种子点位置的像素三通道的像素值加上该值,表示为高值

flags:参数标志操作标志。

cv.FLOODFILL_FIXED_RANGE:表示在该低值与高值范围内的全部填充为区域颜色。改变图像,漫水(泛洪)填充。

cv.FLOODFILL_MASK_ONLY:不改变图像,只填充模板本身,忽略新的颜色值参数。

 

只对模板区域填充

 

即修改flags参数:cv.FLOODFILL_MASK_ONLY

import cv2 as cv
import numpy as np

def fill_binary():
    #创建一个三通道的图像值均为0
    image=np.zeros([400,400,3],np.uint8)
    #设置一个ROI区域大小,并将该区域的值设置为255
    image[100:300,100:300,:]=255
    cv.imshow("fill_binary",image)
    h,w=image.shape[:2]
    mask=np.zeros([h+2,w+2],np.uint8)
    #设置填充区域的初始值
    mask[101:301,101:301]=0
    cv.floodFill(image,mask,(200,200),(255,0,255),cv.FLOODFILL_MASK_ONLY)
    cv.imshow("filled_demo",image)

fill_binary()
cv.waitKey(0)
cv.destroyAllWindows()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值