OpenCV图像处理—— ROI与泛洪填充

一、ROI

ROI(region of interest),感兴趣区域。机器视觉、图像处理中,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,ROI。

#ROI_test
import cv2 as cv
src=cv.imread('F:/Desktop/image/a.JPG')
cv.namedWindow('image', cv.WINDOW_AUTOSIZE)
cv.imshow('image', src)
face = src[200:250, 100:300]    #选择200:250行、100:300列区域作为截取对象
gray = cv.cvtColor(face, cv.COLOR_RGB2GRAY)  #生成的的灰度图是单通道图像
backface = cv.cvtColor(gray, cv.COLOR_GRAY2BGR)  #将单通道图像转换为三通道RGB灰度图,因为只有三通道的backface才可以赋给三通道的src
src[200:250, 100:300] = backface
cv.imshow("face", src)
cv.waitKey(0)
cv.destroyAllWindows()

 

 二、泛洪填充

      泛洪填充算法也叫漫水填充算法。就是将与种子点相连接的区域换成特定的颜色,通过设置连通方式或像素的范围可以控制填充的效果。用来标记或分离图像的一部分对其进行处理或分析,或者通过掩码来加速处理过程。

Windows画图工具中的油漆桶功能和Photoshop的魔术棒选择功能,都是FloodFill漫水填充的改进和延伸。

    原理:从一个点开始遍历附近像素点,填充成新的颜色,知道封闭区域内所有像素点都被填充成新颜色为止。

    常见实现方法:4邻域像素填充法、8邻域像素填充法、基于扫描线的像素填充法等。

 

#泛洪填充
import cv2 as cv
import numpy as np
def fill_color_demo(image):
    copyImg = image.copy()
    h, w = image.shape[:2]
    mask = np.zeros([h+2, w+2],np.uint8)   #mask必须行和列都加2,且必须为uint8单通道阵列
    #为什么要加2可以这么理解:当从0行0列开始泛洪填充扫描时,mask多出来的2可以保证扫描的边界上的像素都会被处理
    cv.floodFill(copyImg, mask, (220, 250), (0, 255, 255), (100, 100, 100), (50, 50 ,50), cv.FLOODFILL_FIXED_RANGE)
    #cv.floodFill(copyImg, mask, (220, 150), (0, 255, 255), (100, 100, 100), (50, 50 ,50), cv.FLOODFILL_FIXED_RANGE)
    cv.imshow("fill_color_demo", copyImg)

src = cv.imread('F:/Desktop/image/a.JPG')
cv.namedWindow('image', cv.WINDOW_AUTOSIZE)
cv.imshow('image', src)
fill_color_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

 

注意:

1.opencv里的mask都是为uin8类型的单通道阵列。

2.泛洪填充算法也叫漫水填充算法。opencv的floodFill函数原型: floodFill(image, mask, seedPoint, newVal[, loDiff[, upDiff[, flags]]]) -> retval, image, mask, rect

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

  mask:表示掩码,该掩码是单通道8位图像,比image的高度多2个像素,宽度多2个像素。填充时不能穿过输入掩码中的非零像素。

  seedPoint:表示泛洪算法(漫水填充算法)的起始点。

  newVal:表示在重绘区域像素的新值。

  loDiff/upDiff:表示当前观察像素值与其部件邻域像素值或待加入该组件的种子像素之间的亮度或颜色之负/正差的最大值。

  flags参数:操作标志符,包含三部分:

    低八位(0~7位):用于控制算法的连通性,可取4(默认)或8。

    中间八位(8~15位):用于指定掩码图像的值,但是如果中间八位为0则掩码用1来填充。

    高八位(16~32位):可以为0或者如下两种标志符的组合:

FLOODFILL_FIXED_RANGE:表示此标志会考虑当前像素与种子像素之间的差,否则就考虑当前像素与相邻像素的差。FLOODFILL_MASK_ONLY:表示函数不会去填充改变原始图像,而是去填充掩码图像mask,mask指定的位置为零时才填充,不为零不填充。

你可能感兴趣的:(OpenCV图像处理—— ROI与泛洪填充)