实现思路
- 绘制原图像的灰度直方图,观察灰度直方图并估计两个峰值对应的灰度值范围
- 在两个峰值对应的灰度值范围内搜索谷底(最小值)对应的灰度值
- 将搜索到的谷底对应的灰度值作为灰度阈值,并对大于或小于灰度阈值的部分作相应的处理
将图像中所有灰度值大于阈值的像素点认为是组成物体的点,称为目标点;将图像中那些灰度值小于等于阈值的像素点认为是组成背景的点,称为背景点。
此时的处理方式可以有很多种,可根据实际情况进行调整:
- 阈值化的方法将灰度值大于等于阈值的像素点和小于阈值的像素点的灰度值分别设为0和1,具体看是从暗的背景中分割亮的物体还是亮的背景中分割暗的物体。
- 半阈值化的方法将比阈值大的亮像素的灰度值保持不变,而将阈值小的暗像素变为黑色;或是将比阈值小的暗像素的灰度值保持不变,而将比阈值大的亮像素变为白色。
实现效果
参考代码
使用了matlab中自带的cameraman图片进行处理,图片是二维的灰度图,size(im,1)、size(im,2)分别对应二维灰度图数组的行列长度。
im=imread('cameraman.tif');
im2=imhist(im); //im2为原图像对应的灰度直方图,数组索引号代表灰度值,索引号所对应的值为该灰度值下像素点的个数
min=size(im,1)*size(im,2);
minindex=0;
figure('name','灰度直方图')
imhist(im)
figure('name','半阈值化图像分割')
subplot(1,2,1)
imshow(im)
title('原图像')
for i=10:165 //观察灰度直方图估计两个峰值对应的灰度值范围
if(im2(i)<min)
min=im2(i);
minindex=i; //注意索引号对应的才是灰度值!!
end
end
for i=1:size(im,1)
for j=1:size(im,2)
if(im(i,j)>=minindex)
im(i,j)=255; //半阈值化的方法,从亮的背景中分割出暗的物体
end
end
end
subplot(1,2,2)
imshow(im)
title('阈值分割图像')