📜  在 MATLAB 中使用 Otsu 方法对数字图像进行二值化

📅  最后修改于: 2022-05-13 01:54:27.048000             🧑  作者: Mango

在 MATLAB 中使用 Otsu 方法对数字图像进行二值化

二值化在数字图像处理中很重要,主要是在计算机视觉应用中。阈值化是一种有效的二值化技术。阈值技术的选择在二值化中至关重要。已经提出了各种阈值算法来定义最佳阈值。

二值化可用于识别文本和符号,例如文档处理。识别具有独特轮廓的对象,例如制造厂传送带上的组件,并确定对象的方向是二值化应用的一些其他示例。二值化通常涉及两个步骤,包括根据一些客观标准确定灰度阈值以及将每个像素分配给一类背景或前景。如果像素的强度大于确定的阈值,则它属于前景类,否则属于背景。二值化的主要问题是阈值技术的选择。

阈值算法可以分为不同的类别:

  • 基于直方图形状的方法
  • 基于聚类的方法
  • 基于熵的方法
  • 基于对象属性的方法
  • 空间方法和局部方法是基于每个像素的局部特征。

灰度图像:灰度图像是每个通道具有相同值的图像。灰度图像只有灰色阴影的颜色,灰色阴影不仅是黑色和白色。如果图像具有 8 位深度。它可以在深色和白色之间有 255 种灰度。有时灰度图像也称为黑白图像。

值图像:由于其特性,二值图像在许多图像处理应用程序中都很有用。通过将图像灰度级量化为两个值(通常为 0 和 1)来生成二值图像。二值图像只有两种色调。所有像素都具有深色或白色作为颜色。深阴影用 0 表示,白色阴影用 1 表示。图像矩阵仅由 0 和 1 组成。

Otsu 的方法: Otsu 的阈值技术是一种基于分类的方法,它搜索最小化类内方差的阈值,定义为两个类的方差的加权和。它是最流行的灰度图像二值化方法。 Otsu 的算法只是假设灰度图像由两种类型的像素组成。前景和背景像素。它将所有像素分成两个簇。它通过最大化集群间方差来最小化集群内变化。最后,它返回单个强度值,称为阈值。该阈值将两个像素簇分开。一个簇的所有像素都被分配强度值 0,第二个簇的像素被分配值 1。因此,它对灰度图像进行二值化。

脚步:

  • 阅读彩色图像。
  • 将其转换为灰度图像。
  • 应用 Otsu 的阈值函数。
  • 使用阈值将灰度图像转换为二值图像。
  • 显示二值图像。
  • 使用局部大津法对灰度图像进行二值化。
  • 显示图像。

使用的函数:

  • imread() 内置函数用于读取图像。
  • imtool( ) 内置函数用于显示图像。
  • rgb2gray( ) 内置函数用于将 RGB 图像转换为灰度。
  • graythresh( ) 内置函数用于查找 Otsu 的阈值。
  • im2bw( ) 内置函数用于将灰度转换为二值图像。
  • nlfilter( ) 内置函数用于在 [mn] 大小的不同块上迭代函数。

例子:

Matlab
% MATLAB code for
% OTSU binarisation
%read the colored image.
k=imread("apple.jpeg");
  
%display the image.
imtool(k,[]);
  
%convert into grayscale image.
k=rgb2gray(k);
  
%calculate threshold using Otsu's method.
level=graythresh(k);
  
%convert into binary image using level.
k1=imbinarize(k,level);
  
%display the binarized image.
imtool(k1);
  
%find the local thresholds for windows.
k2=nlfilter(k,[100 100], @ibimage);
  
%display the binary image.
imtool(k2);
  
%find the local thresholds for smaller window.
k3=nlfilter(k,[50 50], @ibimage);
  
%display the binary image.
imtool(k3);
  
%ibimage function.
%this function finds the
%threshold for patches of image.
function f=ibimage(k)
[x, y]=size(k);
level=graythresh(k);
bw=imbinarize(k,level);
x1=round(x/2);
y1=round(y/2);
f=bw(x1, y1);
end


输出:

图 1:使用 Global Otsu 的二值图像

图 2:使用 Local Otsu 的二值图像,窗口大小为 [100 100]

 图 3:使用具有窗口大小 [50 50] 的 Local Otsu 的二值图像

图 4:GeeksforGeeks 徽标的结果

  • 全局 otsu 方法并不总是好的。
  • 较小的窗口大小会导致低质量的二值图像。
  • 最佳窗口大小会产生高质量的二值图像。