ROI区域操作与泛红填充

'''
ROI(region of interest),
也就是感兴趣区域,如果你设置了图像了ROI,
那么在使用OpenCV的函数的时候,会只对ROI区域操作,
其他区域忽略。
'''
import cv2 as cv
import numpy as np


# 截取图片中的指定区域或在指定区域添加某一图片
def jie_image(src1):
    # 截取第5行到89行的第500列到630列的区域
    src2 = src1[20:100,500:700]
    cv.imshow('intercept',src2) # 截取图片
    src1[105:185,300:500] = src2  # 指定位置填充,大小要一样才能填充
    cv.imshow('composite',src1) # 合成图片

# 指定颜色替换
def fill_image(image):
    copyImage = image.copy() # 复制原图像
    h,w = copyImage.shape[:2] # 读取图像的宽和高
   # 注意是uint8,是不Unit8
    mask = np.zeros([h+2,w+2],np.uint8) #新建图像矩阵  +2是官方函数要求
    # 泛洪填充7个参数,够头疼的
    cv.floodFill(copyImage, mask, (0, 80), (0, 100, 255), (100, 100, 50), (50, 50, 50), cv.FLOODFILL_FIXED_RANGE)
    '''
     floodFill( 1.操作的图像, 2.掩模, 3.起始像素值,4.填充的颜色, 5.填充颜色的低值, 6.填充颜色的高值 ,7.填充的方法

    参数5.填充颜色的低值就是:参数3 减去 参数5

    参数6.填充颜色的高值就是:参数3 加上 参数6

    即是这两个数值之间的色素替换为参数4的颜色

    
    '''
    cv.imshow('floodFill',copyImage)

# 指定位置填充
def fill_binary():
    # 创建一张400*400的黑图
    image = np.zeros([400,400,3],np.uint8)
    image[50:350,50:350,:] = 255
    cv.imshow('original',image)

    # mask的大小一定比原图大2
    #注意是uint8,是不Unit8 同样的错误一般还会再犯
    mask = np.ones([402,402,1],np.uint8)
    # 将下面的区域赋值为0
    mask[103:301,101:301] = 0
    # 进行指定位置填充
    cv.floodFill(image,mask,(200, 200), (0, 0, 255),(10,10,10),(10, 10, 10), cv.FLOODFILL_MASK_ONLY)
    cv.imshow('floodFill2',image)


if __name__ == '__main__':
    '''
    ROI切片填充
    '''
    # src = cv.imread('pic/bizhi.jpg')
    # cv.imshow('original',src)
    # jie_image(src)
    # cv.waitKey(0)
    # cv.destroyAllWindows()

    '''
    泛洪填充fill_image()
    '''
    # src = cv.imread('pic/bizhi.jpg')
    # cv.imshow('original',src)
    # fill_image(src)
    # cv.waitKey(0)
    # cv.destroyAllWindows()

    '''
    指定位置填充fill_binary()
    '''
    fill_binary()
    cv.waitKey(0)
    cv.destroyAllWindows()

posted @ 2021-08-13 17:05  索匣  阅读(133)  评论(0编辑  收藏  举报