ROI就是感兴趣区域,可以通过指定像素范围获得,也可以通过opencv提供的API获得
https://blog.youkuaiyun.com/weixin_41713230/article/details/88966726
我只试了指定像素范围,把一片区域换为灰度图像,代码如下
import cv2 as cv
import numpy as np
src=cv.imread("./timg.jpg")
# 提取ROI
port=src[50:200,60:200]
# 转为灰度图
port=cv.cvtColor(port,cv.COLOR_BGR2GRAY)
# 转为3通道
port=cv.cvtColor(port,cv.COLOR_GRAY2BGR)
# 替换原图像部分
src[50:200,60:200]=port
cv.imshow("timg",src)
cv.waitKey(0)
cv.destroyAllWindows()
漫水填充
https://blog.youkuaiyun.com/weixin_42508025/article/details/84029054
https://www.cnblogs.com/FHC1994/p/9033580.html
def fill_color_demo(image):
copyImg = image.copy()
h, w = image.shape[:2]
mask = np.zeros([h+2, w+2],np.uint8) # mask必须行和列都加2,且必须为uint8单通道阵列
# 为什么要加2可以这么理解:当从0行0列开始泛洪填充扫描时,mask多出来的2可以保证扫描的边界上的像素都会被处理
cv.floodFill(copyImg, mask, (30, 30), (0, 0, 255), (100, 100, 100), (50, 50 ,50), cv.FLOODFILL_FIXED_RANGE)
# 也就是在(30,30)这个像素点周围的BGR值各减100作为最低,各加50作为最高,中间的范围进行填充
cv.imshow("fill_color_demo", copyImg)
当flag选取设置FLOODFILL_MASK_ONLY – 不改变图像,只填充遮罩层本身,忽略新的颜色值参数 注:mask不为0的区域不会被填充,mask为0的区域才会被填充