图像分割:1.基于阈值的图像分割方法(p-tile、双峰法)

近段时间再学习图像分割,我会更新一些基础的图像分割方法,比较常用的我会附上matlab代码,希望和大家一起学习进步。

1. P-tile法

  一般用于灰度图像,使用条件是已知目标在政府图像中所占的面积比为P%,先得到图像的灰度直方图,然后从小到大累加,直到为P%,记录当前灰度,以它为阈值来分割图像。条件很苛刻,大部分情况下都用不上。

2.双峰法 

要求目标图像和背景图像的灰度级有着明显的区别,并且该图像的灰度直方图有较明显的双峰。分割图像的直方图的双峰分别代表目标图像和背景图像,而波谷代表着分割图像的边缘。
matlab有findpeaks()函数帮助我们来找到峰值:

findpeaks函数参数有很多,这里只是简单的介绍:
[pks, locs] = findpeaks(data);
输出是每个峰值的数值及其横坐标
findpeaks(data);
系统输出峰值图线
[...] = findpeaks(data,'minpeakheight',mph)----mph 设定峰值的最小高度
[...] = findpeaks(data,'minpeakdistance',mpd)----mpd 设定两峰值间的最小间隔数

图像分割:1.基于阈值的图像分割方法(p-tile、双峰法)_第1张图片

除了findpeaks函数,还有方法可以找到波峰和波谷:

IndMin=find(diff(sign(diff(data)))>0)+1;
IndMax=find(diff(sign(diff(data)))<0)+1;
IndMin, data(IndMin)对应的是波谷点的数据
IndMax,data(IndMax)对应的是波峰点的数据

注:
这里介绍一下diff()和sign()
图像分割:1.基于阈值的图像分割方法(p-tile、双峰法)_第2张图片
图像分割:1.基于阈值的图像分割方法(p-tile、双峰法)_第3张图片
图像分割:1.基于阈值的图像分割方法(p-tile、双峰法)_第4张图片
 

sign(x)
当x<0时,返回-1
当x=0时,返回0
当x>0时,返回1

接下来我们就开始试验用一下双峰法来将图像二值化吧:
f = imread('1.jpg');
f_gray = rgb2gray(f);
% imshow(f_gray);
f_h = imhist(f_gray);
% disp(max(imhist(f_gray)));
MinPeakHeight = max(f_h)/4;
[a, b] = findpeaks(f_h, 'MinPeakDistance',8,'MinPeakHeight',MinPeakHeight, 'NPeaks', 8);
[max_1, c] = max(a);
a(c) = 0;
[max_2, d] = max(a);
T = ceil(0.5*(b(c) + b(d)))/255;
f_gray = mat2gray(f_gray);
f_bw = im2bw(f_gray, T);
% imshow(f_bw);

图像分割:1.基于阈值的图像分割方法(p-tile、双峰法)_第5张图片图像分割:1.基于阈值的图像分割方法(p-tile、双峰法)_第6张图片图像分割:1.基于阈值的图像分割方法(p-tile、双峰法)_第7张图片

图像分割:1.基于阈值的图像分割方法(p-tile、双峰法)_第8张图片图像分割:1.基于阈值的图像分割方法(p-tile、双峰法)_第9张图片(下面一排左边是灰度图像的直方图,右边是提取到的峰值图片)

利用findpeaks函数来处理这种峰值不是很明显的图片效果不怎么好。

 

结束语:冈萨雷斯这本书我刚刚开始看,可能会有一些理解不正确的地方,希望大家能够在我文章

下留言,帮我改正。另外想要和我一起自学的小伙伴,可以加我的微信号:13027158275

或者加入数字图像处理交流QQ群:709538582

 

你可能感兴趣的:(图像分割:1.基于阈值的图像分割方法(p-tile、双峰法))