Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 实现文档褪色图像的Otsu二值化_Image Processing_Matlab - Fatal编程技术网

Image processing 实现文档褪色图像的Otsu二值化

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) 步骤

我试图在文档图像上实现大津二值化技术,如图所示:

有人能告诉我如何在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)

步骤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不支持将波浪符号作为伪值。我该如何更正?我能在语句中用零代替~吗?