首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐
2025年7月4日 星期五 6:36pm

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

  • 23-09-22 21:02
  • 2691
  • 11840
blog.csdn.net

基础版传送门链接:
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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

泛洪扩充

泛洪算法图形处理中的一个填充算法,假设一个场景,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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

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技能树进阶任务OpenCV问答20473 人正在系统学习中
注:本文转载自blog.csdn.net的总裁余(余登武)的文章"https://blog.csdn.net/kobeyu652453/article/details/107294686"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top