从头学习opencv(5)--ROI与泛洪填充

ROI

在我看来就是被选中的区域。选择一段区域进行操作,然后可以将操作返回到原图像中去。

#ROI
#截取ROI区域
face=src[50:375,100:400]
#变为灰色
gray=cv.cvtColor(face,cv.COLOR_BGR2GRAY)
backface=cv.cvtColor(gray,cv.COLOR_GRAY2BGR)
#将灰色部分赋回给src的选中部分
src[50:375,100:400]=backface
cv.imshow("face",src)

注意:COLOR_RGB2GRAY是把三通道RGB对象转换为单通道灰度对象

泛洪填充

def fill_color_demo(image):
    copyImage=image.copy()
    h,w=image.shape[:2]
    mask=np.zeros([h+2,w+2],np.uint8)
    cv.floodFill(copyImage,mask,(30,30),(0,255,255),(50,50,50),(50,50,50),cv.FLOODFILL_FIXED_RANGE)
    cv.imshow("fill_color_demo",copyImage)


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)#mask不要忘了加2
    mask[101:301,101:301]=0
    #FLOODFILL_MASK_ONLY填充时,要讲mask初始化为1,而需要填充的区域设置为0
    cv.floodFill(image,mask,(200,200),(50,50,255),cv.FLOODFILL_MASK_ONLY)
    cv.imshow("fill_binary",image)

泛洪填充有两种方式
1.漫水填充
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参数表示当前观察像素值与其部件邻域像素值或待加入该组件的种子像素之间的亮度或颜色之正差的最大值。

注:这里我之前理解错了一个地方,大错特错。像素是分辨率,是单位,比如7201820,就像是扫描线,扫描线越密,分辨率越高。7201820是说他的像素点有这么多,像素是点做单位,点越多越好。两个值一个纵一个横,类似矩阵。
cv.floodFill(copyImage,mask,(30,30),(0,255,255),(50,50,50),(50,50,50),cv.FLOODFILL_FIXED_RANGE)
这行代码中,是说起始点是(30,30)的地方。这个点的像素值假如是x和y,扫描周围的点,像素范围在(x-50,x+50)这个范围内的都填充成(0,255,255)这个颜色。

2.二值图像填充
至于为什么是101和301,在网上看到了一种理解觉得还可以,https://www.cnblogs.com/FHC1994/p/9033580.htmlmask[101:301, 101:301] = 0 这条语句为什么是101:301而不是100:300呢?我觉得应该是掩膜mask是比原图像左右上下都多了1,所以掩膜mask左右一共比原图像多2,上下也比原图像多2。那么原图像的100就自然对应到掩膜的101,同样原图像的300就自然对应到掩膜的301。

补充:
设置FLOODFILL_FIXED_RANGE – 改变图像,泛洪填充
设置FLOODFILL_MASK_ONLY – 不改变图像,只填充遮罩层本身,忽略新的颜色值参数

完整代码

import cv2 as cv
import numpy as np

def fill_color_demo(image):
    copyImage=image.copy()
    h,w=image.shape[:2]
    mask=np.zeros([h+2,w+2],np.uint8)
    cv.floodFill(copyImage,mask,(30,30),(0,255,255),(50,50,50),(50,50,50),cv.FLOODFILL_FIXED_RANGE)
    cv.imshow("fill_color_demo",copyImage)


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)#mask不要忘了加2
    mask[101:301,101:301]=0
    #FLOODFILL_MASK_ONLY填充时,要讲mask初始化为1,而需要填充的区域设置为0
    cv.floodFill(image,mask,(200,200),(50,50,255),cv.FLOODFILL_MASK_ONLY)
    cv.imshow("fill_binary",image)


print("Hi,python!")
src = cv.imread("C:/Users/Administrator/Desktop/demo.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)

#
#ROI与泛洪填充
#

#ROI
#截取ROI区域
face=src[50:375,100:400]
#变为灰色
gray=cv.cvtColor(face,cv.COLOR_BGR2GRAY)
backface=cv.cvtColor(gray,cv.COLOR_GRAY2BGR)
#将灰色部分赋回给src的选中部分
src[50:375,100:400]=backface
cv.imshow("face",src)

#泛洪填充
fill_color_demo(src)
fill_binary()
cv.waitKey(0)
cv.destroyAllWindows()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值