函数解析:漫水填充

版权声明:本文为博主原创文章,转载请标明出处! https://blog.csdn.net/qq_27396861/article/details/86659036
漫水填充

有点类似于PhotoShop的魔术棒,就是基于漫水填充来实现的;
在opencv2.x中有两个漫水填充算法由floodFill函数实现:
第一个:

int floodFill( InputOutputArray image, Point seedPoint, Scalar newVal, Rect* rect = 0, \
            Scalar loDiff = Sacalar(), Scalar upDiff = Scalar(), int flags = 4 )

第二个:

int floodFill( InputOutputArray image, InputOutputArray mask, Point seedPoint, Scalar newVal, \
            Rect* rect = 0, Scalar loDiff = Scalar(), Scalar upDiff = Scalar(), int flags = 4 )

参数详解:
1) InputOutputArray 输入的图像;
2) InputOutputArray 类型的 mask ,这是第二个版本的floodFill独有的,表示操作掩模。注意漫水填充不会填充mask的非零像素区域;另外掩码模的大小比输入的image图像的大小要大,所以mask中与输入图像(x,y)像素点相对应的点的坐标为(x+1, y+1);
3) Point seedPoint,漫水填充算法的起始点;
4) Scalar类型的newVal,像素点被染色的值,即在重绘区域像素的新值;
5) Rect* 类型的rect,有默认值0,用于设置floodFill函数将要重绘区域的最小边界矩形区域;
6) Scalar类型的 loDiff,表示当前观察像素值与其部件邻域像素值或者待加入该部件的种子像素之间的亮度或者颜色之负差的最大值;
7) Scalar类型的 upDiff,表示当前观察像素值与其部件邻域像素值或者待加入部件的种子像素之间的亮度或者颜色之正差的最大值;
8) int类型的flags,操作标识符;低八位0-7位用于控制算法的连通性,4表示填充算法只考虑水平或者垂直方向的相邻点,8表示填充算法除了这些还考虑对角方向的相邻点;高八位16-23,有两种组合,FLOODFILL_FIXED_RANGE,这个就会考虑当前像素与种子像素之间的差,否则就当考虑当前像素与其相邻像素的差。也就是说这个范围是浮动的。FLOODFILL_MASK_ONLY,函数不会去填充改变原始图像(也就是相当于忽略第三个参数newVal),而是去填充掩模图像,只在第二个函数里有用;中间八位,用于指定填充掩码图像的值的。但如果flags中间八位的值为0,则掩码会用1来填充;

而所有的flags可以用or操作符连接起来,即" | "。例如,如果想用8邻域填充,并填充固定像素值范围,填充掩码而不是填充源图像,以及设填充为38,那么输入的参数是下面这样:

flags = 8 | FLOODFILL_MASK_ONLY | FLOODFILL_FIXED_RANGE | (38 << 8)

猜你喜欢

转载自blog.csdn.net/qq_27396861/article/details/86659036