Image processing 实现文档褪色图像的Otsu二值化
我试图在文档图像上实现大津二值化技术,如图所示: 有人能告诉我如何在MATLAB中实现这些代码吗?摘自 第1步。计算每个强度等级的直方图和概率Image processing 实现文档褪色图像的Otsu二值化,image-processing,matlab,Image Processing,Matlab,我试图在文档图像上实现大津二值化技术,如图所示: 有人能告诉我如何在MATLAB中实现这些代码吗?摘自 第1步。计算每个强度等级的直方图和概率 nbins = 256; % Number of bins counts = imhist(I,nbins); % Each intensity increments the histogram from 0 to 255 p = counts / sum(counts); % Probabilities 步骤2。设置初始ωi(0)和μi(0) 步骤
nbins = 256; % Number of bins
counts = imhist(I,nbins); % Each intensity increments the histogram from 0 to 255
p = counts / sum(counts); % Probabilities
步骤2。设置初始ωi(0)和μi(0)
步骤3。逐步通过从0到最大强度(255)的所有可能阈值
步骤3.1更新omega_i和mu_i
步骤3.2计算sigma_b_平方
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)
[~,thres_level_wiki] = max(sigma_b_squared_wiki);
[~,thres_level_otsu] = max(sigma_b_squared_otsu);
步骤4所需阈值对应于最大sigma_b_平方的位置
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)
[~,thres_level_wiki] = max(sigma_b_squared_wiki);
[~,thres_level_otsu] = max(sigma_b_squared_otsu);
大津大学的维基版本等式(14)和等式(18)之间存在一些差异,我不知道为什么。但是
thres\u level\u otsu
对应于MATLAB的实现graysthresh(I)
,因为MATLAB中的函数graysthresh
实现了otsu方法,您需要做的是将图像转换为灰度,然后使用im2bw
函数使用graysthresh
返回的threhshell级别对图像进行二值化
要将图像I
转换为灰度,可以使用以下代码:
I = im2uint8(I);
if size(I,3) ~= 1
I = rgb2gray(I);
end;
Ib = im2bw(I, graythresh(I));
要使用大津方法获得二进制图像Ib
,请使用以下代码:
I = im2uint8(I);
if size(I,3) ~= 1
I = rgb2gray(I);
end;
Ib = im2bw(I, graythresh(I));
您应该得到以下结果:
从您最初的问题是如何实现OTSU thresolding MATLAB的
GraySthresh
函数基于该方法开始
大津的方法将阈值视为两个峰值之间的谷,这两个峰值是前景像素和背景像素中的一个
关于你的图像,它看起来像是一本历史手稿,它比较了所有可用于阈值化文档图像的方法
您还可以从下载和阅读sauvola阈值
祝您实现好运=)更正了MATLAB实现(适用于2d矩阵)
默认情况下,它存在于Matlab中,请参见图像处理工具箱中的函数“计算大津的阈值”。虽然大津是最好的阈值技术之一,但在像您这样的情况下,应用自适应阈值可能更为谨慎。阅读并获得一些基本的参考资料,并在文章中提问。谢谢,真的很有帮助!你能告诉我如何实现sauvola阈值算法吗?我不知道如何动态地选择其中的k和R的值。再次感谢。不客气。我不熟悉sauvola阈值,但是如果你不想帮忙,你应该用这个问题开始一个新的话题。小提示:如果你想更多地关注你的线程,请提供潜在答案的相关来源。我在以下语句中得到一个错误:[~,thres\u level\u wiki]=max(sigma\u b\u squared\u wiki);[~,thres\u level\u otsu]=最大值(sigma\u b\u squared\u otsu);saying语句是不平衡的。请您帮忙好吗?当开始括号的数量和结束括号的数量不匹配时,就会出现不平衡错误,但事实并非如此。可能是旧版本的MATLAB不支持将波浪符号作为伪值。我该如何更正?我能在语句中用零代替~吗?