opencv进阶学习笔记4:ROI和泛洪扩充

基础版传送门链接:
python3+opencv学习笔记汇总目录(适合基础入门学习)
进阶版笔记目录:
python+opencv进阶版学习笔记目录(适合有一定基础)

ROI

基础版ROI讲解
opencv学习笔记5:感兴趣区域ROI
ROI 感兴趣区域
从被处理的图像以方框,圆,不规则多边形等勾勒出我们感兴趣的区域。
可以通过各种算子(Operator)和函数来求得感兴趣的区域。

import cv2 as cv
import numpy as np

print("--------- Hello Python ---------")
src = cv.imread("1.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
face = src[200:350, 120:360]#脸部区域
gray = cv.cvtColor(face, cv.COLOR_BGR2GRAY)#转灰色
backface = cv.cvtColor(gray, cv.COLOR_GRAY2BGR)#
src[200:350, 120:360] = backface
cv.imshow("new image", src)
cv.waitKey(0)
cv.destroyAllWindows()

泛洪扩充

泛洪算法图形处理中的一个填充算法,假设一个场景,windows的画图软件中的油漆桶为一个形状着色,该形状的范围内都将被着色,我们所使用的算法就是从一个像素点出发,以此向周边的像素点扩充着色,直到图形的边界。这个场景我们使用的算法就是flood fill(泛洪算法)。

彩色图像填充

cv2.floodFill(img,mask,seed,newvalue(B,G,R),(loDiff1,loDiff2,loDiff3),(upDiff1,upDiff2,upDiff3),flag)

img:需要处理的图像
mask:一般设置为长宽比img大2的通道为1的数组,其中需要处理的区域设置为0,不需要处理的区域设置为1
seed:起始像素点
newvalue:需要填充的颜色
loDiff和upDiff:需要处理的与seed颜色相近的像素点,即设seed的像素为(B0,G0,R0)。若待处理的像素的值位于(B0-loDiff,G-LoDiff,B-loDiff)到(B0+upDiff,G0+upDiff,R0+upDiff)之间的话就填充newvalue
flag:cv.FLOODFILL_FIXED_RANGE:指定颜色填充

def fill_color_demo(image):
    copyImg = image.copy()#复制原图像,不复制原图会修改原图
    h, w = image.shape[:2]#高,宽
    mask = np.zeros([h+2, w+2], np.uint8)#必须加2.官方规定。初始为zeros 0
    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)

print("--------- Hello Python ---------")
src = cv.imread("1.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
fill_color_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

mask = np.zeros([h+2, w+2], np.uint8) 填充的是图像中不为0的点,所以初始为0,从全部区域选择填充。

即提取(30,30)点像素(B0,G0,R0),将像素值在(B0-100,G0-100,R0-100)到(B0+50,R0+50,G0+50)范围的像素点填充为黄色(0,255,255)

二值图像填充

import cv2 as cv
import numpy as np

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是单通道,需要指定1。将mask设为1
    mask[101:301, 101:301] = 0#选择白色区域,将填充的区域设为0,和mask相反
    cv.floodFill(image, mask, (200, 200), (100, 2, 255), cv.FLOODFILL_MASK_ONLY)
    cv.imshow("filled binary", image)

fill_binary()

cv.waitKey(0)
cv.destroyAllWindows()

mask = np.ones([402, 402, 1], np.uint8)#
mask[101:301, 101:301] = 0#
填充的是图像中不为1的点,所以我们需要将需要填充的区域指定为0
(200, 200) 为初始点,我选择的是中心点。
(100, 2, 255):颜色
cv.FLOODFILL_MASK_ONLY:指定位置填充

指定位置填充不能应用到彩色图。

电气专业的计算机萌新,写博文不容易。如果你觉得本文对你有用,请点个赞支持下。谢谢。

猜你喜欢

转载自blog.csdn.net/kobeyu652453/article/details/107294686