自适应阈值
在许多的情况下,背景的灰度值并不是常数,物体和背景的对比度在图像中也有变化。这时,一个在图像中某一区域效果良好的阈值在其它区域却可能效果很差。在这种情况下,把灰度阈值取成一个随图像中位置缓慢变化的函数值是适宜的。
一种处理这种情况的方法就是将图像进一步细分为子图像,并对不同的子图像使用不同的阈值进行分割。这种方法的关键问题是如何将图像进行细分和如何为得到的子图像估计阈值。
示例代码
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:widfor j =1:lenm = I_gray(i,j)+1;%图像的灰度级mhist(m) = hist(m)+1;%灰度值为i的像素和end
end%直方图归一化hist = hist/(wid*len);%各灰度值概率 PimiuT = 0;%定义总体均值for m = 1:colorLevelmiuT = miuT+(m-1)*hist(m); %总体均值endxigmaB2 = 0;for mindex = 1:colorLevelthreshold = mindex-1;%设定阈值omega1 = 0;%目标概率omega2 = 0;%背景概率for m = 1:threshold-1omega1 = omega1+hist(m);% 目标概率 W0endomega2 = 1-omega1; %背景的概率 W1miu1=0;%目标的平均灰度值miu2=0;%背景的平均灰度值for m=1:colorLevelif m<thresholdmiu1=miu1+(m-1)*hist(m);%目标 i*pi的累加值[1 threshold]elsemiu2=miu2+(m-1)*hist(m);%背景 i*pi的累加值[threshold m]endendmiu1 = miu1/omega1;%目标的平均灰度值miu2 = miu2/omega2;%背景的平均灰度值xigmaB21 = omega1*(miu1-miuT)^2+omega2*(miu2-miuT)^2;%最大方差xigma(mindex) = xigmaB21;%先设定一个值 再遍历所有灰度级%找到xigmaB21的值最大if xigmaB21>xigmaB2finalT = threshold;%找到阈值 灰度级xigmaB2 = xigmaB21;%方差为最大endend
%阈值归一化fT = finalT/255;for i = 1:widfor j = 1:lenif I_double(i,j)>finalT %大于所设定的均值 则为目标bin(i,j) = 1;elsebin(i,j) = 0;endendendsubplot(122),imshow(bin);