灰度阀值变换及二值化
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
当图像的像素点的灰度大于T 的时候,设置这个点为全黑,要不然为全白。这样可以只选择我们感兴趣的领域。
im2bw(I,level); %阈值法从灰度图、RGB 图创建二值图。level 为人工设定阈值(threshold value),范围为[0 ,1]
最大类间方差法(OTSU 算法)
最大类间方差法是由日本学者大津(Nobuyuki Otsu)于1979年提出的,是一种自适应的阈值确定的方法,又叫大律法,简称OTSU 。它是按图像的灰度特性,将图像分成背景和目标2部分。背景和目标之间的类间方差越大,说明构成图像的2部分的差别越大,当部分目标错分为背景或部分背景错分为目标都会导致2部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。
在Matlab 中, graythresh 函数使用最大类间方差法获得图像的阈值。
()T
x T x x f ≥<⎩⎨⎧=2550
(注意标点‘‘要换一下)
I = imread(‘beauty_yellowflowers.jpg’); thresh= graythresh(I);%自适应设置阀值bw1 = im2bw(I, thresh);
bw2 = im2bw(I, 130/255);%手工设置阀值subplot(1,3,1);imshow(I);title(‘original’)
subplot(1,3,2);imshow(bw1);title(‘autoset_thresh’);
subplot(1,3,3);imshow(bw2); title(‘thresh=130’);
最小分类错误全局二值化算法(kittlerMet 算法)
函数源代码:
function imagBW = kittlerMet(imag)
% KITTLERMET binarizes a gray scale image 'imag' into a binary image
% Input:
% imag: the gray scale image, with black foreground(0), and white
% background(255).
% Output:
% imagBW: the binary image of the gray scale image 'imag', with kittler's
% minimum error thresholding algorithm.
% Reference:
% J. Kittler and J. Illingworth. Minimum Error Thresholding. Pattern
% Recognition. 1986. 19(1):41-47
MAXD = 100000;
imag = imag(:,:,1);
[counts, x] = imhist(imag); % counts are the histogram. x is the intensity level. GradeI = length(x); % the resolusion of the intensity. i.e. 256 for uint8.
J_t = zeros(GradeI, 1); % criterion function
prob = counts ./ sum(counts); % Probability distribution
meanT = x' * prob; % Total mean level of the picture
% Initialization
w0 = prob(1); % Probability of the first class
miuK = 0; % First-order cumulative moments of the histogram up to the kth level. J_t(1) = MAXD;
n = GradeI-1;
for i = 1 : n
w0 = w0 + prob(i+1);
miuK = miuK + i * prob(i+1); % first-order cumulative moment
if (w0 < eps) || (w0 > 1-eps)
J_t(i+1) = MAXD; % T = i
else
miu1 = miuK / w0;
miu2 = (meanT-miuK) / (1-w0);
var1 = (((0 : i)'-miu1).^2)' * prob(1 : i+1);
var1 = var1 / w0; % variance
var2 = (((i+1 : n)'-miu2).^2)' * prob(i+2 : n+1);
var2 = var2 / (1-w0);
if var1 > eps && var2 > eps % in case of var1=0 or var2 =0
J_t(i+1) = 1+w0 * log(var1)+(1-w0) * log(var2)-2*w0*log(w0)-2*(1-w0)*log(1-w0);
else
J_t(i+1) = MAXD;
end
end
end
minJ = min(J_t);
index = find(J_t == minJ);
th = mean(index);
th = (th-1)/n
imagBW = im2bw(imag, th);
% figure, imshow(imagBW), title('kittler binary');
MATLAB程序:
I = imread('beauty_yellowflowers.jpg');
imagSW = kittlerMet(I);%Kittler 算法
bw1 = im2bw(I, 130/255);%手工设置阀值