[matlab数字图像处理10]对一副图像进行二值化,ostu算法等

一、 问题描述

对一副图像进行二值化,ostu算法等

二、 求解思路

将图像利用imread和rgb2gary后转化为灰度图像,对于直接的二值化,可使用0.5作为阈值
大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.通过设定一个阈值将图像像素分为两类,两者的占比分别为p1,p2,两者的均值分别为m1,m2,全局均值为mG,其中

在这里插入图片描述

通过循环255个像素得到,使得式子
在这里插入图片描述

有最大值,此阈值可以直接使用matlab自带的graythesh算出。本文也尝试利用上文的公式求出使得式子最大的阈值

三. 程序代码

clear;
clc;
close all
x=imread('tupian.jpeg');
subplot(3,3,1)
imshow(x)
title('原图')
%% 利用im2bw直接阈值二值化
T = 0.5;
BW = im2bw(x,T);
subplot(3,3,2)
imshow(BW)
title('利用im2bw直接阈值二值化')
%% 手动阈值二值化
subplot(3,3,3)
f=x;
g=rgb2gray(f);
new_g=zeros(size(g));
new_g(g>125)=1;
imshow(new_g)
title('手动阈值二值化')
%% otsu算法
subplot(3,3,4)
T_otsu=graythresh(g);
p_otsu=im2bw(x,T_otsu);
imshow(p_otsu)
title('matlab自带otsu')
%% 手动otsu算法
subplot(3,3,5)
[row,col]=size(g);
[counts] = histogram(g);
num=counts.Values;
num=num/sum(num);
max=0;
kmax=0;
for i=2:size(num,2)
    p1=sum(num(1:i));
    p2=1-p1;
    sump1=0;
    sump2=0;
    for k=1:i
        sump1=sump1+k*num(k);
    end
    for k=i+1:size(num,2)
        sump2=sump2+k*num(k);
    end
    m1=1/p1*sump1;
    m2=1/p2*sump2;
    thetasq=p1*p2*(m1-m2).^2;
    if thetasq>max
        max=thetasq;
        kmax=i;
    end
end
kmax=(kmax-1)*255/size(num,2);
new_g1=zeros(size(g));
new_g1(g>kmax)=1;
imshow(new_g1)
title('手动阈值二值化')
disp('手动计算otsu阈值')
disp(kmax/255)
disp('matlab自带算法计算阈值')
disp(T_otsu)

四. 实验结果

如图所示分别为原图,使用函数im2bw直接二值化图像,手动利用阈值二值化图像以及利用matlab自带函数计算大津法(otsu)给出阈值对图像二值化和利用手写公式求出阈值对图像二值化

在这里插入图片描述

对于该种情况的图片,手动计算的阈值与matlab自带的算法计算的阈值几乎一致,在计算otsu阈值时,注意使用hist函数获得每个像素值所占的数量。

五、实验心得

直接对函数用二值化分割有时候会不太理想,利用otsu等算法给出的结果能得到更好的分割结果

  • 1
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值