自适应阈值

在许多的情况下,背景的灰度值并不是常数,物体和背景的对比度在图像中也有变化。这时,一个在图像中某一区域效果良好的阈值在其它区域却可能效果很差。在这种情况下,把灰度阈值取成一个随图像中位置缓慢变化的函数值是适宜的。

 一种处理这种情况的方法就是将图像进一步细分为子图像,并对不同的子图像使用不同的阈值进行分割。这种方法的关键问题是如何将图像进行细分和如何为得到的子图像估计阈值。

示例代码

clc,clear all, close all;
img = imread('shouxieyingyu.png');%原图
I_gray = rgb2gray(img);%转换为灰度图
subplot(121),imshow(img);
I_double = double(I_gray); %转换为双精度
[wid,len] = size(I_gray);%图像的大小
colorLevel = 256; %灰度级
hist=zeros(colorLevel,1);%直方图
%计算直方图
for I =1:wid
    for j =1:len
        m = I_gray(i,j)+1;%图像的灰度级m
        hist(m) = hist(m)+1;%灰度值为i的像素和
    end
end
 %直方图归一化
 hist = hist/(wid*len);%各灰度值概率 Pi
 miuT = 0;%定义总体均值
 for m = 1:colorLevel
     miuT = miuT+(m-1)*hist(m);  %总体均值
 end
 xigmaB2 = 0;
 for mindex = 1:colorLevel
     threshold = mindex-1;%设定阈值
     omega1 = 0;%目标概率
     omega2 = 0;%背景概率
     for m = 1:threshold-1
         omega1 = omega1+hist(m);% 目标概率 W0
     end
   omega2 = 1-omega1; %背景的概率 W1
     miu1=0;%目标的平均灰度值
     miu2=0;%背景的平均灰度值
     for m=1:colorLevel
         if m<threshold
             miu1=miu1+(m-1)*hist(m);%目标 i*pi的累加值[1 threshold]
         else
             miu2=miu2+(m-1)*hist(m);%背景 i*pi的累加值[threshold m]
         end
     end
     miu1 = miu1/omega1;%目标的平均灰度值
     miu2 = miu2/omega2;%背景的平均灰度值
     xigmaB21 = omega1*(miu1-miuT)^2+omega2*(miu2-miuT)^2;%最大方差
     xigma(mindex) = xigmaB21;%先设定一个值 再遍历所有灰度级
     %找到xigmaB21的值最大
     if xigmaB21>xigmaB2
         finalT = threshold;%找到阈值 灰度级
         xigmaB2 = xigmaB21;%方差为最大
     end
 end
%阈值归一化
 fT = finalT/255;
 for i = 1:wid
      for j = 1:len
          if I_double(i,j)>finalT %大于所设定的均值 则为目标
              bin(i,j) = 1;
          else
              bin(i,j) = 0;
          end
      end
 end

subplot(122),imshow(bin);

效果图片

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐