opencv笔记(3):漫水填充法和图像金字塔

来源:互联网 发布:sketch up pro mac 编辑:程序博客网 时间:2024/05/01 22:27

三.漫水填充算法

漫水填充算法是一种用特定的颜色填充连通区域,通过设置可连通像素的上下限以及连通方式来达到不同的填充效果的算法。经常用来标记或分离图像的一部分以便对其进行进一步的处理或分析。也可以用来从输入图像获取掩码区域,掩码会加速处理过程,或只处理掩码指定的像素点。

int floodFill(InputOutputArray image,     InputOutputArray mask,     Point seedPoint,    Scalar newVal,    Rect* rect=0,     Scalar loDiff=Scalar(),     Scalar upDiff=Scalar(),     int flags=4 )  
参数1:输入图像。
参数2:操作掩模。它是一个单通道,8位,长和宽都比原图像大两个像素点的图像。mask图像的像素(x+1,y+1)与原图像的像素(x,y)相对应。
参数3:填充算法的起始点。
参数4:像素点被染色的值,即在重绘区域像素的新值。
参数5:用于设置函数将要重绘区域的最小边界矩形区域,默认值为0。
参数6:表示当前观察像素值与其部件领域像素值或者待加入该部件的种子像素之间的亮度或颜色之负差的最大值。
参数7:。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。之正差的最大值。
参数8:操作标识符。

Mat src = imread("1.jpg");   imshow("【原始图】",src);  Rect ccomp;  floodFill(src, Point(50,300), Scalar(155, 255,55), &ccomp, Scalar(20, 20, 20),Scalar(20, 20, 20));  imshow("【效果图】",src);  waitKey(0);  return 0; 

四.图像金字塔

图像金字塔是图像多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。
图像金字塔最初用于机器视觉和图像压缩,一副图像的金子塔是一系列以金子塔形状排列的分辨率逐渐降低,且来源于同一张图片的图像集合。通过梯次向上(下)采样获得,直到达到某种条件停止。其中最常用的有高斯金字塔和拉普拉斯金字塔。
高斯金字塔:用来向下采样。
拉普拉斯金字塔:用来从金字塔低层图像重建上层未采样图像,在数字图像处理中也就是预测残差,可以对图像进行最大程度的还原,配合高斯金字塔一起使用。
对图像向上采样:pyrUp。图像尺寸加倍。
对图像向下采样:pyrDown。图像尺寸减半,是一个会丢失信息的函数。

1.高斯金字塔

高斯金字塔是通过高斯平滑和亚采样获得一些下采样图像。

对图像进行向下采样,为了获取第i+1层的金字塔图像,(1)对图像进行高斯卷积(2)将所有的偶数行和列去除。图像变为原图的四分之一。
对图像进行向上采样,为了放大图像(1)将图像在每个方向扩大为原来的两倍,新增的行和列以0填充(2)使用先前同样的内核(乘以4)与放大后的图像卷积,获得新增像素的近似值。
void pyrDown(InputArray src,OutputArray dst,const Size& dstsize=Size(),int borderType=BORDER_DEFAULT)  
参数1:输入图像。
参数2:输出图像。
参数3:输出图像大小。
参数4:边界类型
int main( )  {      //载入原始图         Mat srcImage = imread("1.jpg");  //工程目录下应该有一张名为1.jpg的素材图      Mat tmpImage,dstImage;//临时变量和目标图的定义      tmpImage=srcImage;//将原始图赋给临时变量        //显示原始图        imshow("【原始图】", srcImage);        //进行向下取样操作      pyrDown( tmpImage, dstImage, Size( tmpImage.cols/2, tmpImage.rows/2 ) );      //显示效果图        imshow("【效果图】", dstImage);          waitKey(0);          return 0;    }

2.拉普拉斯金字塔

拉普拉斯金字塔第i层:

其中,Gi代表第i层的图像,UP()代表对图像进行向上采样,代表高斯卷积核。也可以写成如下:

所以,拉普拉斯金字塔可以看做是高斯金字塔的逆操作。
void pyrUp(InputArray src,OutputArraydst, const Size& dstsize=Size(),int borderType=BORDER_DEFAULT )  
参数1:输入图像。
参数2:输出图像。
参数3:输出图像大小。
参数4:边界类型。
int main( )  {      //载入原始图         Mat srcImage = imread("1.jpg");  //工程目录下应该有一张名为1.jpg的素材图      Mat tmpImage,dstImage;//临时变量和目标图的定义      tmpImage=srcImage;//将原始图赋给临时变量        //显示原始图        imshow("【原始图】", srcImage);        //进行向上取样操作      pyrUp( tmpImage, dstImage, Size( tmpImage.cols*2, tmpImage.rows*2 ) );      //显示效果图        imshow("【效果图】", dstImage);          waitKey(0);          return 0;    } 


3.图像的缩放

resize()函数用来调整图像的大小。
void resize(InputArray src,OutputArray dst, Size dsize, double fx=0,double fy=0, int interpolation=INTER_LINEAR )  
参数1:输入图像。
参数2:输出图像。
参数3:输出图像的大小。
参数4:水平方向的缩放系数,默认0。
参数5:垂直方向的缩放系数,默认0。
参数6:插值的方式,默认线性插值。最近邻插值(INTER_NEAREST)、线性插值(INTER_LINEAR,默认值)、区域插值(INTER_AREA,利用像素区域关系的重采样插值)、三次样条插值(INTER_CUBIC,超过4*4像素领域内的双三次插值)、Lanczos(INTER_LANCZOS4,超过8*8像素领域的插值)插值。
若要缩小图像,最好用INTER_AREA来插值。
若要放大图像,最好用INTER_CUBIC(效率不高)、INTER_LINEAR(效率高)。
int main( )  {      //载入原始图         Mat srcImage = imread("1.jpg");  //工程目录下应该有一张名为1.jpg的素材图      Mat tmpImage,dstImage1,dstImage2;//临时变量和目标图的定义      tmpImage=srcImage;//将原始图赋给临时变量        //显示原始图        imshow("【原始图】", srcImage);          //进行尺寸调整操作      resize(tmpImage,dstImage1,Size( tmpImage.cols/2, tmpImage.rows/2 ),(0,0),(0,0),3);      resize(tmpImage,dstImage2,Size( tmpImage.cols*2, tmpImage.rows*2 ),(0,0),(0,0),3);        //显示效果图        imshow("【效果图】之一", dstImage1);        imshow("【效果图】之二", dstImage2);          waitKey(0);        return 0;    }  

特别说明:本文为本人学习opencv所做笔记。具体参照:http://blog.csdn.net/column/details/opencv-tutorial.html

0 0