漫水填充经常被用来标记或分离图像的一部分以便对其进行进一步处理或分析,也可以用来从输入图像获取掩码区域,掩码会加速处理过程,或只处理掩码指定的像素点,操作的结果总是某个连续的区域。
cvCopyImage
cvFloodFill
void cvFloodFill( IplImage* src, CvPoint seedPoint, //漫水法从点seedPoint开始实行算法
CvScalar newVal, //像素点被染色的值CvScalar loDiff = cvScalarAll(0), //下标记–被染色的相邻点减去
loDiffCvScalar upDiff = cvScalarAll(0), //上标记–被染色的相邻点加上
upDiffCvConnectedComp* comp = NULL, //如果comp不是NULL,那么该CvConnectedComp被设置为被填充区域的统计属性
int flags = 4, /*低八位可以被设置为4或者8,这个参数控制着填充算法的连通性,4表示在4个方向考虑连通性(上下左右),
*8表示在8个方向考虑连通性(加上4个对角线方向),高八位可以设置CV_FLOODFILL_FIXED_RANGE,或者
*CV_FLOODFILL_MASK_ONLY (如果设置只考虑填充MASK),flags的中间比特(8-15位)的值可以设置填充掩码的值
*flags = 8 | CV_FLOODFILL_MASK_ONLY | CV_FLOODFILL_FIXED_RANGE | (43<<8)*/
CvArr* mask = NULL
/*mask参数与其他有mask参数的使用方法一致,不同的是可以是作为该函数的输出值(指定应经被填充的区域)*如果mask非空,
那么它必须是一个单通道,8位,像素宽度和高度均比源图像大两个像素的图像*(这是为使内部运算简单快速),
cvFloodFill()不会覆盖mask中非0的区域*/
);
#include <highgui.h>
#include <cv.h>
int main(int argc, char** argv)
{
cvNamedWindow( "image" );
IplImage* src = cvLoadImage( argv[1] );
IplImage* img = cvCreateImage( cvGetSize(src), 8, 3 );
cvCopyImage( src, img );
cvFloodFill(
img,
cvPoint( 54, 82 ),
CV_RGB( 255, 255, 255 ),
cvScalar( 20, 30, 40, 0 ),
cvScalar( 20, 30, 40, 0 ),
NULL,
4,
NULL
);
cvShowImage( "image", img );
cvWaitKey(0);
cvReleaseImage( &src );
cvReleaseImage( &img );
cvDestroyAllWindows();
return 0;
}