阈值分割
从背景中提取物体的一种明显方法是,选择一个将这些模式分开的阈值 T。然后,f(x,y)>Tf(x,y)>Tf(x,y)>T的任何点 (x, y) 称为个对象点,否则该点称为背景点。
灰度阈值的成功与否直接关系到可区分直方图模式的波谷的宽度和深度。
而影响波谷特性的关键因素有以下几点:
(1)波峰间的间隔 (波峰离得越远,分离这些模式的机会越大);
(2)图像中的噪声内容 (模式随噪声的增加而展宽);
(3)物体和背景的相对尺寸;
(4)光源的均匀性;
(5)图像反射特性的均匀性。
基本全局阈值处理
当物体和背景像素的灰度分布十分明显时,可以用适用于整个图像的单个 (全局) 阈值。
实验思想
在大多数应用中,通常图像之间有较大变化,即使全局阈值是种合适的方法,也需要有能对每幅图像自动估计阈值的算法。下面的迭代算法可用于这一目的:
1.为全局阈值 T 选择一个初始估计值。
2.使用用初始的 T 分割该图像。这将产生两组像素:
G1 由灰度值大于 T 的所有像素组成,G2 由所有小于等于 T 的像素组成。
3.对 G1 和 G2 的像素分别计算平均灰度值 (均值)m1 和 m2。
4.计算一个新的阈值: T = (m1 + m2)/2
5.重复步骤 2 到步骤 4,直到连续迭代中的 T 值间的差小于个预定义的参数 dT 为止。
代码
主函数:
%% 运行 main_Global.m
clc;
clear;
close all;
%% 课本图 10.34
im = imread('Fig1038(a)(noisy_fingerprint).tif'); % 原始图像 uint8
% 得到图像的行数、列数、以及每像素的维数(防止出现RGB图像)
[line,row,v]=size(im);
im = im(:,:,1);
t0 = sum(im(:))/(line*row);
[im1,NK] = Global_Threshold(im,0,t0);
x = 1:256;
%% 将结果保存到当前目录下的result文件夹下
imwrite(im, sprintf('result/%s.jpg','2_im1'));
imwrite(im1, sprintf('result/%s.jpg','2_im2'));
%% 显示图像
figure(1);
subplot(131); imshow(im); title('原图'); axis on
subplot(133); imshow(im1); title('全局阈值'); axis on
subplot(132); plot(x,NK); title('直方图'); axis on
功能函数:
function [im1,NK] = Global_Threshold(im,dT,T0)
[h,w] = size(im);
%% 得到直方图和累计直方图
[NK,CH] = myHisteq(im);
G1sum = 0;
G2sum = 0;
dTemp = 255;
while(dTemp<dT)
for i = 1:T0
G1sum = G1sum + (i-1)*NK(i);
end
G1Ave = G1sum/CH(T0);
for i = T0+1:256
G2sum = G2sum + (i-1)*NK(i);
end
G2Ave = G2sum/(CH(256)-CH(T0));
temp = round((G1Ave+G2Ave)/2);
dTemp = abs(temp - T0);
T0 = temp;
end
im1 = zeros(h,w);
for i =1:h
for j = 1:w
if(im(i,j)>=T0)
im1(i,j) = 1;
end
end
end
im1 = logical(im1);
实验结果

用 Otsu 的最佳全局阈值
Otsu 方法是最佳的,因为它使得类间方差最大化。其基本思想是,适当的阈值化的类就其像素灰度值而言,应当是截然不同的,相反地,就其灰度值而言,给出最佳类间分离的阈值 将是最佳的阈值。除了其最佳性之外,Otsu 方法还有一个重要的特性,即它完全以在一幅图像的直方图上执行计算为基础,直方图是很容易得到的一维阵列。
实验思想
Otsu 算法计算步骤如下:
1.计算输人图像的归一化直方图。使用 pi,i=0,1,2,.,L-1 表示该直方图的各个分量。
2. 对于 k=0, 1,2,.,L-1,计算累积和 P1(k) 和 P2(k), 计算公式为:
P1(k)=∑i=0kpi=1−P2(k)P1(k) = \sum_{i=0}^{k} pi = 1 - P2(k)P1(k)=i=0∑kpi=1−P2(k)
3.对于 k=0,1,2…,L-1, 计算累积均值 m1(k) 和 m2(k)。计算公式为:
m1(k)=1P1(k)∗∑i=0k(i∗pi)m1(k) = \frac{1}{P1(k)} * \sum_{i=0}^{k} (i*pi) m1(k)=P1(k)

本文深入探讨了阈值分割技术在图像处理中的应用,包括全局阈值、Otsu阈值、图像平滑改进及可变阈值处理。通过不同场景和算法的对比,展示了如何根据图像特性选择合适的阈值分割方法。
最低0.47元/天 解锁文章
1610





