欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-09 10:49:29
基础版传送门链接:python3+opencv学习笔记汇总目录(适合基础入门学习)ROI基础版ROI讲解:opencv学习笔记5:感兴趣区域ROIROI 感兴趣区域从被处理的图像以方框,圆,不规则多边形等勾勒出我们感兴趣的区域。可以通过各种算子(Operator)和函数来求得感兴趣的区域。import cv2 as cvimport numpy as npprint("--------- Hello Python ---------")src = cv.imread("1.jpg")...

基础版传送门链接:
python3+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()
荐
                                                        opencv进阶学习笔记4:ROI和泛洪扩充

泛洪扩充

泛洪算法图形处理中的一个填充算法,假设一个场景,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)
荐
                                                        opencv进阶学习笔记4:ROI和泛洪扩充

二值图像填充

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:指定位置填充
荐
                                                        opencv进阶学习笔记4:ROI和泛洪扩充

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

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

本文地址:https://blog.csdn.net/kobeyu652453/article/details/107294686