图像分割值OTSU方法介绍
2015-05-30 00:08
218 查看
图像分割方法今天暂时不深入讨论了,因为本人目前对于图像二值化和分割认为是一样的,可是很多图像处理任务中会将图像先二值化后再分割,没搞懂~~因此暂时从二值化开始讨论,首先讨论的是OTSU(最大类间方差方法):
假设输入图像为灰度图像(0-255),那么在图像二值化的目的就是对图像进行基于设定阈值的分割得到图像的前景(255)和背景(0),进而得到二值图像。实现过程是,首先统计灰度图像的分布直方图,得到各灰度值对应的像素统计值,随机设定一个阈值T,将图像分为“第一种”二值图像,随后基于该直方图分别计算前景和背景的比重、灰度均值、方差等三种数值,并通过计算比重和方差之和得到该阈值下的图像类间方差计算值,随后对图像基于其它阈值的类间方差计算(如果图像的灰度分布遍布256个灰度值,那么需要计算256次,依次类推),最终以类间方差最大的情况下的T为阈值对图像进行分割进而得到图像的OTSU分割结果。
clc; clear all;
img = im2double(imread(imageFiles{nImage}));
[height, width] = size(img);
globalThresh = graythresh(img);
imgBinGlobal = im2bw(img, globalThresh);
imhist(img);
histCounts = imhist(img);
h = plot(globalThresh*ones(1,100), linspace(0,max(histCounts)), 'r-');
imgBinLocal = imgBinGlobal;
winHalfWidth = 10;
localVarThresh = 0.002;
for col = 1:width
inCols = max(1,col-winHalfWidth) : min(width,col+winHalfWidth);
inRows = 1:height;
inTile = img(inRows, inCols);
localThresh = graythresh(inTile);
localVar = std(inTile(:))^2; %方差
if localVar > localVarThresh
imgBinLocal(:,col) = im2bw(img(:,col), localThresh);
else
imgBinLocal(:,col) = 1;
end
if nImage == 1
pause
end
end
很悲催的发现,LOFTER好像写代码不方便,今天暂时粘别人的过来看看,明天再找一个写代码好的地方,GITHUB应该不错,以后代码直接贴链接了!!
睡了,困死了~~
假设输入图像为灰度图像(0-255),那么在图像二值化的目的就是对图像进行基于设定阈值的分割得到图像的前景(255)和背景(0),进而得到二值图像。实现过程是,首先统计灰度图像的分布直方图,得到各灰度值对应的像素统计值,随机设定一个阈值T,将图像分为“第一种”二值图像,随后基于该直方图分别计算前景和背景的比重、灰度均值、方差等三种数值,并通过计算比重和方差之和得到该阈值下的图像类间方差计算值,随后对图像基于其它阈值的类间方差计算(如果图像的灰度分布遍布256个灰度值,那么需要计算256次,依次类推),最终以类间方差最大的情况下的T为阈值对图像进行分割进而得到图像的OTSU分割结果。
clc; clear all;
img = im2double(imread(imageFiles{nImage}));
[height, width] = size(img);
globalThresh = graythresh(img);
imgBinGlobal = im2bw(img, globalThresh);
imhist(img);
histCounts = imhist(img);
h = plot(globalThresh*ones(1,100), linspace(0,max(histCounts)), 'r-');
imgBinLocal = imgBinGlobal;
winHalfWidth = 10;
localVarThresh = 0.002;
for col = 1:width
inCols = max(1,col-winHalfWidth) : min(width,col+winHalfWidth);
inRows = 1:height;
inTile = img(inRows, inCols);
localThresh = graythresh(inTile);
localVar = std(inTile(:))^2; %方差
if localVar > localVarThresh
imgBinLocal(:,col) = im2bw(img(:,col), localThresh);
else
imgBinLocal(:,col) = 1;
end
if nImage == 1
pause
end
end
很悲催的发现,LOFTER好像写代码不方便,今天暂时粘别人的过来看看,明天再找一个写代码好的地方,GITHUB应该不错,以后代码直接贴链接了!!
睡了,困死了~~
相关文章推荐
- GSM Sniffing入门之软件篇:GSMTAP抓取与SMS(Short Message Service)
- 交换机洪泛处理
- 程序员练级手册
- Hough变换直线检测
- Oracle学习(5):多表查询
- 图像滤波(转载)
- [LeetCode] Contains Duplicate II 包含重复值之二
- nginx 与traffic server
- K-means算法理解
- 图像纹理特征研究
- 五子棋深入
- 1020. 月饼 (25):结构体排序
- BOW(Bag of Words)词袋模型理解
- 扩展欧几里得算法求方程特解
- leetcode刷题。总结,记录,备忘。168
- 博客处女作(2)
- GIt入门
- android soap协议与webservice
- 树莓派之远程操作预处理
- 博客处女作