新浪博客

MATLAB数字图像处理 图像分割技术 迭代法

2017-09-05 19:55阅读:
本文为博主原创,转载请注明出处。
迭代法首先选择一个近似阈值T,将图像分割成两部分R1和R2,计算区域R1和R2的均值μ1和μ2,选择新的分割阈值T = (μ1 + μ2)/2 ,重复上述步骤知道μ1和μ2(或T)不再变化为止。这里我已经将迭代法写成了函数,直接调用就可以了。函数源代码如下:
  1. function [ TK ] = diedai( I )
  2. % 图像分割之迭代法获取阈值
  3. % 形参I为原始图像灰度图,返回值为阈值
  4. I = imread('rice.jpg');
  5. ZMAX = max(I);%取出最大灰度值
  6. ZMIN = min(I);%取出最小灰度值
  7. TK = (ZMAX+ZMIN)/2;%初始阈值
  8. BCal = 1;
  9. iSize = size(I);%图像大小
  10. while (BCal)
  11. %定义前景和背景数
br>iForeground = 0;
  • iBackground = 0;
  • %定义前景和背景灰度总和
  • ForegroundSUM = 0;
  • BackgroundSUM = 0;
  • for i = 1:iSize(1)
  • for j = 1:iSize(2)
  • tmp = I(i,j);
  • if tmp >= TK
  • %前景灰度值
  • iForeground = iForeground + 1;
  • ForegroundSUM = ForegroundSUM + double(tmp);
  • else
  • iBackground = iBackground + 1;
  • BackgroundSUM = BackgroundSUM + double(tmp);
  • end
  • end
  • end
  • %计算前景和背景的平均值
  • ZO = ForegroundSUM/iForeground;
  • ZB = BackgroundSUM/iBackground;
  • TKtemp = uint8((ZO + ZB)/2);%新的阈值
  • if TKtemp == TK
  • BCal = 0;
  • else
  • TK = TKtemp;
  • end
  • %当阈值不再变化时,迭代结束
  • end
  • disp(strcat('迭代后的阈值:',num2str(TK)));
  • end

  • 下面简单说下怎么调用,只有一点需要注意,迭代法操作对象为灰度矩阵,不是灰度图的要先转为灰度图。代码如下:
  1. I1 = imread('rice.jpg');
  2. I = rgb2gray(I1);
  3. TK = diedai(I);
  4. newI = imbinarize(I,double(TK/255));

我这里的‘rice.jpg’图片不是灰度图,所以就要先转为灰度图。
效果图我就不放了。图像分割的方法有很多,所以并不是所有的图都适合用迭代法来分割,有的图甚至效果还会非常差,所以想要获得好的分割效果只能不断尝试好的方法。所以,加油吧!我也是刚学,写的不好请见谅!

我的更多文章

下载客户端阅读体验更佳

APP专享