做网站策划书吧,云谷 网站建设,网站的文章参考文献怎么做,杭州网站建设那家好操作系统#xff1a;ubuntu22.04 OpenCV版本#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言#xff1a;C11
功能描述 ffloodFill函数是OpenCV库中用于图像处理的一个功能#xff0c;它用于填充与种子点颜色相近的连通区域。这个函数在很多场景下都非常有用#x… 操作系统ubuntu22.04 OpenCV版本OpenCV4.9 IDE:Visual Studio Code 编程语言C11
功能描述 ffloodFill函数是OpenCV库中用于图像处理的一个功能它用于填充与种子点颜色相近的连通区域。这个函数在很多场景下都非常有用比如图像分割、对象填充或改变图像中某个区域的颜色等。 连通性的判断基于邻近像素的颜色或亮度接近程度。如果像素位于(x,y)处被认为属于要重新上色的连通域需满足以下条件
对于灰度图像和浮动范围的情况 src ( x ′ , y ′ ) − loDiff ≤ src ( x , y ) ≤ src ( x ′ , y ′ ) upDiff \texttt{src} (x,y)- \texttt{loDiff} \leq \texttt{src} (x,y) \leq \texttt{src} (x,y) \texttt{upDiff} src(x′,y′)−loDiff≤src(x,y)≤src(x′,y′)upDiff对于灰度图像和固定范围的情况 src ( seedPoint . x , seedPoint . y ) − loDiff ≤ src ( x , y ) ≤ src ( seedPoint . x , seedPoint . y ) upDiff \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)- \texttt{loDiff} \leq \texttt{src} (x,y) \leq \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y) \texttt{upDiff} src(seedPoint.x,seedPoint.y)−loDiff≤src(x,y)≤src(seedPoint.x,seedPoint.y)upDiff对于彩色图像和浮动范围的情况 src ( x ′ , y ′ ) r − loDiff r ≤ src ( x , y ) r ≤ src ( x ′ , y ′ ) r upDiff r , \texttt{src} (x,y)_r- \texttt{loDiff} _r \leq \texttt{src} (x,y)_r \leq \texttt{src} (x,y)_r \texttt{upDiff} _r, src(x′,y′)r−loDiffr≤src(x,y)r≤src(x′,y′)rupDiffr, src ( x ′ , y ′ ) g − loDiff g ≤ src ( x , y ) g ≤ src ( x ′ , y ′ ) g upDiff g \texttt{src} (x,y)_g- \texttt{loDiff} _g \leq \texttt{src} (x,y)_g \leq \texttt{src} (x,y)_g \texttt{upDiff} _g src(x′,y′)g−loDiffg≤src(x,y)g≤src(x′,y′)gupDiffg 并且 src ( x ′ , y ′ ) b − loDiff b ≤ src ( x , y ) b ≤ src ( x ′ , y ′ ) b upDiff b \texttt{src} (x,y)_b- \texttt{loDiff} _b \leq \texttt{src} (x,y)_b \leq \texttt{src} (x,y)_b \texttt{upDiff} _b src(x′,y′)b−loDiffb≤src(x,y)b≤src(x′,y′)bupDiffb对于彩色图像和固定范围的情况 src ( seedPoint . x , seedPoint . y ) r − loDiff r ≤ src ( x , y ) r ≤ src ( seedPoint . x , seedPoint . y ) r upDiff r , \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_r- \texttt{loDiff} _r \leq \texttt{src} (x,y)_r \leq \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_r \texttt{upDiff} _r, src(seedPoint.x,seedPoint.y)r−loDiffr≤src(x,y)r≤src(seedPoint.x,seedPoint.y)rupDiffr, src ( seedPoint . x , seedPoint . y ) g − loDiff g ≤ src ( x , y ) g ≤ src ( seedPoint . x , seedPoint . y ) g upDiff g \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_g- \texttt{loDiff} _g \leq \texttt{src} (x,y)_g \leq \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_g \texttt{upDiff} _g src(seedPoint.x,seedPoint.y)g−loDiffg≤src(x,y)g≤src(seedPoint.x,seedPoint.y)gupDiffg 并且: src ( seedPoint . x , seedPoint . y ) b − loDiff b ≤ src ( x , y ) b ≤ src ( seedPoint . x , seedPoint . y ) b upDiff b \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_b- \texttt{loDiff} _b \leq \texttt{src} (x,y)_b \leq \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_b \texttt{upDiff} _b src(seedPoint.x,seedPoint.y)b−loDiffb≤src(x,y)b≤src(seedPoint.x,seedPoint.y)bupDiffb 其中 s r c ( x ′ , y ′ ) src(x,y) src(x′,y′)是已经被判定属于该连通组件的某个邻居像素的值。要被添加到连通组件中像素的颜色或亮度应该足够接近如果使用浮动范围它应该接近其一个已经属于连通组件的邻居的颜色或亮度。如果使用固定范围它应该接近种子点的颜色或亮度。
这些函数可用于以下操作
直接在原图上用指定的颜色标记一个连通组件。构建一个掩模然后提取轮廓。复制区域到另一个图像等等。
函数原型1 int cv::floodFill
(InputOutputArray image,InputOutputArray mask,Point seedPoint,Scalar newVal,Rect * rect 0,Scalar loDiff Scalar(),Scalar upDiff Scalar(),int flags 4
)
参数1
参数image输入/输出的1-或3-通道、8位或浮点图像。除非在函数的第二个变体中设置了FLOODFILL_MASK_ONLY标志否则该图像将被函数修改。详情请见下方说明。参数mask操作掩模应当是一个比图像宽2像素、高2像素的单通道8位图像。如果传递空的Mat对象它将被自动创建。由于这是一个输入和输出参数你必须负责初始化它。洪水填充不会跨越输入掩模中非零像素。例如边缘检测的输出可以用作掩模以在边缘处停止填充。输出时掩模中对应于图像中填充像素的像素将被设置为1或在flags中指定的值如下文所述。此外函数会在掩模的边界填充1以简化内部处理。因此可以在多次调用函数时使用同一掩模以确保填充的区域不会重叠。参数seedPoint填充的起始点。参数newVal重绘区域像素的新值。参数loDiff当前观察像素与其属于同一连通组件的邻居像素或加入连通组件的种子像素之间的最大下限亮度/颜色差异。参数upDiff当前观察像素与其属于同一连通组件的邻居像素或加入连通组件的种子像素之间的最大上限亮度/颜色差异。参数rect可选的输出参数由函数设置为重绘区域的最小边界矩形。参数flags操作标志。前8位包含连通性值。默认值4意味着仅考虑四个最近邻像素那些共享边缘的像素。连通性值8意味着将考虑八个最近邻像素那些共享角落的像素。接下来的8位8-16位包含一个1到255之间的值用于填充掩模默认值是1。例如4 | ( 255 8 )将考虑四个最近邻并用255填充掩模。以下附加选项占据更高位因此可以使用按位或|与连通性和掩模填充值进一步组合请参阅FloodFillFlags。
注释 由于掩模比填充的图像大图像中的像素(x,y)对应于掩模中的像素(x1,y1)。
另见
findContours查找轮廓的函数。
函数原型2 int cv::floodFill
(InputOutputArray image,Point seedPoint,Scalar newVal,Rect * rect 0,Scalar loDiff Scalar(),Scalar upDiff Scalar(),int flags 4
)
参数2
比原型1少了个mask参数其他参数都一样。
代码示例
include iostream
#include opencv2/opencv.hppint main()
{cv::Mat img cv::imread( /media/dingxin/data/study/OpenCV/sources/images/hawk.jpg );if ( img.empty() ){std::cout Could not read the image std::endl;return -1;}cv::Point seedPoint( 359, 578 ); // 假设种子点为(359, 578)cv::Scalar newVal( 255, 0, 0 ); // 新的颜色值为蓝色cv::Rect roi;int flags 8;// 进行填充cv::floodFill( img, seedPoint, newVal, roi, cv::Scalar( 1, 1, 1 ), cv::Scalar( 40, 40, 40 ), 8 );// 显示结果cv::imshow( Flood Fill Result, img );cv::waitKey();return 0;
}运行结果
原图 运算之后的图 蓝色部分就是填充的部分参数loDiff为Scalar(1, 1, 1)upDiff为Scalar(40, 40, 40)表示当前观测点的像素X与周围已被填充的像素点数值Y需满足X-Y10且Y-X1才被填充。