前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >matlab | 二值图像分割

matlab | 二值图像分割

作者头像
福贵
发布2019-06-05 15:34:36
1.9K0
发布2019-06-05 15:34:36
举报
文章被收录于专栏:菜鸟致敬菜鸟致敬

博客:http://blog.rare0716.cn

图像分割:把图像空间分成一些有意义的区域,与图像中各种物体目标相对应。

图像分割技术分类

  1. 运算方法
  • 并行边界技术
  • 串行边界技术
  • 并行区域技术
  • 串行区域技术
  1. 结构分割方法
  • 边缘分割法
  • 阈值分割法
  • 基于区域的分割

阈值分割法

基本原理 原始图像f(x,y) 灰度阈值T 阈值运算的二值图像g(x,y) 全局阈值是最简单的图像分割方法。

原理:假定物体和背景分别处于不同灰度级,图像的灰度分布曲线近似用两个正态分布概率密度函数分别代表目标和背景的直方图,出现两个分离的峰值。 依据最小误差理论等准则求出两个峰间的波谷,其灰度值即分割的阈值。

最大类间方法差-大津法

设定一个阈值k,将图像分成两组。 变动k的取值使得两组的类间方差最大,此时该值K为所求分割阈值。

迭代法

选取初始图像灰度值T,把原始图像中全部像素分成前景、背景两大类。 分别对其进行积分并将结果取平均以获取一新的阈值,并按此阈值将图像分成前景、背景。 如此反复迭代下去,当阈值不再发生变化,即迭代已经收敛于某个稳定的阈值时,此刻的阈值即作为最终的结果并用于图像的分割。

具体算法

大津法 微信公众好屏蔽超链接点不开可以复制下面网址再打开 https://blog.csdn.net/qq_29462849/article/details/81022607

代码

大津法

代码语言:javascript
复制
function [newImg,g] = otsu(img)
%OTSU 此处显示有关此函数的摘要
%   此处显示详细说明 返回newImg,g,newImg为二值化的图像,g为阈值
p=zeros(256,1);
w0=zeros(256,1);
w1=zeros(256,1);
u0=zeros(256,1);
u1=zeros(256,1);
u=zeros(256,1);
result=zeros(256,1);
imgSize=size(img);
M=imgSize(1);
N=imgSize(2);
if numel(imgSize)~=2
    img=rgb2gray(img);
end
for t=1:256
    grayScale=t-1;
    x=find(img==grayScale);
    p(t)=length(x)/(M*N);
end
for t=1:256
    w0(t)=sum(p(1:t));
    w1(t)=sum(p(t+1:256));
    u0(t)=0;
    for i=1:t
        u0(t)=u0(t)+(i-1)*p(i)/w0(t);
    end
    u1(t)=0;
    for i=t+1:256
        u1(t)=u1(t)+(i-1)*p(i)/w1(t);
    end
    u(t)=w0(t)*u0(t)+w1(t)*u1(t);
    result(t)=w0(t)*(u0(t)-u(t))^2+w1(t)*(u1(t)-u(t))^2;
end
[~,g]=max(result);
newImg=binaryImg(img,g);
%imshow(newImg);
end

迭代法

代码语言:javascript
复制
function [newImg,g] = iter(img)
%ITERATION 此处显示有关此函数的摘要
%   此处显示详细说明
sz=size(img);
M=sz(1);
N=sz(2);
if numel(sz)~=2
    img=rgb2gray(img);
end
%maxScale=max(max(img));
%minScale=min(min(img));
%g=uint8((maxScale+minScale)/2);
g=128;%直接取较为简单,但是可能增加迭代次数
while 1
    foreCount=0;
    foreSum=0;
    backCount=0;
    backSum=0;
    for i=1:M
        for j=1:N
            if img(i,j)<=g
                foreCount=foreCount+1;
                foreSum=foreSum+double(img(i,j));
            else
                backCount=backCount+1;
                backSum=backSum+double(img(i,j));
            end
        end
    end
    foreAver=foreSum/foreCount;
    backAver=backSum/backCount;
    newG=uint8(foreAver/2+backAver/2);
    if newG==g
        break
    end
    g=newG;
end
newImg=binaryImg(img,g);
%imshow(newImg);
end
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python与MySQL 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 图像分割技术分类
  • 阈值分割法
    • 最大类间方法差-大津法
      • 迭代法
      • 具体算法
      • 代码
        • 大津法
          • 迭代法
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档