matlab实现图像阈值分割(人工选择、自动阈值、分水岭算法)

        图像阈值分割是一种简单但有效的图像分割方法,其基本思想是将图像中的像素根据其灰度值与预定的阈值进行分类。这个过程可以将图像分成两个部分:前景和背景。

1.人工选择法

        图像阈值分割的人工选择法是最基础的方法之一,它需要手动选择一个阈值来将图像分成前景和背景。

        具体步骤如下:

  1. 选择一张要进行分割的图像,并将其转化为灰度图像。

  2. 确定要分割的区域,并观察图像中前景和背景的灰度特点。

  3. 手动选择一个阈值,通常是在前景和背景的灰度值之间进行选择。

  4. 将图像中所有大于阈值的像素设为前景,将小于或等于阈值的像素设为背景。

  5. 对分割结果进行检查和优化。如果分割效果不理想,可以通过修改阈值或者采用其他阈值寻找方法来改进分割效果。

        需要注意的是,使用人工选择法进行图像阈值分割时,阈值的选择往往是主观的,并且难以适应各种不同类型的图像。因此,在实际应用中,人工选择法并不是最优方法,还需要结合其他自适应的方法,如OTSU阈值和自适应阈值等,来提高分割效果。

clear all;
close all;
clc;
I=imread('rice.png');
I=rgb2gray(I);
% 全阈值,利用直方图人工选择阈值
J=I>125;
figure;
subplot(131),imshow(I);
subplot(132),imhist(I);
subplot(133),imshow(J),title('人工选择阈值');

 2.自动阈值法

        图像阈值分割的自动阈值法是一种可以自动选择最佳阈值进行分割的方法,其中包括OTSU阈值和自适应阈值等方法。这些方法不需要人为干预,可以根据图像特征自动选择合适的阈值。

        1.OTSU阈值

        OTSU阈值法是利用图像像素值的方差作为分类标准来确定最佳阈值的方法。它将图像划分为两个部分:背景和前景。具体步骤如下:

  • 将图像转换成灰度图像
  • 计算所有像素强度值的直方图
  • 对每个像素强度值,计算其对应的类内方差和类间方差
  • 在所有像素强度值中找到最大的类间方差对应的像素强度值,即为OTSU阈值

        2.自适应阈值

        自适应阈值法是一种基于局部灰度值的统计特性动态地确定阈值的方法。其主要思想是根据图像的局部特征来确定每个像素的阈值。主要步骤如下:

  • 选择一个合适的邻域大小
  • 遍历图像,对于每个像素使用该像素周围的邻域灰度信息来计算阈值
  • 调整阈值并将图像分割为前景和背景

        需要注意的是,自适应阈值法通常在有噪声或者对比度较低的图像中表现出色,但是计算量较大,不适用于实时的图像处理。

clear all;
close all;
clc;
I=imread('rice.png');
I=rgb2gray(I);
I=im2double(I);
T0=0.01;
T1=(min(I(:))+max(I(:)))/2;%选取最大和最小像素的中间值作为T1
r1=find(I>T1);
r2=find(I<=T1);
T2=(mean(I(r1))+mean(I(r2)))/2;%新的阈值T2
while abs(T2-T1)<T0
    T1=T2;
    r1=find(I>T1);
    r2=find(I<=T1);
    T2=(mean(I(r1))+mean(I(r2)))/2;
end
J=im2bw(I,T2);
T=graythresh(I);%获取阈值,采用Otsu算法获取最佳阈值
J2=im2bw(I,T);
figure;
subplot(131),imshow(I);
subplot(132),imshow(J),title('迭代阈值');
subplot(133),imshow(J2),title('Otsu算法');

 

 3.分水岭算法

        分水岭算法是一种基于数学形态学的图像分割方法,它通常用于对复杂图像进行分割。分水岭是指将图像看作一个地形图,其中图像中的亮度值表示海拔高度,然后从高处向低处模拟水流流向,最终水汇聚的地方就是分割的边界。

        具体来说,分水岭算法可以分为以下几个步骤:

  1. 对原始图像进行灰度化、滤波等预处理操作。

  2. 计算梯度图像,找到局部极大值点,这些极大值点代表了图像中的物体轮廓。

  3. 将局部极大值点标记为种子点,并进行漫水填充操作。这个过程中,每个种子点被视为一个“水滴”,并向周围像素扩张,直到不再有满足条件的像素。

  4. 对标记过的像素进行联通性分析,得到物体的分割结果。

        需要注意的是,分水岭算法对图像前景和背景之间存在高差和断层的情况下表现出色,但对于噪声等干扰因素较为敏感,容易产生过分割或欠分割现象,因此,在实际应用中需要结合其他算法进行处理。

clear all;
close all;
clc;
I=imread('coin.png');
J=rgb2gray(I);
I=double(J);
hv=fspecial('prewitt');
hh=hv.';
gv=abs(imfilter(I,hv,'replicate'));
gh=abs(imfilter(I,hh,'replicate'));
g=sqrt(gv.^2+gh.^2);
df=bwdist(I);
L=watershed(df);
em=L==0;
im=imextendedmax(I,20);
g2=imimposemin(g,im|em);
L2=watershed(g2);
wr2=L2==0;
[m,n]=size(wr2);
f=zeros(m,n);
figure;
subplot(231),imshow(J),title('原图像');
subplot(232),imshow(uint8(df*8)),title('原图像的距离变换');
subplot(233),imshow(em),title('标记外部约束');
subplot(234),imshow(im),title('标记内部约束');
subplot(235),imshow(g2),title('由标记内外约束重构的梯度图');
subplot(236),imshow(wr2),title('分割结果');

 

  • 15
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Otsu算法是一种基于像素灰度值的图像分割方法,主要用于将图像分为前景和背景两个部分。在Matlab中,可以使用以下代码实现Otsu阈值分割算法的图像分割: ```matlab % 读取图像 img = imread('test.jpg'); % 将图像转换为灰度图像 gray_img = rgb2gray(img); % 计算图像的灰度直方图 histogram = imhist(gray_img); % 计算图像的总像素数 total_pixels = numel(gray_img); % 初始化最优阈值和最大类间方差 max_variance = 0; optimal_threshold = 0; % 遍历所有可能的阈值 for threshold = 1:256 % 计算前景和背景像素的数量 foreground_pixels = sum(histogram(threshold:256)); background_pixels = total_pixels - foreground_pixels; % 计算前景和背景像素的平均灰度值 foreground_mean = sum((threshold:256) .* histogram(threshold:256)) / foreground_pixels; background_mean = sum((1:threshold-1) .* histogram(1:threshold-1)) / background_pixels; % 计算类内方差 intra_class_variance = (foreground_pixels * background_pixels) * (foreground_mean - background_mean) ^ 2; % 更新最大类间方差和最优阈值 if intra_class_variance > max_variance max_variance = intra_class_variance; optimal_threshold = threshold; end end % 使用最优阈值进行图像分割 segmented_img = imbinarize(gray_img, optimal_threshold/255); % 显示原始图像和分割图像 figure; subplot(1,2,1); imshow(img); title('原始图像'); subplot(1,2,2); imshow(segmented_img); title('分割图像'); ``` 在上面的代码中,首先读取一个RGB图像,并将其转换为灰度图像。然后计算图像的灰度直方图,并遍历所有可能的阈值,计算每个阈值对应的前景和背景像素的数量、平均灰度值和类内方差。最后选择使类间方差最大的阈值进行图像分割,并显示原始图像和分割图像

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安心不心安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值