图像分割方法今天暂时不深入讨论了,因为本人目前对于图像二值化和分割认为是一样的,可是很多图像处理任务中会将图像先二值化后再分割,没搞懂~~因此暂时从二值化开始讨论,首先讨论的是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应该不错,以后代码直接贴链接了!!
睡了,困死了~~