【图像分割】使用Otsu 算法及迭代计算最佳全局阈值估计并实现图像分割(代码实现与分析)

        本实验要求理解全局阈值分割的概念,并实现文本图像分割。需要大家深入理解Ostu 算法的实现过程及其迭代原理,同时通过学习使用Otsu 算法及其迭代,实践图像分割技术在文本图像处理中的应用。

        以下将从实验原理、实验实现、实验结果分析三部分对整个实验进行阐述

实验原理

全局阈值分割原理

        全局阈值分割是一种基于灰度图像的简单分割方法。其基本思想是根据一个固定的阈值T,将图像中的每个像素点的灰度值与阈值T进行比较。如果像素点的灰度值大于或等于T,则将其归为前景(通常表示感兴趣的物体或区域);否则,将其归为背景。

Otsu算法原理

        Otsu算法是一种自动选择全局阈值的方法,它通过最大化类间方差(inter-class variance)来确定最优的阈值。类间方差反映了前景和背景两类像素之间的差异程度,差异越大,说明分割效果越好。

以下是Otsu算法的具体步骤:

        a. 计算图像的灰度直方图:直方图表示了图像中各个灰度级像素出现的频率。

        b. 计算各类别的概率:对于每一个可能的阈值T,可以将图像分为两个类别,一类是灰度值小于T的像素,另一类是灰度值大于或等于T的像素。计算这两个类别的像素数(或者像素的概率)。

        c. 计算类间方差:类间方差定义为两类像素的平均灰度值之差的平方乘以两类像素的概率之和。类间方差越大,说明两类像素的差异越大,分割效果越好。

        d. 寻找最优阈值:遍历所有可能的阈值,对于每个阈值,计算其对应的类间方差。选择使类间方差最大的那个阈值作为最佳全局阈值。

图像分割实现

        利用计算出的最佳全局阈值,对原始图像进行二值化处理,即根据阈值将每个像素点的灰度值转换为0(背景)或1(前景),从而实现图像的分割。

实验实现

输入图像

在本次实验中,小组选取了三幅灰度图片作为实验的输入图像,如下图所示。

实验代码 

        利用Python实现Otsu算法及其迭代方法。对于输入的图像,首先生成它的一个渐变灰度图像,接着计算图像的直方图,并基于直方图使用Otsu方法和迭代方法分别寻找最佳的阈值。

import cv2
import numpy as np
import osdef get_file_paths(folder_path):# 获取文件夹内所有文件的路径file_paths = [os.path.join(folder_path, file) for file in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, file))]return file_pathsdef generate_gradient_image(width, height):# 生成渐变灰度图像数据gradient_image = np.zeros((height, width), dtype=np.uint8)# 计算每一列的亮度值for col in range(width):brightness = int(255 * col / width)gradient_image[:, col] = brightnessreturn gradient_imagedef save_image(image, file_path):# 保存图像cv2.imwrite(file_path, image)def iterative_thresholding(image, epsilon=1e-6, max_iter=100):# 初始阈值threshold = 128.0for _ in range(max_iter):# 根据当前阈值将图像二值化binary_image = image > threshold# 计算前景和背景的平均灰度mean_foreground = np.mean(image[binary_image])mean_background = np.mean(image[~binary_image])# 计算新的阈值new_threshold = 0.5 * (mean_foreground + mean_background)# 如果新旧阈值之间的差异小于 epsilon,停止迭代if abs(new_threshold - threshold) < epsilon:breakthreshold = new_thresholdreturn thresholddef otsu_thresholding(image): # 计算otsu全局最优阈值# 计算直方图hist, bins = np.histogram(image.flatten(), 256, [0, 256])# 归一化直方图hist = hist.astype(float) / sum(hist)# 初始化类内方差和类间方差var_within = np.zeros(256)var_between = np.zeros(256)for t in range(1, 256):# 类内方差w0 = sum(hist[:t])w1 = sum(hist[t:])mu0 = sum(i * hist[i] for i in range(t)) / w0 if w0 > 0 else 0mu1 = sum(i * hist[i] for i in range(t, 256)) / w1 if w1 > 0 else 0var_within[t] = w0 * w1 * (mu0 - mu1) ** 2# 类间方差var_between[t] = w0 * w1 * (mu0 - mu1) ** 2# 找到最佳阈值optimal_threshold = np.argmax(var_between)return optimal_thresholddef threshold(image_path): # 生成阈值化图像# 读取图像img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)image_path=image_path[5:]# 应用Otsu方法获取最佳阈值otsu_threshold = otsu_thresholding(img)# print(f"threshold:{threshold}")# 使用阈值进行二值化print(f'otsu_threshold:{otsu_threshold}')_, binary_image = cv2.threshold(img, otsu_threshold, 255, cv2.THRESH_BINARY)# 保存阈值化图像save_image(binary_image, f'Otsu_{image_path}')iterative_threshold = iterative_thresholding(img)# print(f"threshold:{threshold}")# 使用阈值进行二值化print(f'iterative_threshold:{iterative_threshold}')_, binary_image = cv2.threshold(img, iterative_threshold, 255, cv2.THRESH_BINARY)# 保存阈值化图像save_image(binary_image, f'iterative_{image_path}')print(f'{image_path[:-4]}测试已完成')if __name__ == '__main__':# # 设置图像的宽度和高度# width = 640# height = 480# # 生成渐变图像# image = generate_gradient_image(width, height)# # 保存图像# save_image(image, 'exam0.jpg')folder_path = 'exam'# 获取文件夹内所有文件的路径exam_paths = get_file_paths(folder_path)# 依次测试图像for image_path in exam_paths:print(f'image_name:{image_path[5:]}')threshold(image_path)

实验结果分析 

对于三幅图像使用Otsu方法和迭代方法进行全局阈值分割的实验结果和分析如下:

(1)图像一处理结果

        由上图第一组实验结果可以看出,对于灰度分布规律简单的图像,全局分割的阈值寻找较为简单,利用Otsu算法和迭代算法的效果几乎没有区别。 

(2)图像二处理结果

        如上图所示,第二组实验中,Otsu算法和迭代方法在作用于灰度值分界较为明显的图像上时均取得了很好的分割效果。 

(3)图像三处理结果

        由上图所示第三组实验可以看出,即使是边界并不是非常清晰的图片,Otsu方法和迭代方法也都能取得很好的分割效果。


以上为本次实验的全部内容~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/545387.html

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

相关文章

springboot项目读取excel表格内容到数据库,excel表格字段为整数的读取方法

在我昨天的项目中&#xff0c;我需要把excel表格中字段为整数的字段读取到数据库中进行保存&#xff0c;但是在内置方法中并没有读取整数的方法&#xff08;也有可能是我没发现&#xff0c;太菜了~~&#xff09;&#xff0c;那接下来我就提供给大家一个简单地方法来读取excel表…

力扣977. 有序数组的平方

思路&#xff1a;暴力法&#xff1a;全部平方&#xff0c;然后调用排序API&#xff0c;排序算法最快是N*log(N)时间复制度。 双指针法&#xff1a;要利用好原本的数组本就是有序的数组这个条件&#xff0c; 只是有负数 导致平方后变大了&#xff0c;那么平方后的最大值就是在两…

PTAL1-006 连续因子

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

数据可视化-ECharts Html项目实战(2)

在之前的文章中&#xff0c;我们学习了如何创建简单的折线图&#xff0c;条形图&#xff0c;柱形图并实现动态触发&#xff0c;最大最小平均值。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下…

【Windows Defender 排除指定 文件夹、文件夹以提升性能】

使用webStorm时候提醒排出程序和目录提升性能, 于是我就把我的代码目录和常用程序全部排出, 不过不知道能不能提升多少性能, 先加上再说 一.使用UI配置排出项 隐私与安全性安全中心 病毒与威胁防护 添加或删除排出项 配置 二.使用命令配置 使用 PowerShell开启自动排除列表…

Android 开发 地图 polygon 显示信息

问题 Android 开发 地图 polygon 显示信息 详细问题 笔者进行Android项目开发&#xff0c;接入高德地图绘制区域后&#xff0c;需要在指定区域&#xff08;位置&#xff09;内显示文本信息&#xff0c;如何实现 实现效果 解决方案 代码 import com.amap.api.maps.model.T…

J.砍树【蓝桥杯】树上差分+LCA

树上差分 多次对树上的一些路径做加法操作&#xff0c;然后询问某个点或某条边经过操作后的值&#xff0c;就要考虑树上差分了。 点差分 模拟这个过程 对x到y路径上的点权值均1&#xff0c;可以等价成对x和y的权值加1&#xff0c;对lca的权值-1&#xff0c;对fa[lca]的权值-…

MySQL-----事务

一 事务简介 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一 个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 例如:银行转账 张三 ---(转账1000元)---> 李四 在进行…

亚马逊云科技Glue

Glue 最重要的部分&#xff0c; ETL&#xff1a;用于从 A 点&#xff08;我们的源数据&#xff09;提取、转换和加载数据到 B 点&#xff08;目标文件或数据存储库&#xff09;。 AWS Glue 会为您执行大量此类工作。 转换通常是更繁重的工作&#xff0c;需要从各种来源进行组合…

linuxOPS基础_linux命令合集

uname查看操作系统信息 命令&#xff1a;uname [参数] 作用&#xff1a;获取计算机操作系统相关信息 参数&#xff1a;-a&#xff0c;选项-a代表all&#xff0c;表示获取全部的系统信息&#xff08;类型、全部主机名、内核版本、发布时间、开源计划&#xff09; 用法一&…

微信小程序关闭首页广告

由于之前微信小程序默认开启了首页广告位。导致很多老人误入广告页的内容&#xff0c;所以想着怎么屏蔽广告。好家伙&#xff0c;搜索一圈&#xff0c;要么是用户版本的屏蔽广告&#xff0c;或者是以下一个模棱两可的答案&#xff0c;要开发者设置一下什么参数的&#xff0c;如…

介绍一款鼠标无边界软件

"Mouse without Borders" 是一款由微软开发的免费工具&#xff0c;旨在帮助用户在多台计算机之间实现无缝的鼠标和键盘共享。通过 Mouse without Borders&#xff0c;用户可以在一个主控制台上控制多台计算机&#xff0c;就像操作一个大型虚拟桌面一样。 这个工具可…