【OpenCv 4 Python 3.7】ROI与泛洪填充

39 篇文章 9 订阅
30 篇文章 5 订阅

在这里插入图片描述
 ROI(Region of interst感兴趣的区域),如何获取 numpy获取ROI
 泛洪填充
泛洪填充,如何填充一个对象内部区域

  • FLOODFILL_FIXED_RANGE – 改变图像,泛洪填充
  • FLOODFILL_MASK_ONLY – 不改变图像、只填充遮罩层本身、忽略新的颜色值参数
	floodFill(Mat image, Mat mask, Point seedPoint, Scalar newVal)

	floodFill(image, mask, seedPoint, newVal, rect, loDiff, upDiff, flags)
src(seed.x, seed.y)- loDiff <= src(x,y) <= src(seed.x, seed.y)+ upDiff

注意:

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参数:操作标志符,包含三部分:(参考https://www.cnblogs.com/little-monkey/p/7598529.html)

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

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

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

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

3.个人理解:参数3起始点的像素值减去参数5的像素值表示的是从起始点开始搜索周边范围的像素最低值,参数3起始点的像素值加上参数5的像素值表示的是从起始点开始搜索周边范围的像素最大值。有了这个范围,然后该函数就可以在这个连续像素范围内填充指定的颜色newVal参数值。

代码实现:

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) #[h+2, w+2] 必须这样写
    #从(30, 30)开始,填充区间是:最小到 30-100,30-100 (100, 100, 100),最大到30+50,30+50 (50, 50, 50),在这个颜色区间的填充(0, 255, 255)颜色
    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) #创造400*400  3通道的图像
    image[100:300, 100:300, : ] = 255
    cv.imshow("fill_binary", image)

    mask = np.ones([402, 402, 1], np.uint8)#np.ones 单通道的
    mask[101:301, 101:301] = 0
    #在(200, 200)开始填充,填充成(100, 2, 255)颜色
    cv.floodFill(image, mask, (200, 200), (100, 2, 255), cv.FLOODFILL_MASK_ONLY)
    cv.imshow("filled binary", image)

print("--------- Hello Python ---------")
src = cv.imread("E:/ji_qi_xue_xi/opencv_kejian/opencv_python_image/aaa.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
fill_color_demo(src)
#fill_binary()
"""
face = src[50:250, 100:300] #ROI区域
gray = cv.cvtColor(face, cv.COLOR_BGR2GRAY) #ROI区域变成灰度
backface = cv.cvtColor(gray, cv.COLOR_GRAY2BGR)#灰度图像给backface
src[50:250, 100:300] = backface   #backface给原图像
cv.imshow("face", src)
"""
cv.waitKey(0)
cv.destroyAllWindows()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值