【OpenCV基础笔记5】ROI与泛洪填充

2 篇文章 0 订阅
2 篇文章 0 订阅

一、ROI(region of interest)

ROI(Region of interest),即感兴趣区域。有时在对一幅图像进行处理分析时,需要对其特定区域进行操作。例如我们需要检测一副人像中眼睛的位置,我们首先应在图像中找到人脸,再在人脸的区域范围内找到眼睛,这样可以提高程序执行的准确性和性能,而不是直接在一副图像中进行全局搜索。

如现在需要对Lena图像中的脸部作为ROI区域,并对该区域进行灰度处理,代码如下:

import cv2 as cv

src = cv.imread("lena256.tif")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)

face = src[80:200, 100:200]
gray = cv.cvtColor(face, cv.COLOR_BGR2GRAY)      # 将3通道的彩色图像转换为灰度图像
backface = cv.cvtColor(gray, cv.COLOR_GRAY2BGR)  # 将单通道的灰度图像变为三通道的图像
src[80:200, 100:200] = backface
cv.imshow("face", src)

cv.waitKey(0)
cv.destroyAllWindows()

 处理结果如下图所示:

二、泛洪填充

泛洪填充算法(Flood Fill Algorithm),又叫洪水填充算法或者漫水填充算法。泛洪填充算法的原理就是从一个点开始,将该点附近像素点填充成新的颜色,直到封闭区域内的所有像素点都被填充新颜色为止。该算法经常用来标记或者分离图像的一部分,从而进行处理或分析。漫水填充也可以从输入图像获取掩码区域,掩码会加速处理过程,或者只处理掩码指定的像素点。

泛洪填充算法在OpenCV中所用到的API为floodFill(),在Python中该函数定义为:

def floodFill(image, mask, seedPoint, newVal, loDiff=None, upDiff=None, flags=None)
入口参数含义
image原始图像
mask掩膜
seedPoint种子点(即起始点)
newVal被填充的像素点新的像素值(即新的颜色)
loDiff当前的观察点像素值与其相邻区域像素值或待加入该区域的像素之间的亮度或颜色之间负差的最大值(即起始点像素值减去该像素值为兴趣区域范围的最小像素值)
upDiff当前的观察点像素值与其相邻区域像素值或待加入该区域的像素之间的亮度或颜色之间负差的最小值(即起始点像素值加上该像素值为兴趣区域范围的最大像素值)
flag标志位:CV_FLOODFILL_FIXED_RANGE 或CV_FLOODFILL_MASK_ONLY

CV_FLOODFILL_FIXED_RANGE 与 CV_FLOODFILL_MASK_ONLY区别:

(1)当标志位为CV_FLOODFILL_FIXED_RANGE时,待处理的像素点与种子点作比较,在范围之内,则填充此像素,改变图像。

(2)当标志位为CV_FLOODFILL_MASK_ONLY时,函数不会去改变原始图像,而是去填充掩码图像mask,mask的指定的位置为0时才填充,不为0不填充。

实例一:采用cv.CV_FLOODFILL_FIXED_RANGE进行彩色图像的填充

import cv2 as cv
import numpy as np


# 彩色图像的填充
def fill_color_demo(image):
    copyImg = image.copy()
    # 使用的截断,获取shape的前两个属性
    h, w = image.shape[0:2]
    # 注意mask遮罩层为0 类型为一个uint8 比原始图像长宽都多2(固定写法)
    mask = np.zeros([h+2, w+2], np.uint8)

    cv.floodFill(copyImg, mask, (30, 30), (0, 255, 255), (100, 100, 100), (50, 50, 50), cv.FLOODFILL_FIXED_RANGE)

    cv.imshow("fill_color_demo", copyImg)


src = cv.imread("lena256.tif")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)

fill_color_demo(src)

cv.waitKey(0)
cv.destroyAllWindows()

 程序运行结果如下图所示:

实例二:采用cv.CV_FLOODFILL_MASK_ONLY进行二值化图像的填充

import cv2 as cv
import numpy as np


# 二值化图像填充
def fill_binary_demo():
    image = np.zeros([400, 400, 3], np.uint8)
    image[100:300, 100:300, :] = 255
    cv.imshow("fill_binary_before", image)

    h, w = image.shape[0:2]
    mask = np.ones([h+2, w+2, 1], np.uint8)
    mask[101:301, 101:301] = 0  # 注意:mask的ROI区域必须为0才可以进行填充
    cv.floodFill(image, mask, (200, 200), (0, 0, 255), cv.FLOODFILL_MASK_ONLY)
    cv.imshow("filled_binary_after", image)


src = cv.imread("lena256.tif")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)

fill_color_demo(src)

cv.waitKey(0)
cv.destroyAllWindows()

程序运行结果如下图所示:

 

 

参考链接:

https://blog.csdn.net/weixin_42508025/article/details/84029054

https://blog.csdn.net/Galen_xia/article/details/103455683

充电视频

 

 

 

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜来疯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值