图像分割值OTSU方法介绍

图像分割方法今天暂时不深入讨论了,因为本人目前对于图像二值化和分割认为是一样的,可是很多图像处理任务中会将图像先二值化后再分割,没搞懂~~因此暂时从二值化开始讨论,首先讨论的是OTSU(最大类间方差方法):

假设输入图像为灰度图像(0-255),那么在图像二值化的目的就是对图像进行基于设定阈值的分割得到图像的前景(255)和背景(0),进而得到二值图像。实现过程是,首先统计灰度图像的分布直方图,得到各灰度值对应的像素统计值,随机设定一个阈值T,将图像分为“第一种”二值图像,随后基于该直方图分别计算前景和背景的比重、灰度均值、方差等三种数值,并通过计算比重和方差之和得到该阈值下的图像类间方差计算值,随后对图像基于其它阈值的类间方差计算(如果图像的灰度分布遍布256个灰度值,那么需要计算256次,依次类推),最终以类间方差最大的情况下的T为阈值对图像进行分割进而得到图像的OTSU分割结果。

  1.    clc; clear all;  

  2.     img = im2double(imread(imageFiles{nImage}));  

  3.     [height, width] = size(img);  

  4.     globalThresh = graythresh(img);  

  5.     imgBinGlobal = im2bw(img, globalThresh);

  6.     imhist(img); 

  7.     histCounts = imhist(img);  

  8.     h = plot(globalThresh*ones(1,100), linspace(0,max(histCounts)), 'r-');  

  9.     imgBinLocal = imgBinGlobal;  

  10.     winHalfWidth = 10;  

  11.     localVarThresh = 0.002;  

  12.     for col = 1:width  

  13.         inCols = max(1,col-winHalfWidth) : min(width,col+winHalfWidth);  

  14.         inRows = 1:height;  

  15.         inTile = img(inRows, inCols);  

  16.         localThresh = graythresh(inTile);  

  17.         localVar = std(inTile(:))^2;    %方差  

  18.         if localVar > localVarThresh  

  19.             imgBinLocal(:,col) = im2bw(img(:,col), localThresh);  

  20.         else  

  21.             imgBinLocal(:,col) = 1;  

  22.         end  

  23.     if nImage == 1  

  24.         pause  

  25.     end  

  26. end

    很悲催的发现,LOFTER好像写代码不方便,今天暂时粘别人的过来看看,明天再找一个写代码好的地方,GITHUB应该不错,以后代码直接贴链接了!!

    睡了,困死了~~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值