OpenCV学习笔记(七) 图像金字塔 阈值 边界

转自: OpenCV 教程

使用 图像金字塔 进行缩放

图像金字塔是视觉运用中广泛采用的一项技术。一个图像金字塔是一系列图像的集合 - 所有图像来源于同一张原始图像 - 通过梯次向下采样获得,直到达到某个终止条件才停止采样。有两种类型的图像金字塔常常出现在文献和应用中:

  • 高斯金字塔(Gaussian pyramid): 用来向下采样
  • 拉普拉斯金字塔(Laplacian pyramid): 用来从金字塔低层图像重建上层未采样图像

高斯金字塔

高斯金字塔

每一层都按从下到上的次序编号, 层级 (i+1) (表示为 G_{i+1} ,尺寸小于层级 i (G_{i}))。

缩小图像的过程:获取层级为 (i+1) 的金字塔图像步骤为

  • 将 G_{i} 与高斯内核卷积:

\frac{1}{16} \begin{bmatrix} 1 & 4 & 6 & 4 & 1  \\ 4 & 16 & 24 & 16 & 4  \\ 6 & 24 & 36 & 24 & 6  \\ 4 & 16 & 24 & 16 & 4  \\ 1 & 4 & 6 & 4 & 1 \end{bmatrix}

  • 将所有偶数行和列去除。

结果图像只有原图的四分之一。

放大图像的过程:

  • 首先,将图像在每个方向扩大为原来的两倍,新增的行和列以0填充(0)
  • 使用先前同样的内核(乘以4)与放大后的图像卷积,获得 “新增像素” 的近似值。

这两个步骤(向下和向上采样) 分别通过OpenCV函数 pyrUp 和 pyrDown 实现。

pyrUp( tmp, dst, Size( tmp.cols*2, tmp.rows*2 );
  • tmp: 当前图像, 初始化为原图像 src 。
  • dst: 目的图像( 显示图像,为输入图像的两倍)
  • Size( tmp.cols*2, tmp.rows*2 ) : 目的图像大小, 既然我们是向上采样, pyrUp 期待一个两倍于输入图像( tmp )的大小。

基本阈值操作

阈值是最简单的图像分割的方法。这样的图像分割方法是基于图像中物体与背景之间的灰度差异,而且此分割属于像素级的分割。

分为五种阈值化类型:二进制阈值化、反二进制阈值化、截断阈值化、阈值化为0、反阈值化为0。(都比较简单,详细介绍见教程)

threshold( src_gray, dst, threshold_value, max_BINARY_value,threshold_type );
  • src_gray: 输入的灰度图像的地址。
  • dst: 输出图像的地址。
  • threshold_value: 进行阈值操作时阈值的大小。
  • max_BINARY_value: 设定的最大灰度值(该参数运用在二进制与反二进制阈值操作中)。
  • threshold_type: 阈值的类型。从上面提到的5种中选择出的结果。

添加边界

大多数用到卷积操作的OpenCV函数都是将给定图像拷贝到另一个轻微变大的图像中,然后自动填充图像边界,这样卷积操作就可以在边界像素安全执行了(填充边界在操作完成后会自动删除)。

copyMakeBorder( src, dst, top, bottom, left, right, borderType, value );
  • src: 原图像
  • dst: 目标图像
  • topbottomleftright: 各边界的宽度。e.g. top = (int) (0.05*src.rows);
  • borderType: 边界类型,此处可以选择常数边界或者复制边界。
  1. BORDER_CONSTANT: 使用常数填充边界
  2. BORDER_REPLICATE: 复制原图中最临近的行或者列。
  • value: 如果 borderType 类型是 BORDER_CONSTANT, 该值用来填充边界像素。

 

posted on 2014-03-02 21:34  eric.xing  阅读(711)  评论(0编辑  收藏  举报

导航