Python+opencv学习记录5:ROI与泛洪填充

文章目录

  • 1.概念
    • 1.1.ROI
    • 1.2.泛洪填充算法
  • 2.代码实现
    • 2.1.ROI
    • 2.2.泛洪填充
  • 完整代码

1.概念

1.1.ROI

ROI(region of interest),感兴趣区域。机器视觉、图像处理中,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,ROI。在图像处理领域,感兴趣区域(ROI) 是从图像中选择的一个图像区域,这个区域是你的图像分析所关注的重点。圈定该区域以便进行进一步处理。使用ROI圈定你想读的目标,可以减少处理时间,增加精度。

1.2.泛洪填充算法

泛洪填充算法(Flood Fill Algorithm)又称洪水填充算法,是在很多图形绘制软件中常用的填充算法,最熟悉不过就是windows paint的油漆桶功能。算法的原理很简单,就是从一个点开始,附近像素点填充成新的颜色,直到封闭区域内的所有像素点都被填充成新的颜色为止。
泛洪填充算法最常见的有四邻域像素填充法,八邻域像素填充法,基于扫描线的填充法。

2.代码实现

2.1.ROI

我们可以通过numpy来获取ROI,代码如下:

face = src[200:400, 200:380]
cv.imshow("face", face)

我们可以得到如下效果:
原图:Python+opencv学习记录5:ROI与泛洪填充_第1张图片
通过框定后:
Python+opencv学习记录5:ROI与泛洪填充_第2张图片
我们要在原图相中获得ROI时,可以通过以下操作:

face = src[200:400, 200:380]                        # 获取ROI区域:高度、宽度
gray = cv.cvtColor(face, cv.COLOR_BGR2GRAY)         # ROI区域转化为单通道灰度图像
backface = cv.cvtColor(gray, cv.COLOR_GRAY2BGR)     # 单通道灰度图像转化为三通道BGR图像
src[200:400, 200:380] = backface                    # 在原图像中标记出ROI
cv.imshow("face", src)

得到的效果为:
Python+opencv学习记录5:ROI与泛洪填充_第3张图片
此时我们可以看到莱娜的脸被标记了出来,达到了预期效果。

2.2.泛洪填充

同样我们还是操作莱娜的这张图像实现彩色填充,代码如下:

def fill_color_demo(image):
    copyImg = image.copy()
    h, w = image.shape[:2]
    mask = np.zeros([h+2, w+2], np.uint8)   # 创建新矩阵,+2是函数需求
    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)

从(30,30)这个像素点开始,最低是(30-100,30-100),最高是(30+50,30+50),在此范围内都被填充为黄色。
效果为:
Python+opencv学习记录5:ROI与泛洪填充_第4张图片
接下来我们要实现二值填充,代码如下:

def fill_binary():
    image = np.zeros([400, 400, 3], np.uint8)   # 创建图像,长,宽,通道,类型
    image[100:300, 100:300, :] = 255            # 所有通道赋值255
    cv.imshow("fill_binary", image)

    mask = np.ones([402, 402, 1], np.uint8)
    mask[101:301, 101:301] = 0
    cv.floodFill(image, mask, (200, 200), (0, 0, 255), cv.FLOODFILL_MASK_ONLY)
    cv.imshow("filled binary", image)

得到的效果为:
Python+opencv学习记录5:ROI与泛洪填充_第5张图片
Python+opencv学习记录5:ROI与泛洪填充_第6张图片
由上述图像可得,白色区域被填充成了红色。

完整代码

import cv2 as cv                # 导入opencv模块
import numpy as np              # 导入数学函数库
'''
    通俗解释:floodFill( 1.操作的图像, 2.掩模, 3.起始像素值,4.填充的颜色, 5.填充颜色的低值, 6.填充颜色的高值 ,7.填充的方法)
    参数5.填充颜色的低值就是:参数3 减去 参数5
    参数6.填充颜色的高值就是:参数3 加上 参数6
    即是这两个数值之间的色素替换为参数4的颜色

    FLOODFILL_FIXED_RANGE   颜色填充
    FLOODFILL_MASK_ONLY mask的指定的位置为零时才填充,不为零不填充
'''

def fill_color_demo(image):
    copyImg = image.copy()
    h, w = image.shape[:2]
    mask = np.zeros([h+2, w+2], np.uint8)   # 创建新矩阵,+2是函数需求
    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)


def fill_binary():
    image = np.zeros([400, 400, 3], np.uint8)   # 创建图像,长,宽,通道,类型
    image[100:300, 100:300, :] = 255            # 所有通道赋值255
    cv.imshow("fill_binary", image)

    mask = np.ones([402, 402, 1], np.uint8)
    mask[101:301, 101:301] = 0
    cv.floodFill(image, mask, (200, 200), (0, 0, 255), cv.FLOODFILL_MASK_ONLY)
    cv.imshow("filled binary", image)


print("------------hello python!------------")

src = cv.imread("D:/opencv3/image/lena.png")
cv.namedWindow("input_image", cv.WINDOW_AUTOSIZE)
cv.imshow("input_image", src)
# fill_color_demo(src)
fill_binary()

# face = src[200:400, 200:380]                        # 获取ROI区域:高度、宽度
# gray = cv.cvtColor(face, cv.COLOR_BGR2GRAY)         # ROI区域转化为单通道灰度图像
# backface = cv.cvtColor(gray, cv.COLOR_GRAY2BGR)     # 单通道灰度图像转化为三通道BGR图像
# src[200:400, 200:380] = backface                    # 在原图像中标记出ROI
# cv.imshow("face", src)


cv.waitKey(0)
cv.destroyAllWindows()          # 释放所有窗口

你可能感兴趣的:(Python+opencv学习)