Python-Opencv中ROI(region of Interest )和泛洪填充(cv2.floodFill())

Python-Opencv中ROI(region of Interest )和泛洪填充(cv2.floodFill())

1. ROI
ROI(region of Interest)从英语来看就是您所感兴趣的区域,也就是挖取您感兴趣的区域。
例如下图你对你这女生的脸部感兴趣,那么这个部分就叫做ROI。
Python-Opencv中ROI(region of Interest )和泛洪填充(cv2.floodFill())_第1张图片
代码实现

import cv2 as cv

# 读入女孩照片
girl = cv.imread("girl.jpg")
# 提取女孩脸部
face = girl[10:180, 100:255, :]
# 显示女孩脸部
cv.imshow("face", face)
# 将ROI从RGB转换为灰度图
gray = cv.cvtColor(face, cv.COLOR_BGR2GRAY)
# 显示RIO灰度图
cv.imshow("gray", gray)
# 尝试使用 cv2.COLOR_GRAY2BGR 将灰度图转化成RGB图,通过这种方式并不能进行转化
gray2rgb = cv.cvtColor(gray, cv.COLOR_GRAY2BGR)
cv.imshow("gray2rgb", gray2rgb)
# 对ROI区域进行通道处理,将 B 通道值赋值为0 相当于丢失 B 通道
face[:, :, 0] = 0
cv.imshow("face_lose_channel_B", face)
# 将处理后的ROI又重新放到原图该有的位置
girl[10:180, 100:255, :] = face
cv.imshow("changed_girl", girl)
cv.waitKey(0)
cv.destroyAllWindows()

Python-Opencv中ROI(region of Interest )和泛洪填充(cv2.floodFill())_第2张图片
一般情况下我们都是将RGB图像转化为灰色图,很少将灰色图又转化为RGB图像。cv2.cvtColor()中有一个参数 cv2.COLOR_GRAY2BGR 并不将灰度图转化为RGB。
RGB图像中有三个维度的信息,每种颜色相当于一个三维向量,表示法则相当于同一个向量在不同的坐标轴下(即不同的基下)的表示。而将其变为灰度后,只剩下一个维度,相当于将三维向量投影为一维标量一样,是不可能回复为原来的向量的。要想恢复,就必须储存另外两个维度的信息,合在一起就是原先的三维向量,这就是原理。

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

泛洪填充函数

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

其中:

  • image:输入图像,可以是一通道或者是三通道。
  • mask:该版本特有的掩膜。 单通道,8位,在长宽上都比原图像image多2个像素点。另
    外,当flag为FLOORFILL_MAK_ONLY时,只会填充mask中数值为0的区域。
  • seedPoint:漫水填充的种子点,即起始点。
  • newVal:被填充的像素点新的像素值
  • loDiff:表示当前的观察点像素值与其相邻区域像素值或待加入该区域的像素之间的亮度或颜色之间负差的最大值。
  • upDiff:表示当前的观察点像素值与其相邻区域像素值或待加入该区域的像素之间的亮度或颜色之间负差的最小值。
  • flag:(1)当为CV_FLOODFILL_FIXED_RANGE时,待处理的像素点与种子点作比较,在范围之内,则填充此像素 。(改变图像)------(2)CV_FLOODFILL_MASK_ONLY 此位设置填充的对像, 若设置此位,则mask不能为空,此时,函数不填充原始图像image,而是填充掩码图像。 mask的指定的位置为零时才填充,不为零不填充。

代码实现

(1) flag = CV_FLOODFILL_FIXED_RANGE 时

import cv2 as cv

def fill_color_demo(image):
	# 在复制图像上进行操作
	copyimg = image.copy()
	h, w = copyimg.shape[:2]
	mask = np.zeros([h + 2, w + 2], np.uint8)
	 cv.floodFill(copyimg, mask, (30,30), (0, 255, 255), (50, 20, 50), (50, 50 ,30), cv.FLOODFILL_FIXED_RANGE)
    cv.imshow("fill_color_demo", copyimg)

girl = cv.imread("girl.jpg")
cv.imshow("girl", girl)
fill_color_demo(image):

Python-Opencv中ROI(region of Interest )和泛洪填充(cv2.floodFill())_第3张图片

  • (30,30)-为种子点的位置
  • (0, 255, 255)→黄色,为泛洪填充颜色
  • (50, 20, 50)-以种子点像素三通道值[ b, g, r ]为基准,被填充范为为原图三通道最低值为[ b-50, g-20, r-50 ]。
  • (50, 50 ,30)-以种子点像素三通道值[ b, g, r ]为基准,被填充范为为原图三通道最低值为[ b+50, g+50, r+30]。
  • 所以在原图像只有像素三通道值[ b-50, g-20, r-50 ] <= [ B , G, R] <= [ b+50, g+50, r+30 ]在此范围内的都会被指定(0, 255, 255)→黄色填充。
  • cv.FLOODFILL_FIXED_RANGE:待处理的像素点与种子点作比较,在范围之内,则填充此像素 。(改变图像)

(1) flag = CV_FLOODFILL_FIXED_RANGE 时

import cv2 as cv
import numpy as np


def fill_binary():
	# 创建一个高400宽400通道为3的黑色图像
	image = np.zeros([400, 400, 3], np.unit8)
	image[100:300, 100:300, :] = 255
    cv.imshow("fill_binary", image)
    mask = np.ones([402, 402, 1], np.uint8)
    # mask的指定的位置为零时才填充,不为零不填充
    mask[101:301, 101:301] = 0
    cv.floodFill(image, mask, (200,200), (123,23,255), cv.FLOODFILL_MASK_ONLY)
    cv.imshow("mask", mask)
    cv.imshow("filled_binary", image)
   
fill_binary()

Python-Opencv中ROI(region of Interest )和泛洪填充(cv2.floodFill())_第4张图片

  • (200,200)-从(200,200)点开始填充
  • (123,23,255)-填充指定颜色

初学Opencv,如有错误地方会改进地方,真诚地邀请您提出来,谢谢!
本文结束…

你可能感兴趣的:(Python-Opencv中ROI(region of Interest )和泛洪填充(cv2.floodFill()))