OpenCV学习心得——python版——ROI和泛洪填充

OpenCV学习心得——python版——ROI和泛洪填充
FOR THE SIGMA
FOR THE GTINDER
FOR THE ROBOMASTER

简介:

本笔记仅供参考

操作系统版本:Windows10
编译器:JetBrains PyCharm 2019.1.3 x64
所需库
opencv-python2.xx.xx以上(我用的最新的,但是不一定要用最新的,3.4左右版本就行了)
numpy
pillow

电子版书籍下载地址
暂无资源

内容:

ROI感兴趣区域:

有时你需要对一幅图像的特定区域进行操作。例如我们要检测一副图像中眼睛的位置,我们首先应该在图像中找到脸,再在脸的区域中找眼睛,而不是直接在一幅图像中搜索。这样会提高程序的准确性和性能。在opencv-pyhon里面ROI是使用 Numpy 索引来获得的。

寻找感兴趣的区域主要就是利用矩阵的切片功能来提取.
如face = image[100:200, 300:400]

import cv2 as cv

image = cv.imread('sss.jpg', 1) #读取
cv.imshow('image', image) #显示

ROI_1 = image[250:400, 200:350] # #选择200:300行、200:400列区域作为截取对象并提取(感兴趣区域)

gray = cv.cvtColor(ROI_1, cv.COLOR_BGR2GRAY) # 将感兴趣区域转换成灰度图(单通道图像)
backface = cv.cvtColor(gray, cv.COLOR_GRAY2BGR) # 将单通道图像转换为三通道RGB灰度图,因为只有三通道的backface才可以赋给三通道的src

image[250:400, 200:350] = backface# 重新赋值

cv.imshow('image_ROI', image)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述左边为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)

说明:
cv.floodFill(copy_image, mask, (30, 30), (0, 255, 255), (100, 100, 100), (50, 50, 50), cv.FLOODFILL_FIXED_RANGE)

  • 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指定的位置为零时才填充,不为零不填充。

import cv2 as cv
import  numpy as np

# 彩色图像的填充(泛洪填充)
def fill_color_demo(image):
    copy_image = image.copy() #复制
    h, w = image.shape[:2] #引索高与宽
    mask = np.zeros([h+2, w+2], np.uint8) #mask必须行和列都加2,且必须为uint8单通道阵列
    cv.floodFill(copy_image, mask, (30, 30), (0, 255, 255),  (100, 100, 100), (50, 50, 50), cv.FLOODFILL_FIXED_RANGE)
    cv.imshow("image1", copy_image)

# 灰度图填充(泛洪填充)
def fill_binary():
    img = np.zeros([400, 400, 3], np.uint8)
    img[100:300, 100:300, :] = 255
    cv.imshow("fill_binary", img)
    mask = np.ones([402, 402, 1], np.uint8) ##mask要保证比原图像高和宽都多2,原因同上
    mask[101:301, 101:301] = 0
    cv.floodFill(img, mask, (200, 200),(0, 0, 255), cv.FLOODFILL_MASK_ONLY) ##mask不为0的区域不会被填充,mask为0的区域才会被填充
    cv.imshow("image2", img)

image = cv.imread('sss.jpg', 1) #读取
cv.imshow('mage0', image)
fill_color_demo(image)
fill_binary()
cv.waitKey(0)
cv.destroyAllWindows()
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值