Matlab Image Segmentation

本文主要介绍Matlab实现的两种自动阈值图像分割方法

1.基于迭代的自动阈值图像分割方法

参考文献: 基于迭代(自动阈值)算法的医学图像增强方法 该文献实现了全局和局部的图像分割代码,使用的都是迭代算法,对比下面的结果可以看出,在灰度差异特别大的图像中,局部阈值分割要比全局阈值分割表现更好。[注:我对源码略有修改]

1.1 全局阈值分割程序

original_image=imread('test1.png');
gray_image=rgb2gray(original_image);
gray_image=double(gray_image);
t=mean(gray_image(:));
is_done=false;
count=0;%迭代次数
block=gray_image(1:end,1:end);%不分块
while ~is_done
    r1=find(gray_image<=t);
    r2=find(gray_image>t);
    temp1=mean(block(r1));
    if isnan(temp1);
        temp1=0;
    end
    temp2=mean(block(r2));
    if isnan(temp2)
        temp2=0;
    end
    t_new=(temp1+temp2)/2;
    is_done=abs(t_new-t)<1;%差异阈值是1
    t=t_new;
    count=count+1;
    if count>=1000
        Error='Error:Cannot find the ideal threshold.'
        return
    end
end
[m,n]=size(gray_image);
result=zeros(m,n)+255;
result(r1)=0;
% resule(r2)=255;
result=uint8(result);
figure
imshow(result);

1.2 局部阈值分割程序

original_image=imread('test1.png');
gray_image=rgb2gray(original_image);
gray_image=double(gray_image);
[m,n]=size(gray_image);
result=zeros(m,n);
block_size=70;%分块大小
for i=1:block_size:m
    for j=1:block_size:n
        if ((i+block_size)>m)&&((j+block_size)>n)
            block=gray_image(i:end,j:end);
        elseif ((i+block_size)>m)&&((j+block_size)<=n)
            block=gray_image(i:end,j:j+block_size-1);
        elseif ((i+block_size)<=m)&&((j+block_size)>n)
            block=gray_image(i:i+block_size-1,j:end);
        else
            block=gray_image(i:i+block_size-1,j:j+block_size-1);
        end
        t=mean(block(:)); t_org=t; is_done=false; count=0;
        while ~is_done
            r1=find(block<=t); r2=find(block>t); temp1=mean(block(r1));
            if isnan(temp1);
                temp1=0;
            end
            temp2=mean(block(r2));
            if isnan(temp2)
                temp2=0;
            end
            t_new=(temp1+temp2)/2; is_done=abs(t_new-t)<1; t=t_new;
            count=count+1;
            if count>=1000
                Error='Error:Cannot find the ideal threshold.'
                return
            end
        end
        block(r1)=0;
        block(r2)=255;
        if ((i+block_size)>m)&&((j+block_size)>n)
            result(i:end,j:end)=block;
        elseif ((i+block_size)>m)&&((j+block_size)<=n)
            result(i:end,j:j+block_size-1)=block;
        elseif ((i+block_size)<=m)&&((j+block_size)>n)
            result(i:i+block_size-1,j:end)=block;
        else
            result(i:i+block_size-1,j:j+block_size-1)=block;
        end
    end
end
resule=uint8(result);
figure
imshow(result);

对比结果:

2.基于OSTU算法的自动阈值图像分割

[这块我还没有细究…To be continued……] Matlab内置的graythresh使用的便是OSTU算法,使得白色像素和黑色像素的类间方差最大。 因为上面测试图像的亮度存在明显的水平差异,所以我写了一个将图像沿水平方向分成几部分分别进行OSTU算法,效果明显又比上面两种方式要好些。

function [ result ] = partialostu( image,part,isrgb )
%PARTIALOSTU partial image ostu
if isrgb
    image=rgb2gray(image);
end
cols=size(image,2);
result=zeros(size(image));
for i=1:part
    fstart=floor((i-1)*cols/part)+1;
    fend=floor(i*cols/part);
    f=image(:,fstart:fend);
    t=graythresh(f);
    f=im2bw(f,t);
    result(:,fstart:fend)=f;
end
end

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习算法与Python学习

干货|多重预训练视觉模型的迁移学习

关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第一 【Python】:排名第三 【算法】:排名第四 源 | 全球人工智能 本文介绍的是基...

48570
来自专栏数据科学学习手札

(数据科学学习手札40)tensorflow实现LSTM时间序列预测

  上一篇中我们较为详细地铺垫了关于RNN及其变种LSTM的一些基本知识,也提到了LSTM在时间序列预测上优越的性能,本篇就将对如何利用tensorflow,在...

59340
来自专栏ATYUN订阅号

深度实践:如何用神经网络给黑白照片着色

现如今,将图片彩色化是通常用Photoshop处理的。一幅作品有时候需要用一个月的时间来着色。可能单单一张脸就需要20层的粉色、绿色和蓝色阴影才能让它看起来恰到...

32670
来自专栏杨熹的专栏

Sklearn 快速入门

学习资料:大家可以去莫烦的学习网站学到更多的知识。 本文结构: Sklearn 简介 选择模型流程 应用模型 ---- Sklearn 简介 Scikit...

39880
来自专栏AI研习社

我们建了个模型,搞定了 MNIST 数字识别任务

对于图像分类任务,当前最先进的架构是卷积神经网络 (CNNs).。无论是面部识别、自动驾驶还是目标检测,CNN 得到广泛使用。在本文中,针对著名的 MNIST ...

10020
来自专栏专知

【前沿】 何恺明大神ICCV2017最佳论文Mask R-CNN的Keras/TensorFlow/Pytorch 代码实现

导读 何恺明大神的论文Mask R-CNN 获得ICCV最佳论文 ,而关于这篇论文的TensorFlow\Pytorch\Keras实现相继开源出来,让我们来看...

38790
来自专栏TensorFlow从0到N

TensorFlow从0到1 - 7 - TensorFlow线性回归的参数溢出之坑

? 上一篇 6 解锁梯度下降算法解释清楚了学习率(learning rate)。本篇基于对梯度下降算法和学习率的理解,去填下之前在线性回归中发现的一个坑。 ...

39570
来自专栏IT派

用 Keras 编写你的第一个人工神经网络

创建一个新的文件,命名为 keras_first_network.py ,然后将教程的代码一步步复制进去。

16250
来自专栏人工智能LeadAI

TensorFlow从0到1 | 第七篇:TensorFlow线性回归的参数溢出之坑

上一篇 6 解锁梯度下降算法 解释清楚了学习率(learning rate)。本篇基于对梯度下降算法和学习率的理解,去填下之前在线性回归中发现的一个坑。 在5 ...

30250
来自专栏新智元

【前沿】何恺明大神ICCV2017最佳论文Mask R-CNN的Keras/TensorFlow/Pytorch 代码实现

【新智元导读】何恺明大神的论文Mask R-CNN 获得ICCV最佳论文 ,而关于这篇论文的TensorFlow\Pytorch\Keras实现相继开源出来,让...

46690

扫码关注云+社区

领取腾讯云代金券