本实验主要基于OpenCV来测试各种阈值化后效果,主要验证最优阈值化、大津阈值化和自适应阈值化,并进行带通阈值化和半阈值化的测试,测试图片如下:

实用计算机视觉 -- 各种阈值化效果

灰度图片和RGB彩色图片的直方图效果分别如下左右所示:

实用计算机视觉 -- 各种阈值化效果实用计算机视觉 -- 各种阈值化效果

左图中第一个大尖峰为黑色铅笔和黑色物体的灰度分布,最后一个大尖峰为图中白色物体和硬币的灰度分布,图片背景有一个显著的由暗到明的渐变过程。

首先基于之前博文中实现的最优阈值进行测试,最优阈值为122,效果如下:

实用计算机视觉 -- 各种阈值化效果

原始图片中四个角落到图片中央的背景渐变效应导致背景不能很好的分隔开。

int thre_value = computeOptimalTh(gray_image, 0);

threshold(gray_image, bina_image, thre_value, 255, THRESH_BINARY);

接下来进行大津阈值化(Otsu Thresholding)的测试,大津阈值化的思想是让阈值T两侧的像素分布最小,或者是同一类间的方差最小化,不同类间的方差最大化。

threshold(gray_image, bina_image, thre_value, 255, THRESH_BINARY|THRESH_OTSU);

实用计算机视觉 -- 各种阈值化效果

在使用大津阈值作为参数的情况下,OpenCV中的threshold函数会忽略传入的阈值。

有时候仅用单一的阈值进行阈值化,往往效果不好,例如前面的最优阈值化和大津阈值化,这时候使用多重阈值进行操作能显著提高分割效果,这就是自适应阈值化的工作。

自适应阈值化的思想是,首先将图片分割成多个子图像块,对每个图像块计算一个单独的阈值,对每个像素基于最邻近的四个阈值后的插值进行阈值化。

int blockSize = 9;
adaptiveThreshold(gray_image, bina_image, 255,
ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, blockSize,0);

子图像块的大小会直接影响阈值化后效果,下面是blockSize取9的效果(blockSize必须为奇数):

实用计算机视觉 -- 各种阈值化效果

blockSize的大小分别取17,25的效果如下左右所示:

实用计算机视觉 -- 各种阈值化效果实用计算机视觉 -- 各种阈值化效果

接下来在前面得到的最优阈值122左右进行带通阈值化和半阈值化测试:

带通阈值化常用于进行图像中物体边界的大致确定,从字面上就知道要设置两个不同的高低阈值进行两次阈值操作,最后进行二值图像的与操作。

threshold(gray_image, bina_image1, thre_value-5, 255, THRESH_BINARY);
threshold(gray_image, bina_image2, thre_value + 5, 255, THRESH_BINARY_INV);
bitwise_and(bina_image1, bina_image2, bina_image);

阈值化后效果如下,阈值带宽分别为10和20:

实用计算机视觉 -- 各种阈值化效果

实用计算机视觉 -- 各种阈值化效果

半阈值是在阈值T左右进行原始图像的部分保持的一种阈值化操作。

threshold(gray_image, bina_image1, thre_value, 255, THRESH_BINARY);

bitwise_and(gray_image, bina_image1, bina_image2);

以最优阈值进行的半阈值化小姑如下:

实用计算机视觉 -- 各种阈值化效果

相关文章:

  • 2022-12-23
  • 2021-06-20
  • 2021-10-02
  • 2021-09-13
  • 2022-12-23
  • 2021-07-24
  • 2021-11-24
猜你喜欢
  • 2022-01-14
  • 2021-06-29
  • 2021-11-02
  • 2021-11-22
  • 2021-11-12
  • 2021-09-06
  • 2021-06-10
相关资源
相似解决方案