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

目录

一 漫水填充算法--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.mzph.cn/news/207426.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进程地址空间

引入地址空间 静态变量和栈空间变量 静态变量默认是被初始化的 存放在初始化和为初始化空间中 static已经变成了全局变量 命令行参数和环境变量的增长方向 这里观察的是命令行参数和环境变量的地址 观察命令行和环境变量表的地址 进程地址空间 如果他们是同一块儿空间&am…

Ubuntu22.04 交叉编译fdk-aac for Rv1106

一、下载fdk-aac git clone https://github.com/mstorsjo/fdk-aac.git 二、编译 mkdir build cd buildcmake -DCMAKE_CXX_COMPILER/opt/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-g -DCMAKE_C_COMPILER/opt/arm-rockchip830-linux-…

软件测试——集成测试

集成测试是在单元测试之后,将各个独立单元(通常是已经通过单元测试的模块或组件)组合在一起,测试它们在一起协同工作的过程。以下是进行集成测试的一般步骤和最佳实践: 1. 明确定义集成测试的目标 确定集成测试的目标…

麒麟v10 数据盘初始化 gpt分区

麒麟v10 数据盘初始化 gpt分区 1、查看磁盘 lsblk2 、分区 parted2.1、 设置磁盘分区形式2.2、 设置磁盘的计量单位为磁柱2.3、 分区2.4、 查看分区 3、分区格式化4、 挂载磁盘4.1、新建挂载目录4.2、挂载磁盘4.3、查看挂载结果 5、设置开机自动挂载磁盘分区5.1、 查询磁盘分区…

ClamAV开源病毒库使用例子

ClamAV是一个开源的反病毒引擎,用于检测恶意软件和病毒。ClamAV提供了一个名为cl_scanfile的函数,用于扫描单个文件是否包含病毒。以下是一个使用cl_scanfile函数的示例代码: 首先,确保已经安装了ClamAV库。在Debian/Ubuntu系统中…

用AI来纠正错别字和修饰文字

▲ 搜索“大龙谈智能内容”关注GongZongHao▲ 在使用谷歌翻译或百度翻译将英语翻译成中文时,有些句子读起来不太流畅。我尝试使用AI来帮助我修改翻译后的中文,希望能让句子更符合中文习惯。 使用百度文心一言尝试一下。 文心一言的链接是这个&#x…

VUE3给table的head添加popover筛选、时间去除时分秒、字符串替换某字符

1. VUE3给table的head添加popover筛选 <el-tableref"processTableRef"class"process-table"row-key"secuId":data"pagingData"style"width: 100%"highlight-current-row:height"stockListHeight":default-exp…

RHEL/CentOS的firewalld防火墙服务配置

从 RHEL/CentOS 7开始&#xff0c;使用新的防火墙服务——firewalld。这里介绍该防火墙服务的基本用法 一、防火墙服务管理&#xff1a;从 RHEL/CentOS 7开始采用Systemd作为新的系统管理器&#xff0c;而systemctl则是Systemd中用于管理服务的命令 # 启动防火墙服务 systemct…

谷歌Gemini刚发就惹质疑:测试标准有失偏颇,效果视频疑似剪辑

梦晨 克雷西 发自 凹非寺 量子位 | 公众号 QbitAI 谷歌憋了许久的大招&#xff0c;双子座Gemini大模型终于发布&#xff01;其中一图一视频最引人注目&#xff1a; 一图&#xff0c;MMLU多任务语言理解数据集测试&#xff0c;Gemini Ultra不光超越GPT-4&#xff0c;甚至超越了…

OpenGL学习资料

1.学习网站 Song Ho Ahn LearnOpenGL GAMES101:现代计算机图形学入门 OpenGL 官网 2.书籍 Fundamentals of computer graphics OpenGL ES 3.0编程指南 计算机图形学(OpenGL版)第3版 3.参考的一些文章 颜色缓冲区 深度缓冲 VBO&#xff0c;VAO和EBO详解 深入探索透视投影变…

实战干货!基于ERNIE Bot SDK的数字诗人聊天开发教程

随着人工智能技术的不断迭代发展&#xff0c;数字人的开发与应用需求也与日俱增&#xff0c;并且随着大语言模型的发展&#xff0c;数字人也更智能&#xff0c;从最初的语音预制到现在的实时交流&#xff0c;目前已在很多场景都有广泛应用。 虚拟客服&#xff1a;数字人可以通…

Mysql自动备份脚本(本地备份、远程备份、删除冗余备份)

Mysql自动备份脚本&#xff08;本地备份、远程备份、删除冗余备份&#xff09; 1. 脚本功能 自动备份mysql数据到服务器上&#xff0c;可以通过linux的 crontab定义备份周期。 自动删除七天前的备份数据。 2. 脚本内容 #!/bin/bash # auth Eric source /etc/profile # 设…

【EMNLP 2023】基于知识迁移的跨语言机器阅读理解算法

近日&#xff0c;阿里云人工智能平台PAI与华南理工大学朱金辉教授团队、达摩院自然语言处理团队合作在自然语言处理顶级会议EMNLP2023上发表基于机器翻译增加的跨语言机器阅读理解算法X-STA。通过利用一个注意力机制的教师来将源语言的答案转移到目标语言的答案输出空间&#x…

计算机网络高频面试八股文

目录&#xff1a; 网络分层结构三次握手两次握手可以吗&#xff1f;四次挥手第四次挥手为什么要等待2MSL&#xff1f;为什么是四次挥手&#xff1f;TCP有哪些特点&#xff1f;说说TCP报文首部有哪些字段&#xff0c;其作用又分别是什么&#xff1f;TCP和UDP的区别&#xff1f;…

套接字应用程序

这章节是关于实现 lib_chan 库的 。 lib_chan 的代码在 TCP/IP 之上实现了一个完整的网络层&#xff0c;能够提供认证和Erlang 数据流功能。一旦理解了 lib_chan 的原理&#xff0c;就能量身定制我们自己的通信基础结构&#xff0c;并把它叠加在TCP/IP 之上了。 就lib_chan 本身…

MMLM之Gemini:《Introducing Gemini: our largest and most capable AI model》的翻译与解读

MMLM之Gemini&#xff1a;《Introducing Gemini: our largest and most capable AI model》的翻译与解读 导读&#xff1a;2023年12月6日&#xff0c;Google重磅发布大规模多模态模型Gemini&#xff0c;表示了Google语言模型发展到了一个新阶段&#xff0c;其多模态和通用能力明…

中断、异常和系统调用(2-1,2-2,2-3)

2-1 课堂练习2.1&#xff1a;外部中断 本实训分析 Linux 0.11 对外部中断的响应和处理过程。在每条指令执行的末尾&#xff0c;如果没有关中断&#xff0c;CPU 会检查是否收到了外部中断信号&#xff0c;如果有信号&#xff0c;则 CPU 就切换到核心态去执行对应的中断处理程序…

Android 获取进程名称

Android 获取进程名称 本篇文章主要获取下当前应用的进程名称,具体代码如下: public static String getProcessNameDevice(final Context context) {int myPid Process.myPid();if (context null || myPid < 0) {return "";}ActivityManager.RunningAppProces…

DHTMLX Scheduler PRO 6.0.5 Crack

功能丰富的 JavaScript调度程序 DHTMLX Scheduler 是一个 JavaScript 日程安排日历&#xff0c;具有 10 个视图和可定制的界面&#xff0c;用于开发任何类型的日程安排应用程序。 DHTMLX JS 调度程序库的主要特性 我们的 JS 调度程序最需要的功能之一是时间轴视图。借助时间轴…

vue-loader是如何工作的?

什么是单文件组件&#xff1f; 单文件组件是一种将模板、脚本和样式封装在一个 .vue 文件中的方式 例如&#xff1a; <template><div class"example">{{ msg }}</div> </template> <script>export default {data() {return {msg: &qu…