【图像分割】基于全局阈值、otsu、自适应阈值多种算法实现图像分割含Matlab源码

 1 简介

重点讨论了图像分割法中的阈值研究法,包括全局阈值法和自适应阈值法.对全局阈值算法中的人工选择法,迭代式阈值选择法,最大类间方差法以及自适应算法中的分水岭算法进行了重点分析,用Matlab进行实现并给出了实验结果。

阈值分割方法是一种常见的区域并行技术,原理上利用1 个或者多个阈值对像素点的灰度直方图进行区分,将其分成几个不同的类,得到的像素灰度值在同一类的属于同一个物体。由于直接利用灰度直方图可以简化计算的部分,因此,选取一个适合的阈值就显得尤为重要。想要找到合适的阈值就离不开一个准则函数 [3]。而在实际的研究中,选择合适的阈值并不容易,影响阈值设定的主要因素有光的亮度以及噪声。随着研究的进步,逐步发展了几种解决上述问题的办法,应用比较广泛的有自适应阈值法、最大熵法、类间阈值法以及模糊阈值法等。并且为了保证准确性,至少会采用 2 种或者更多方法来确定阈值。首先把想要处理的原始 图像假设为 f(x,y),阈值分割的主要任务就是将原始的输入函数转 化成输出函数 g(x,y),

得到的函数 g(x,y)的图像是二值图像,利用原图 f(x, y)与阈值 p 比较之后,就能得到分割以后的图像。在现在的研究中,阈值分割算法的核心就是找出最合适的阈值,基于此可以分为人工选择法和自动选择法,要选择的就是阈值,人工选择法就是在通过人的肉眼分析图像的直方图时,根据经验判断合适的阈值。但是在没有人工干预的情况下,就需要采用自动选择法,这也是在特殊环境下利用专业领域的专业知识来进行判断的。​

2 部分代码

function y = isrgb(x)%ISRGB Return true for RGB image.%   FLAG = ISRGB(A) returns 1 if A is an RGB truecolor image and%   0 otherwise.%%   ISRGB uses these criteria to determine if A is an RGB image:%%   - If A is of class double, all values must be in the range%     [0,1], and A must be M-by-N-by-3.%%   - If A is of class uint8 or uint16, A must be M-by-N-by-3.%%   Note that a four-dimensional array that contains multiple RGB%   images returns 0, not 1.%%   Class Support%   -------------%   A can be of class uint8, uint16, or double. If A is of %   class logical it is considered not to be RGB.%%   See also ISBW, ISGRAY, ISIND.%   Copyright 1993-2003 The MathWorks, Inc.  %   $Revision: 1.15.4.2 $  $Date: 2003/08/23 05:52:55 $wid = sprintf('Images:%s:obsoleteFunction',mfilename);str1= sprintf('%s is obsolete and may be removed in the future.',mfilename);str2 = 'See product release notes for more information.';warning(wid,'%s\n%s',str1,str2);y = size(x,3)==3;if y   if isa(x, 'logical')      y = false;   elseif isa(x, 'double')      % At first just test a small chunk to get a possible quick negative        m = size(x,1);      n = size(x,2);      chunk = x(1:min(m,10),1:min(n,10),:);               y = (min(chunk(:))>=0 && max(chunk(:))<=1);      % If the chunk is an RGB image, test the whole image      if y         y = (min(x(:))>=0 && max(x(:))<=1);      end   endend

3 仿真结果

4 参考文献

[1]李小琦. 基于Matlab的图像阈值分割算法研究[J]. 软件导刊, 2014, 13(12):3.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以为你提供代码实现。 首先,我们需要导入必要的库和图像: ```python import cv2 import numpy as np # 读取彩色图像 img = cv2.imread('lena.png') ``` 接着,我们可以使用全局阈值方法进行图像分割。这里我们选择使用Otsu算法来确定阈值: ```python # 全局阈值分割 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, thresh1 = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) ``` 然后,我们可以使用自适应阈值方法进行图像分割。这里我们选择使用自适应高斯阈值方法: ```python # 自适应阈值分割 thresh2 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) ``` 最后,我们将分割结果保存为图像: ```python # 保存分割结果 cv2.imwrite('global_threshold.png', thresh1) cv2.imwrite('adaptive_threshold.png', thresh2) ``` 完整代码如下: ```python import cv2 import numpy as np # 读取彩色图像 img = cv2.imread('lena.png') # 全局阈值分割 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, thresh1 = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) # 自适应阈值分割 thresh2 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) # 保存分割结果 cv2.imwrite('global_threshold.png', thresh1) cv2.imwrite('adaptive_threshold.png', thresh2) ``` 运行后,会生成两张分割后的图像:`global_threshold.png`和`adaptive_threshold.png`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matlab科研助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值