OpenCV+python:ROI与泛洪填充

1,ROI
感兴趣区(Region of Interest,ROI) 是图像的一部分,它通过在图像上选择或使用诸如设定阈值(thresholding) 或者从其他文件(如矢量> 转换获得等方法生成。机器视觉、图像处理中,感趣区可以是从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,通常用来作为图像分类的样本、掩膜、裁剪区或及其他操作。
源代码:

import cv2 as cv
import numpy as np

src = cv.imread("F:/images/lena.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)

ROI = src[50:250, 100:300]     #假设我们对她的帽子感兴趣,指定宽高的区域
gray = cv.cvtColor(ROI, cv.COLOR_BGR2GRAY) #转换成灰度图
backROI = cv.cvtColor(gray, cv.COLOR_GRAY2BGR)  #还原为RGB图
src[50:250, 100:300] = backROI  #重新置在原图中(ROI操作)
cv.imshow("hat", src)

cv.waitKey(0)
cv.destroyAllWindows()

运行结果:
OpenCV+python:ROI与泛洪填充_第1张图片OpenCV+python:ROI与泛洪填充_第2张图片

2,泛洪填充算法(Flood Fill Algorithm)

泛洪填充算法又称洪水填充算法,是在很多图形绘制软件中常用的填充算法,最熟悉不过就是windows paint的油漆桶功能。算法的原理很简单,就是从一个点开始附近像素点,填充成新的颜色,直到封闭区域内的所有像素点都被填充新颜色为止。泛红填充实现最常见有四邻域像素填充法,八邻域像素填充法,基于扫描线的像素填充方法。根据实现又可以分为递归与非递归(基于栈)。所谓的floodFill 漫水填充就是在一张图片中,和种子点像素相差在[-loDiff,+upDiff]的时候就用newVal来填充这个点。

def floodFill(image, mask, seedPoint, newVal, loDiff=None, upDiff=None, flags=None):

1.操作的图像, 
2.掩码, 
3.起始像素值,  #我们指定的第一个点的三个通道值
4.填充的颜色, 
5.填充颜色的低值, 参数3的三通道值 减去 参数5  #低值三通道
6.填充颜色的高值 , 参数3的三通道值 加上 参数6  #高值三通道
7.填充的方法       #彩色图像一般是FLOODFILL_FIXED_RANGE 指定颜色填充;还有一种是FLOODFILL_MASK_ONLY,mask的指定的位置为零时才填充,不为零不填充

源代码:

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)  #+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
    cv.imshow("fill_binary", image)

    mask = np.ones([402, 402, 1], np.uint8) #为1不填充,为0才进行填充,默认mask是单通道的,通道数1可写可不写
    mask[101:301, 101:301] = 0 #加一的原因是mask[h+2,w+2],imge原来的ROI区域对应的是mask[+1,+1]的区域
    cv.floodFill(image, mask, (200, 200), (100, 2, 255), cv.FLOODFILL_MASK_ONLY) # 最好写到我们填充的图像中间
    cv.imshow("filled binary", image)

src = cv.imread("F:/images/lena.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
fill_color_demo(src)
fill_binary()


cv.waitKey(0)
cv.destroyAllWindows()

运行结果:
彩色填充
OpenCV+python:ROI与泛洪填充_第3张图片OpenCV+python:ROI与泛洪填充_第4张图片
二值填充
OpenCV+python:ROI与泛洪填充_第5张图片
OpenCV+python:ROI与泛洪填充_第6张图片

你可能感兴趣的:(OpenCV/基本图像处理算法)