OpenCV 笔记(5):二值图像的基本概念

Part11.  相关的基本概念

初学者可能会对灰度图像和二值图像,以及图像灰度化和图像二值化这些词容易混淆。下面,对这些专业词汇分别做出详细的解释。

二值图像(Binary Image)是指在图像中,灰度等级只有两种,图像中的任何像素点的灰度值均为0或者255,分别代表黑色和白色。通常在二值图像中,用白色像素表示对象的前景,用黑色像素表示对象的背景。从而实现将感兴趣的目标和背景分离。

灰度图像(Grayscale Image),不仅仅只有黑色和白色,还有各种灰色,所以颜色信息更加丰富。灰度图像是单通道的,可以方便计算和处理,也可以用于得到图像的边缘信息、梯度信息,便于后续进一步分析和处理。

通常灰度图像的每个像素用 8 位来表示,则有 0-255 个灰度值共256(2的8次方)个。如果每个像素使用 16 位来表示,则有 65536个灰度值(2的16次方)。

边缘是图像的基本特征。边缘是图像性区域和另一个属性区域的交接处,是区域属性发生突变的地方,是图像中不确定性最大的地方,也是图像信息最集中的地方,图像的边缘包含着丰富的信息。

梯度是二维离散函数的求导。如果图像看成是一个二维离散函数,可以用梯度来衡量图像灰度的变化率。

彩色图像(Color Image)相比二值图像、灰度图像有更丰富的细节信息。彩色图像的每个像素,通常是由红(R)、绿(G)、蓝(B)三个通道来表示,每个通道的像素值介于[0,255]之间。

图像灰度化(Image grayscale),是将一幅彩色图像转换成灰度图像的过程。灰度化会让像素矩阵中每个像素点都满足:

R=G=B

图像灰度化之后矩阵维数下降,运算速度也会大幅度提高。同时,灰度图像也能反应光照强度,并且图像的梯度信息仍然保留。因此,我们会优先对彩色图像进行灰度化处理。

图像二值化(Image Binarization),又称图像阈值化,是图像分割的一种最简单的方法。二值化可以把灰度图像转换成二值图像。二值化的步骤是把大于某个临界灰度值的像素灰度设为灰度极大值(255),把小于这个值的像素灰度设为灰度极小值(0),从而实现二值化。二值图像在很多场景下是非常有用的,比如轮廓分析、轮廓匹配、轮廓特征提取、对象测量、形态学处理等等。

Part22. 灰度化和二值化

实现图像灰度化和图像二值化都有很多种方式。

12.1 灰度化的方法

常见的灰度化方法包括:

  • 最大值灰度处理:将红、绿、蓝三个颜色通道的最大值作为灰度值。

计算公式:

  • 浮点灰度处理:将红、绿、蓝三个颜色通道乘以不同的浮点数权重,其中 RGB 的权重总和为 1,得到一个灰度值。

计算公式:

  • 整数灰度处理:为了避免浮点数运算使用整数算法,其中 RGB 的权重总和为 100,得到一个灰度值。

计算公式:

  • 移位灰度处理:移位比整数灰度处理速度更快。

计算公式:

  • 平均灰度处理:将红、绿、蓝三个颜色通道的值相加再除以3,得到一个灰度值。

计算公式:

  • 加权平均灰度处理:按照各个通道的重要性将彩色图像的三通道分量进行加权平均,再把得到的加权平均值作为灰度图像的灰度值。

计算公式:

  • 单通道法:仅取绿色作为灰度值。

计算公式:

OpenCV 通过 cvtColor() 函数,可以将彩色图像转换成灰度图像。

int main(int argc,char *argv[])
{
    Mat src = imread(".../street.jpg");
    imshow("src",src);
    Mat gray;
    cvtColor(src,gray,COLOR_BGR2GRAY);
    imshow("gray",gray);

    waitKey(0);
    return 0;
}
4a6773bf9225b4d9968f6e746b45de54.jpeg
灰度化.png

cvtColor() 函数的作用是色彩空间的转换。常见的色彩空间包括:RGB、HSV、YCrCb 等等。OpenCV 提供了几百种颜色空间转换方法。在我们日常使用中,最为广泛使用的是 BGR↔ GRAY 和 BGR ↔ HSV。后续的文章,也会详细介绍色彩空间的转换。

22.2 二值化的方法

在 OpenCV 中,通过使用阈值分割的 threshold() 函数、彩色图像分割的 inRange() 函数以及边缘检测的 Canny() 函数等等都可以实现图像二值化。

先介绍一种最简单的图像二值化方法,按固定的阈值进行二值化。先把图像灰度化,然后对灰度图像中的每个像素进行遍历,根据它的像素值是否大于一个固定的阈值,对输出图像对应位置的像素赋予不同的值。具体的数学公式如下:

,

其中,x 表示灰度图像上像素点的取值, thresh 表示固定的阈值。Binary(x) 函数反应了灰度图像经过二值化后,输出图像对应像素点的取值。

下面的例子,先对原图进行灰度化,接着使用均值函数 mean() 来获取灰度图像的均值,然后使用该均值作为固定的阈值 t 。接着开始遍历灰度图像,当像素的灰度值大于 t 时,将其赋值为255。否则,赋值为 0。

int main(int argc,char *argv[])
{
    Mat src = imread(".../street.jpg");
    imshow("src",src);
    Mat dst;
    cvtColor(src,dst,COLOR_BGR2GRAY);
    Scalar m = mean(dst);
    int t = m[0];
    int height = src.rows;
    int width = src.cols;

    Mat result = Mat::zeros(height,width,CV_8UC1);

    for (int row = 0;row < height;row++) {
        for (int col = 0;col < width;col++) {
            int p = dst.at<uchar>(row,col);

            if (p>t) {
                result.at<uchar>(row,col) = 255;
            } else {
                result.at<uchar>(row,col) = 0;
            }
        }
    }

    imshow("result",result);
    waitKey(0);
    return 0;
}
0fe601864831e58a9cd546f6ac31bfa0.jpeg
二值化.png

当然,这种方法有很大的弊端,只能处理单一的图像,无法自动化地处理大量的图像。后续的文章会详细介绍使用 threshold() 函数来实现图像二值化。通过这个函数,OpenCV 提供了一系列经典的二值化相关的算法。

下面用一段例子先感受一下 threshold() 函数的使用:

int main(int argc,char *argv[])
{
    Mat src = imread(".../street.jpg");
    imshow("src",src);
    Mat gray;
    cvtColor(src,gray,COLOR_BGR2GRAY);
    Scalar m = mean(gray);
    int t = m[0];

    Mat thresh;
    threshold(gray, thresh,t,255, THRESH_BINARY);
    imshow("thresh1",thresh);

    double value= threshold(gray, thresh,0,255, THRESH_BINARY|THRESH_OTSU);
    imshow("thresh2",thresh);

    cout << "thresh1 = " << t <<", thresh2 = " << value <<endl;
    waitKey(0);
    return 0;
}

输出结果:

thresh1 = 115, thresh2 = 121
f71f8b0424be346f2fd0d8c3942ac145.jpeg
多种阈值分割.png

上述两种阈值分割从肉眼看上去,效果稍微有些不同。其实它们使用不同的阈值进行分割的,从输出结果上可以看到两者的阈值是不一样的。

其中,这里的

threshold(gray, thresh,t,255, THRESH_BINARY);

等价于上面使用固定阈值分割,并遍历灰度图像的例子。

Part33.  总结

这篇文章主要是介绍灰度图像和二值图像,以及图像灰度化和图像二值化的概念。并告诉我们如何实现图像灰度化和图像二值化。有关图像二值化的一些常见的算法,接下来会有专门的文章进行讲解。

灰度图像和二值图像是数字图像处理的基础,我们在处理图像时会用优先对图像做灰度化和二值化,然后再做下一步的工作。

Java与Android技术栈】公众号

关注 Java/Kotlin 服务端、桌面端 、Android 、机器学习、端侧智能

更多精彩内容请关注:

猜你喜欢

转载自blog.csdn.net/SLFq6OF5O7aH/article/details/134257601
今日推荐