Matlab 迭代法计算灰值图像的level

Matlab 迭代法计算灰值图像的level

Matlab中,已知函数im2bw(X,Level),默认level为0.5。这里level为阈值,其含义是:

第Xij个像素,利用利用二值化处理时,level=T为临界值。

在确定T的大小时,可以用迭代法确定:

1、首先选择图像的平均灰度值作为初始阈值T0=108

2、根据初始阈值,将图像分为两部分,C1部分灰度值大于T,C2部分灰度值小于T

3、计算C1部分和C2部分的平均灰度值:

 4、再计算新的阈值:

5、重复迭代第2-4步,当Ti+1和Ti的差几乎为0时,停止迭代,此时T为最佳阈值。

代码如下:

clc
clear all
close all
I=imread('0.jpg');
B=rgb2gray(I);
B=double(B);
mean(B(:))
[r,c]=size(B);
T(1)=108;
T(2)=10;
a=0;
b=0;
su1=0;
su2=0;
for k=2:1000
    if( T(k)-T(k-1)>0.0001 | T(k)-T(k-1) <(-0.0001))
    for i=1:r
        for j=1:c
           if B(i,j)>T(k)
               su1=B(i,j)+su1;
               a=a+1;
           else
               su2=B(i,j)+su2;
               b=b+1;
           end
        end
    end
    u1=su1/a;
    u2=su2/b;
    T(k+1)=(u1+u2)/2;
    else T(k)
    end
end
t=T(800)/255
figure;imshow(I);
B=im2bw(I,t);
figure;imshow(B);

    

 效果如图:

此时level=0.4869

 

     在具体应用过程中,根据图像的不同,可以修改level大小,如果图像色彩比较丰富,内容饱满,level值可以设置大点,靠近1;如果色彩单一,内容较少,则level值设置靠近0。

      在matlab中,还可以使用imbinarize函数,默认情况下,imbinarize 使用 Otsu 方法,该方法选择特定阈值来最小化阈值化的黑白像素的类内方差

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以帮你解答这个问题。 首先,分割阈值的选择对于图像分割的效果至关重要。在 MATLAB 中,可以使用迭代法来选择最佳的分割阈值,常用的迭代法包括 Otsu 法和基于最大熵原理的迭代法。 以 Otsu 法为例,可以按照以下步骤进行分割: 1. 读入图像并将其转换为灰度图像。 2. 计算图像的直方图,并归一化到 0-1 范围内。 3. 初始化最佳分割阈值为 0,最大类间方差为 0。 4. 遍历灰度级,计算当前灰度级为分割阈值时的类间方差,并与最大类间方差进行比较。如果当前类间方差大于最大类间方差,则更新最佳分割阈值和最大类间方差。 5. 将图像按照最佳分割阈值进行二值化。 下面是一个示例代码: ```matlab % 读入图像 img = imread('test.jpg'); % 将图像转换为灰度图像 gray = rgb2gray(img); % 计算图像的直方图,并归一化 histogram = imhist(gray) / numel(gray); % 初始化最佳分割阈值和最大类间方差 best_threshold = 0; best_variance = 0; % 遍历灰度级 for i = 1:256 % 计算当前灰度级为分割阈值时的类间方差 w0 = sum(histogram(1:i)); w1 = sum(histogram(i+1:end)); u0 = sum(histogram(1:i) .* (1:i)') / w0; u1 = sum(histogram(i+1:end) .* (i+1:256)') / w1; variance = w0 * w1 * (u0 - u1)^2; % 更新最佳分割阈值和最大类间方差 if variance > best_variance best_threshold = i - 1; best_variance = variance; end end % 将图像按照最佳分割阈值进行二值化 binary = gray > best_threshold; % 显示原图和分割结果 figure; subplot(1,2,1); imshow(img); title('原图'); subplot(1,2,2); imshow(binary); title('分割结果'); ``` 希望这个回答可以帮助到你。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱学习的呆子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值