【图像分割】直方图的自适应阈值方法分割前景与背景【含Matlab源码 2144期】

⛄一、一种基于直方图的实时自适应阈值分割方法简介

1 引言
在交通管理中,为了获得车辆的运动数据,需要对交通视频进行实时监测,从监测图像序列中检测出运动对象,并对运动对象进行分析处理,从而获得车辆和行人的运动数据。实时视频运动对象检测与跟踪是数字图像处理技术的一个主要部分,它是计算机视觉、目标识别与跟踪、安全监控等视频分析和处理的应用的关键技术。常用的视频运动目标检测算法主要有基于相邻帧差分的算法和基于背景图像和当前帧差分的算法。对于背景差法,其基本原理是将当前帧与背景图像进行差分来得到差图像,对得到的差图像还应作二值化处理,从而分割出运动目标。传统的目标分割方法主要包括:阈值法、边缘检测法和区域跟踪法等。其中阈值化方法由于计算简单、运算效率高,所以是图像分割的常用方法。
常用的二值化算法有,最大类间方差法,它是由大津(Otsu N.A)于1979年提出的,是基于整幅图像的统计特性,实现阈值的自动选取的。但是当目标和背景对比不明显即灰度相差不大或图像有噪声时,大津法 (Otsu) 的效果不理想。根据直方图进行分割,一般直方图呈现双峰形状,一个峰为背景,另一个峰对应目标,选择两峰之间的谷作为阈值T来进行分割,能得到较好结果,但是在光照和噪声影响下,不能形成双峰形状。另外对于差图像,其直方图呈现递减形状,而不是双峰形状,故其直方图自适应阈值的确定就不可能用到双峰谷底分割,针对这样的直方图提出了一种自适应阈值的方法,该方法主要思想为,将统计出的频率值从高到低排序,这样就形成了一条光滑递减的直方图曲线,将直方图最高点与最低点连接得到一条直线,然后取出直方图上的到该直线距离最大的点对应的灰度值作为阈值来进行二值化。该算法对每一个点计算距离时,计算量大,速度慢。鉴于此,本文提出了一种快速计算最大距离的方法,避免了大量的乘法运算。

2 一般自适应阈值法
在运动目标检测中,在用背景差方法获得差图像后,通过观察该图像直方图可以看出,直方图基本上是呈递减状态,如图 1 所示,为了保证直方图的递减,将该直方图频率排序,得到一组从高到低的频率,其直方图就绝对递减了,为了消除直方图锯齿,用高斯滤波进行平滑处理,下面就是寻找阈值,用以将图像分割成二值图。该算法步骤如下: (1)寻找直方图上的最高点和最低点,连接得到一条直线。
(2)在直方图上求每一点到该直线的距离。
(3)通过比较求出最大的一个距离,该距离对应的灰度值(横坐标)即为所求阈值T。
(4)用第三步求得的阈值T分割差图像,即:
【图像分割】直方图的自适应阈值方法分割前景与背景【含Matlab源码 2144期】_第1张图片
【图像分割】直方图的自适应阈值方法分割前景与背景【含Matlab源码 2144期】_第2张图片

⛄二、部分源代码

close all;
[F_name P_name]=uigetfile(‘*.jpg’,‘Open a jpg’); %文件打开对话框
H= strcat(P_name,F_name);
image_H = imread(H);
[row column] = size(image_H);

%设定三个阈值
set_T = {‘S_T1:’,‘S_T2:’,‘S_T3:’};%设置三个阈值
answer = inputdlg(set_T);%打开输入对话框
if isempty(answer)
return;
end
S_T1 = str2num(answer{1});
S_T2 = str2num(answer{2});
S_T3 = str2num(answer{3});

%original
figure;
imshow(image_H);
title(‘original’);

%S_T1
HH = zeros(row,column);
[r c] = find(image_H>S_T1);
index = sub2ind(size(HH),r,c);
HH(index) = 1;
figure;
imshow(HH);
title(['threshold = ’ num2str(S_T1)]);

%S_T2
HH = zeros(row,column);
[r c] = find(image_H>S_T2);
index = sub2ind(size(HH),r,c);
HH(index) = 1;
figure;
imshow(HH);
title(['threshold = ’ num2str(S_T2)]);

%S_T2
HH = zeros(row,column);
[r c] = find(image_H>S_T3);
index = sub2ind(size(HH),r,c);
HH(index) = 1;
figure;
imshow(HH);
title(['threshold = ’ num2str(S_T3)]);

%自适应阈值法
GrayLevelCount = 256;
image_HH = double(image_H);
histogram = imhist(image_H);
fg = histogram/(row*column);

mean_value = sum(sum(image_HH))/(row*column);
P = 0;
K_array = zeros(GrayLevelCount,1);
for GrayLevel = 1:GrayLevelCount %遍历灰度级
threshold_current = GrayLevel - 1;
P_out = sum(fg(1:threshold_current)); %前景outlook
P_back = 1 - P_out;%背景background

Mean_out = 0;
Mean_back = 0;
for i = 1:GrayLevelCount
    j = i-1;
    if i < threshold_current+1   %左侧取到阈值
        Mean_out = Mean_out + j*fg(i);
    else
        Mean_back = Mean_back + j*fg(i);
    end
end

⛄三、运行结果

【图像分割】直方图的自适应阈值方法分割前景与背景【含Matlab源码 2144期】_第3张图片
【图像分割】直方图的自适应阈值方法分割前景与背景【含Matlab源码 2144期】_第4张图片
【图像分割】直方图的自适应阈值方法分割前景与背景【含Matlab源码 2144期】_第5张图片

【图像分割】直方图的自适应阈值方法分割前景与背景【含Matlab源码 2144期】_第6张图片

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]左建军,吴有富.一种基于直方图的实时自适应阈值分割方法[J].毕节学院学报. 2014,32(04)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

你可能感兴趣的:(Matlab图像处理(进阶版),matlab,开发语言)