图像阈值处理---移动平均法(python 实现)

2024-03-04 03:59

本文主要是介绍图像阈值处理---移动平均法(python 实现),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

  • 前几天在看那本比较经典的冈萨雷斯的《数字图像处理》,正看到图像分割一章中用移动平均法来进行分割。介绍该方法的时候用的章节较少,感觉看的不是很明白,于是在网上搜了一下发现该方法的介绍也很少,也没有找到python相关实现(找到一个不是免费的。。),只找到了matlab和C++的实现。所以根据代码又翻书理解了一下,简单写一下移动平均法,做个总结,后面有python的实现。

概念介绍

移动平均法是可变阈值处理的一种,可变阈值是相对于全局阈值处理来说的,全局阈值处理是指根据整张图片计算出一个固定的阈值,图片中的每个像素如果大于这个值就认为是前景,否则就是背景。而可变阈值是指图片中每个位置的像素点或像素块中有着不同的阈值,如果该像素点大于其对应的阈值则认为是前景。移动平均法是线性的z字形的扫描整个图片,每个点处都会产生一个阈值,用该点处的灰度值和该点处计算出阈值比较来分割图片。

方法

假设一幅5x5的图片如下所示,aij表示在位置(i, j)处的灰度值。

因为要按照z字形线性扫描,所以要把二维矩阵变成一维的行矩阵
在这里插入图片描述

移动平均算法中会用到两个参数n和b,n表示n个像素求平均,b是一个阈值系数。下面的一维矩阵可以作为滤波器对上面得到的图像的一维行矩阵进行滤波求平均
在这里插入图片描述
这样就可以得到每个点处的平均值mij,用参数b乘以mij就是这个像素点处的阈值
在这里插入图片描述

然后就可以把每个像素点的灰度和阈值进行比较得到最终的分割图像了。

python实现

import cv2
import numpy as np
from scipy.signal import lfilterN = 10
b = 0.5def max_min_value_filter(image, ksize=3, mode=1):img = image.copy()rows, cols = img.shape# if channels == 3:#     img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)padding = (ksize-1) // 2new_img = cv2.copyMakeBorder(img, padding, padding, padding, padding, cv2.BORDER_CONSTANT, value=255)for i in range(rows):for j in range(cols):roi_img = new_img[i:i+ksize, j:j+ksize].copy()min_val, max_val, min_index, max_index = cv2.minMaxLoc(roi_img)if mode == 1:img[i, j] = max_valelif mode == 2:img[i, j] = min_valelse:raise Exception("please Select a Mode: max(1) or min(2)")return imgdef movingthreshold(f, n, k):shape = f.shapeassert n >= 1assert 0 < k < 1f[1:-1:2, :] = np.fliplr(f[1:-1:2, :])f = f.flatten()maf = np.ones(n) / nres_filter = lfilter(maf, 1, f)g = np.array(f > k * res_filter).astype(int)g = g.reshape(shape)g[1:-1:2, :] = np.fliplr(g[1:-1:2, :])g = g * 255# max value filter# g = max_min_value_filter(g, 3, 2)# cv2.blur(g, (3, 3))return gimg = cv2.imread('/path/to/image/file', 0)
res = movingthreshold(img, N, b)
cv2.imwrite('/path/to/results', res)

效果

原图
在这里插入图片描述
移动平均处理
在这里插入图片描述
最后再对结果进行一次最小值滤波
在这里插入图片描述
可以看到效果还是不错的!
在这里插入图片描述
最后贴一个风格迁移小程序,感兴趣可以玩一下。

这篇关于图像阈值处理---移动平均法(python 实现)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Qt实现对Word网页的读取功能

《Qt实现对Word网页的读取功能》文章介绍了几种在Qt中实现Word文档(.docx/.doc)读写功能的方法,包括基于QAxObject的COM接口调用、DOCX模板替换及跨平台解决方案,重点讨论... 目录1. 核心实现方式2. 基于QAxObject的COM接口调用(Windows专用)2.1 环境

MySQL查看表的历史SQL的几种实现方法

《MySQL查看表的历史SQL的几种实现方法》:本文主要介绍多种查看MySQL表历史SQL的方法,包括通用查询日志、慢查询日志、performance_schema、binlog、第三方工具等,并... 目录mysql 查看某张表的历史SQL1.查看MySQL通用查询日志(需提前开启)2.查看慢查询日志3.

Java实现字符串大小写转换的常用方法

《Java实现字符串大小写转换的常用方法》在Java中,字符串大小写转换是文本处理的核心操作之一,Java提供了多种灵活的方式来实现大小写转换,适用于不同场景和需求,本文将全面解析大小写转换的各种方法... 目录前言核心转换方法1.String类的基础方法2. 考虑区域设置的转换3. 字符级别的转换高级转换

使用Python将PDF表格自动提取并写入Word文档表格

《使用Python将PDF表格自动提取并写入Word文档表格》在实际办公与数据处理场景中,PDF文件里的表格往往无法直接复制到Word中,本文将介绍如何使用Python从PDF文件中提取表格数据,并将... 目录引言1. 加载 PDF 文件并准备 Word 文档2. 提取 PDF 表格并创建 Word 表格

使用Python实现局域网远程监控电脑屏幕的方法

《使用Python实现局域网远程监控电脑屏幕的方法》文章介绍了两种使用Python在局域网内实现远程监控电脑屏幕的方法,方法一使用mss和socket,方法二使用PyAutoGUI和Flask,每种方... 目录方法一:使用mss和socket实现屏幕共享服务端(被监控端)客户端(监控端)方法二:使用PyA

Python列表的创建与删除的操作指南

《Python列表的创建与删除的操作指南》列表(list)是Python中最常用、最灵活的内置数据结构之一,它支持动态扩容、混合类型、嵌套结构,几乎无处不在,但你真的会创建和删除列表吗,本文给大家介绍... 目录一、前言二、列表的创建方式1. 字面量语法(最常用)2. 使用list()构造器3. 列表推导式

Python使用Matplotlib和Seaborn绘制常用图表的技巧

《Python使用Matplotlib和Seaborn绘制常用图表的技巧》Python作为数据科学领域的明星语言,拥有强大且丰富的可视化库,其中最著名的莫过于Matplotlib和Seaborn,本篇... 目录1. 引言:数据可视化的力量2. 前置知识与环境准备2.1. 必备知识2.2. 安装所需库2.3

MyBatis-Plus逻辑删除实现过程

《MyBatis-Plus逻辑删除实现过程》本文介绍了MyBatis-Plus如何实现逻辑删除功能,包括自动填充字段、配置与实现步骤、常见应用场景,并展示了如何使用remove方法进行逻辑删除,逻辑删... 目录1. 逻辑删除的必要性编程1.1 逻辑删除的定义1.2 逻辑删php除的优点1.3 适用场景2.

Python数据验证神器Pydantic库的使用和实践中的避坑指南

《Python数据验证神器Pydantic库的使用和实践中的避坑指南》Pydantic是一个用于数据验证和设置的库,可以显著简化API接口开发,文章通过一个实际案例,展示了Pydantic如何在生产环... 目录1️⃣ 崩溃时刻:当你的API接口又双叒崩了!2️⃣ 神兵天降:3行代码解决验证难题3️⃣ 深度

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp