数字图像处理(实践篇)十九 漫水填充

2023-12-08 11:28

本文主要是介绍数字图像处理(实践篇)十九 漫水填充,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一 漫水填充算法--FloodFill

二 涉及的函数

三 实践


一 漫水填充算法--FloodFill

FloodFill漫水填充算法就是选中与种子点相连接的区域,利用指定颜色进行区域颜色填充。可以通过设置连通方式或像素的范围控制填充的效果。通常是用来标记或者分离图像的一部分,以便做进一步分析和处理。

二 涉及的函数

cv2.floodFill()函数原型如下:

cv2.floodFill(image, mask, seedPoint, newVal, loDiff=None, upDiff=None, flags=None)

输入:

image:【输入/输出】1或者3通道、 8bit或者浮点图像。仅当参数flags的FLOODFILL_MASK_ONLY标志位被设置时image不会被修改,否则的话,image会被修改。

mask:【输入/输出】 操作掩码,必须为单通道、8bit,且比原图image宽、高多2个像素。使用前必须先初始化。只有对于掩码层上对应为0的位置才能泛洪,所以掩码层初始化为0矩阵。

seedPoint:漫水填充的种子点,起始像素点。根据该点的像素判断决定和其相近颜色的像素点,是否被泛洪处理。

newVal:被填充的像素点的新像素值(B,G,R)。

loDiff:(loDiff1,loDiff2,loDiff3),添加进种子点区域条件的下界差值。例如,seed(B0,G0,R0),泛洪区域下界为(B0-loDiff1,G0-loDiff2,R0-loDiff3)。

upDiff:(upDiff1,upDiff2,upDiff3),添加进种子点区域条件的上界差值。例如,seed(B0,G0,R0),泛洪区域上界为(B0+upDiff1,G0+upDiff2,R0+upDiff3)。

flag:为泛洪算法的处理模式。

当为CV_FLOODFILL_FIXED_RANGE时,待处理的像素点与种子点作比较,在范围之内,则填充此像素 。 改变图像,填充newvalue。      

当为CV_FLOODFILL_MASK_ONLY 时,函数不填充原始图像iamge,而是填充掩码图像。不改变原图像,也就是newvalue参数失去作用,而是改变对应区域的掩码。

返回:

image:【输入/输出】

mask:【输入/输出】 操作掩码。

三 实践

实践①:不同的seedPoint

  • 代码
import numpy as np
import cv2
import matplotlib.pyplot as plt
def dealImg(img):b, g, r = cv2.split(img)img_rgb = cv2.merge([r, g, b])return img_rgb
def dealImageResult(img_path):im = cv2.imread(img_path)h, w = im.shape[:2]im1 = im.copy()im2 = im.copy()im3 = im.copy()im4 = im.copy()im5 = im.copy()mask1 = np.zeros([h+2, w+2], np.uint8)mask2 = np.zeros([h+2, w+2], np.uint8)mask3 = np.zeros([h+2, w+2], np.uint8)mask4 = np.zeros([h+2, w+2], np.uint8)mask5 = np.zeros([h+2, w+2], np.uint8)cv2.floodFill(im1,  mask1, (20, 20), (255, 255, 0), (100, 100, 50), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)cv2.floodFill(im2,  mask2, (90, 80), (255, 255, 0), (100, 100, 50), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)cv2.floodFill(im3,  mask3, (100, 150), (255, 255, 0), (100, 100, 50), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)cv2.floodFill(im4,  mask4, (180, 180), (255, 255, 0), (100, 100, 50), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)cv2.floodFill(im5,  mask5, (200, 190), (255, 255, 0), (100, 100, 50), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)fig = plt.figure(figsize=(10, 10))im = dealImg(im)im1 = dealImg(im1)im2 = dealImg(im2)im3 = dealImg(im3)im4 = dealImg(im4)im5 = dealImg(im5)titles = ["img", "seedPoint=(20, 20)", "seedPoint=(40, 40)", "seedPoint=(60, 70)", "seedPoint=(100, 150)", "seedPoint=(200, 190)"]images = [im, im1, im2, im3, im4, im5]for i in range(6):plt.subplot(2, 3, i + 1), plt.imshow(images[i], "gray")plt.title("{}".format(titles[i]), fontsize=20, ha='center')plt.xticks([]), plt.yticks([])# plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=0)# plt.tight_layout()plt.show()fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':dealImageResult("4.jpeg")pass
  • 效果图

实践②:指定位置的填充

  • 代码
import numpy as np
import cv2
import matplotlib.pyplot as plt
def dealImg(img):b, g, r = cv2.split(img)img_rgb = cv2.merge([r, g, b])return img_rgb
def dealImageResult(img_path):im = cv2.imread(img_path)h, w = im.shape[:2]print(h, w)im1 = im.copy()im2 = im.copy()im3 = im.copy()mask1 = np.ones([h+2, w+2], np.uint8)mask1[0:100, 0:100] = 0mask2 = np.ones([h+2, w+2], np.uint8)mask2[0:200, 0:200] = 0mask3 = np.ones([h+2, w+2], np.uint8)mask3[0:w, 0:h] = 0cv2.floodFill(im1,  mask1, (20, 20), (255, 255, 0), (100, 100, 50), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)cv2.floodFill(im2,  mask2, (20, 20), (255, 255, 0), (100, 100, 50), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)cv2.floodFill(im3,  mask3, (20, 20), (255, 255, 0), (100, 100, 50), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)fig = plt.figure(figsize=(10, 10))im = dealImg(im)im1 = dealImg(im1)im2 = dealImg(im2)im3 = dealImg(im3)titles = ["img", "mask1_result", "mask2_result", "mask3_result"]images = [im, im1, im2, im3]for i in range(4):plt.subplot(2, 2, i + 1), plt.imshow(images[i], "gray")plt.title("{}".format(titles[i]), fontsize=20, ha='center')plt.xticks([]), plt.yticks([])# plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=0)# plt.tight_layout()plt.show()fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':dealImageResult("4.jpeg")pass
  • 效果图

前文回顾

 入门篇目录

 数字图像处理(入门篇)一 图像的数字化与表示

 数字图像处理(入门篇)二 颜色空间

 数字图像处理(入门篇)三 灰度化

 数字图像处理(入门篇)四 像素关系

 数字图像处理(入门篇)五 图像数据预处理之颜色空间转换

 数字图像处理(入门篇)六 图像数据预处理之坐标变化

 数字图像处理(入门篇)七 图像数据预处理之灰度变化

 数字图像处理(入门篇)八 图像数据预处理之直方图

 数字图像处理(入门篇)九 图像数据预处理之滤波

 数字图像处理(入门篇)十 边缘检测

 数字图像处理(入门篇)十一 形态学处理

 数字图像处理(入门篇)十二 自适应阈值分割

 数字图像处理(入门篇)十三 仿射变换

 数字图像处理(入门篇)十四 透视变换

实践篇目录

数字图像处理(实践篇)一 将图像中的指定目标用bBox框起来吧!

数字图像处理(实践篇)二 画出图像中目标的轮廓

数字图像处理(实践篇)三 将两张图像按照指定比例融合

数字图像处理(实践篇)四 图像拼接-基于SIFT特征点和RANSAC方法

数字图像处理(实践篇)五 使用Grabcut算法进行物体分割

数字图像处理(实践篇)六 利用hough变换进行直线检测

数字图像处理(实践篇)七 利用霍夫变换进行圆环检测

数字图像处理(实践篇)八 Harris角点检测

数字图像处理(实践篇)九 基于边缘的模板匹配

数字图像处理(实践篇)十 图像质量检测

数字图像处理(实践篇)十一 图像中的条形码解析

数字图像处理(实践篇)十二 基于小波变换的图像降噪

数字图像处理(实践篇)十三 数据增强之给图像添加噪声!

数字图像处理(实践篇)十四 图像金字塔

数字图像处理(实践篇)十五 基于傅里叶变换的高通滤波和低通滤波

数字图像处理(实践篇)十六 基于分水岭算法的图像分割

数字图像处理(实践篇)十七 Shi-Tomasi 角点检测

数字图像处理(实践篇)十八 人脸检测

这篇关于数字图像处理(实践篇)十九 漫水填充的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/469674

相关文章

虚拟机Centos7安装MySQL数据库实践

《虚拟机Centos7安装MySQL数据库实践》用户分享在虚拟机安装MySQL的全过程及常见问题解决方案,包括处理GPG密钥、修改密码策略、配置远程访问权限及防火墙设置,最终通过关闭防火墙和停止Net... 目录安装mysql数据库下载wget命令下载MySQL安装包安装MySQL安装MySQL服务安装完成

SpringBoot整合(ES)ElasticSearch7.8实践

《SpringBoot整合(ES)ElasticSearch7.8实践》本文详细介绍了SpringBoot整合ElasticSearch7.8的教程,涵盖依赖添加、客户端初始化、索引创建与获取、批量插... 目录SpringBoot整合ElasticSearch7.8添加依赖初始化创建SpringBoot项

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤

MySQL 迁移至 Doris 最佳实践方案(最新整理)

《MySQL迁移至Doris最佳实践方案(最新整理)》本文将深入剖析三种经过实践验证的MySQL迁移至Doris的最佳方案,涵盖全量迁移、增量同步、混合迁移以及基于CDC(ChangeData... 目录一、China编程JDBC Catalog 联邦查询方案(适合跨库实时查询)1. 方案概述2. 环境要求3.

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

Spring WebFlux 与 WebClient 使用指南及最佳实践

《SpringWebFlux与WebClient使用指南及最佳实践》WebClient是SpringWebFlux模块提供的非阻塞、响应式HTTP客户端,基于ProjectReactor实现,... 目录Spring WebFlux 与 WebClient 使用指南1. WebClient 概述2. 核心依

MyBatis-Plus 中 nested() 与 and() 方法详解(最佳实践场景)

《MyBatis-Plus中nested()与and()方法详解(最佳实践场景)》在MyBatis-Plus的条件构造器中,nested()和and()都是用于构建复杂查询条件的关键方法,但... 目录MyBATis-Plus 中nested()与and()方法详解一、核心区别对比二、方法详解1.and()

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2