我正在尝试在文档图像上实现Otsu二值化技术,如下所示:
有人可以告诉我如何在MATLAB中实现代码吗?
答案 0 :(得分:7)
I = imread('cameraman.tif');
步骤1。计算每个强度等级的直方图和概率。</ p>
nbins = 256; % Number of bins
counts = imhist(I,nbins); % Each intensity increments the histogram from 0 to 255
p = counts / sum(counts); % Probabilities
第2步。设置初始omega_i(0)和mu_i(0)
omega1 = 0;
omega2 = 1;
mu1 = 0;
mu2 = mean(I(:));
第3步。逐步完成从0到最大强度(255)的所有可能阈值
步骤3.1 更新omega_i和mu_i
步骤3.2 计算sigma_b_squared
for t = 1:nbins
omega1(t) = sum(p(1:t));
omega2(t) = sum(p(t+1:end));
mu1(t) = sum(p(1:t).*(1:t)');
mu2(t) = sum(p(t+1:end).*(t+1:nbins)');
end
sigma_b_squared_wiki = omega1 .* omega2 .* (mu2-mu1).^2; % Eq. (14)
sigma_b_squared_otsu = (mu1(end) .* omega1-mu1) .^2 ./(omega1 .* (1-omega1)); % Eq. (18)
第4步所需阈值对应sigma_b_squared的最大位置
[~,thres_level_wiki] = max(sigma_b_squared_wiki);
[~,thres_level_otsu] = max(sigma_b_squared_otsu);
wiki-version eq之间存在一些差异。 (14)在大津和eq。 (18),我不知道为什么。但是thres_level_otsu
对应于MATLAB的实现graythresh(I)
答案 1 :(得分:1)
由于Matlab中的函数graythresh
实现了Otsu方法,您需要做的是将图像转换为灰度,然后使用im2bw
函数使用{返回的threhsold级别对图像进行二值化。 {1}}。
要将图片graythresh
转换为灰度,您可以使用以下代码:
I
要使用Otsu的方法获取二进制图像I = im2uint8(I);
if size(I,3) ~= 1
I = rgb2gray(I);
end;
,请使用以下代码:
Ib
您应该得到以下结果:
答案 2 :(得分:1)
从您的初始问题开始实施OTSU开始,确定MATLAB的graythresh
函数基于该方法
OTSU的方法将阈值视为两个峰之间的谷,这两个峰是前景像素之一,另一个是背景像素
与您的图像有关,这似乎是一个历史手稿,发现这个paper比较了可用于阈值文档图像的所有方法
您还可以从here
下载并阅读sauvola阈值祝其实施好运=)
答案 3 :(得分:1)
纠正了MATLAB实现(针对2d矩阵)
function [T] = myotsu(I,N);
% create histogram
nbins = N;
[x,h] = hist(I(:),nbins);
% calculate probabilities
p = x./sum(x);
% initialisation
om1 = 0;
om2 = 1;
mu1 = 0;
mu2 = mode(I(:));
for t = 1:nbins,
om1(t) = sum(p(1:t));
om2(t) = sum(p(t+1:nbins));
mu1(t) = sum(p(1:t).*[1:t]);
mu2(t) = sum(p(t+1:nbins).*[t+1:nbins]);
end
sigma = (mu1(nbins).*om1-mu1).^2./(om1.*(1-om1));
idx = find(sigma == max(sigma));
T = h(idx(1));