iterative.m 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. %基于贝叶斯分类算法的图像阈值分割
  2. clear
  3. clc;
  4. Init = imread('SLR.bmp');
  5. Im=rgb2gray(Init);
  6. subplot(131),imhist(Im),title('直方图')
  7. subplot(132),imshow(Im)
  8. title('原始图像')
  9. [x,y]=size(Im); % 求出图象大小
  10. b=double(Im);
  11. zd=double(max(Im)) % 求出图象中最大的灰度
  12. zx=double(min(Im)) % 最小的灰度
  13. T=double((zd+zx))/2; % T赋初值,为最大值和最小值的平均值
  14. count=double(0); % 记录几次循环
  15. while 1 % 迭代最佳阈值分割算法
  16. count=count+1;
  17. S0=0.0; n0=0.0; %为计算灰度大于阈值的元素的灰度总值、个数赋值
  18. S1=0.0; n1=0.0; %为计算灰度小于阈值的元素的灰度总值、个数赋值
  19. for i=1:x
  20. for j=1:y
  21. if double(Im(i,j))>=T
  22. S1=S1+double(Im(i,j)); %大于阈域值图像点灰度值累加
  23. n1=n1+1; %大于阈域值图像点个数累加
  24. else
  25. S0=S0+double(Im(i,j)); %小于阈域值图像点灰度值累加
  26. n0=n0+1; %小于阀域值图像点个数累加
  27. end
  28. end
  29. end
  30. T0=S0/n0; %求小于阀域值均值
  31. T1=S1/n1; %求大于阀域值均值
  32. if abs(T-((T0+T1)/2))<0.1 %迭代至 前后两次阀域值相差几乎为0时 停止迭代。
  33. break;
  34. else
  35. T=(T0+T1)/2; %在阈值T下,迭代阈值的计算过程
  36. end
  37. end
  38. count %显示运行次数
  39. T
  40. i1=im2bw(Im,T/255); % 图像在最佳阈值下二值化
  41. subplot(133),imshow(i1)
  42. title('实验结果')