OpenCV第六讲: 漫水填充、图像金字塔
OpenCV第六讲: 漫水填充、图像金字塔
1. 漫水填充
对连续的像素区域进行处理。
-
是一种用特定的颜色填充连通区域,通过设置可联通像素的上下限以及连通方式来达到不同的填充效果的方法。
-
经常被用来标记或分离图像的一部分;
-
可以用来从输入图像中获取掩码区域,掩码会加速处理过程。
2. 源代码剖析
-
OpenCV函数实现 – floodFill
漫水填充操作的结果总是某个连续的区域,当邻近像素点位于给定的范围内,或者在指定点像素值范围内,函数都会为起涂上颜色。
/********************************************************************
* 漫水填充:
* int floodFill( InputOutputArray image,
* Point seedPoint, Scalar newVal, CV_OUT Rect* rect = 0,
* Scalar loDiff = Scalar(), Scalar upDiff = Scalar(),
* int flags = 4 );
*
* @param newVal; New value of the repainted domain pixels.
*
* @param loDiff; Maximal lower brightness/color difference between the currently observed pixel and
* one of its neighbors belonging to the component,
* or a seed pixel being added to the component.
* 最小色差
* @param upDiff; Maximal upper brightness/color difference between the currently observed pixel and
* one of its neighbors belonging to the component,
* or a seed pixel being added to the component.
* 最大色差
* *********************************************************************************/
Mat fillImage;
srcImage.copyTo(fillImage);
Rect tmp;
floodFill(fillImage, Point(50, 10), Scalar(155,255,255), &tmp, Scalar(5, 5, 5), Scalar(10, 10, 10));
imshow("floodFill", fillImage);
- 测试结果
3. 图像金字塔与图片尺寸缩放
-
resize函数 与pyrUp() pyrDown()函数
都是对图像进行放大和缩小。pyrUp() pyrDown()是对图像进行向上和向下采样。
resize --> OpenCV--imgproc--Image Filtering
pyrUp+pyrDown -->OpenCV--imgproc--Geometric Image Transformations
/********************************************************************
* resize():
* void resize( InputArray src, OutputArray dst,
* Size dsize, double fx = 0, double fy = 0,
* int interpolation = INTER_LINEAR );
*
* enum InterpolationFlags{
INTER_NEAREST = 0, // 最邻近插值
INTER_LINEAR = 1, // 线性插值 (放大图像)
INTER_CUBIC = 2, // 三次样条插值
INTER_AREA = 3, // 区域插值 (缩小图像)
INTER_LANCZOS4 = 4, // lanczos 插值
};
*******************************************************************/
4. 重读图像金子塔
图像金字塔是图像多尺度、多分辨
的一种表达方式,主要应用与图像分割。 一般一副图像的金字塔是一系列以金字塔形状排列
的,分辨率逐步降低
且来源于同一张原始图像的图像集合
。
金字塔的底部是待处理图像的高分辨率表示(原始图像),而顶部是分辨率降低的图像。简单的说,我们就是将一层一层分辨率降低的图像比喻成金字塔,金字塔越高,分辨率越低。
常用的两种图像金字塔
-
高斯金字塔
用来向下采样,即降低分辨率, 为主要的图像金字塔;
"对图像向下取样"
1> 对原图像进行高斯内核卷积;
2> 将所有偶数行和列去除;
结果:新的图像只有原图的1/4, 这样丢失了图像的部分信息,即缩小了图像;
"对图像向上取样"
1> 将图像在每个方向上扩大原来的两倍, 新增的行和列以`0填充`;
2> 使用先前同样的内核(乘以4)与放大后的图像卷积,获得“新增像素”的近似值;
结果:放大了图像,但与原图像相比会比较模糊,(丢失的数据无法补偿)。
`要想补偿数据,减少缺失的信息就需要用到拉普拉斯金字塔。`
-
拉普拉斯金字塔
用来向上复原,可以对图像进行最大程度的还原,配合高斯金字塔一起使用;
拉普拉斯金字塔的来源可表示为: 源图像 - 放大(缩小源图像) = 拉普拉斯结果
这里的向上和向下不是针对图像堆积而成的
外形金字塔
而言的,而是数学意义上的向下采样,向上采样(为了区别,这里我改了一种说法,变成向上复原), 表达的意思是一致的。
-
图像金字塔的一个重要应用 – 图像分割
先建立一个图像金字塔,然后对不同层的图像像素按照对应的关系建立起“父”与“子”关系;
快速初始分割可以现在金字塔高层的低分辨率图像上完成,然后逐层对分割加以优化。
-
pyrUp函数 – 向上采样 // pyrDown函数 – 向下采样
这里的向上、向下是数学意义上的向上、向下, 也可以说是针对图像的尺寸而言的,而不是
外形金字塔
。也就是说,这里的向下,就是分辨率降低,图像尺寸减小; 这里的向上,就是分辨率提高,图像尺寸增大
。 -
源代码剖析
/****************************************************************************************
* 图像金字塔:
* pyrUp(): 进行向上取样操作, 放大图像, 图像变模糊了;
* pyrDown(); 进行向下取样操作, 降低了图像分辨率, 缩小了图像, 图像一样变模糊了;
************************************************************************/