OpenCV之复杂图像变换Miscellaneous Image Transformations(三)

1.adaptiveThreshold 将自适应阈值应用于数组。

C++: void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C)
C: void cvAdaptiveThreshold(const CvArr* src, CvArr* dst, double max_value, int adaptive_method=CV_ADAPTIVE_THRESH_MEAN_C, int threshold_type=CV_THRESH_BINARY, int block_size=3, double param1=5 )
Parameters:
  • src – 8位单通道图像
  • dst – 与src具有相同大小和相同类型的目标图像 .
  • maxValue –分配给满足条件的像素的非零值
  • adaptiveMethod – 要使用的自适应阈值算法, ADAPTIVE_THRESH_MEAN_C or  ADAPTIVE_THRESH_GAUSSIAN_C
  • thresholdType –阈值类型一定要是  THRESH_BINARY 或者  THRESH_BINARY_INV .
  • blockSize – 像素邻域的大小,用于计算像素的阈值: 3, 5, 7, 等等.
  • C – 从平均值或加权平均值中减去常数。 通常,它为正,但也可以为零或负。

 

 

2.cvtColor 将图像从一种色域转换为另一种色域

C++: void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 )
C: void cvCvtColor(const CvArr* src, CvArr* dst, int code)
  • Parameters:
  • src – 输入图像:8位无符号,16位无符号(CV_16UC ...)或单精度浮点。
  • dst – 输出与src具有相同大小和深度的图像。
  • code – 颜色空间转换代码。
  • dstCn – 目标图像中的频道数; 如果参数为0,则从src和code自动得出通道数。

 

常见的色域变换:RGB <--> GRAY ( CV_BGR2GRAY, CV_RGB2GRAY, CV_GRAY2BGR, CV_GRAY2RGB )

        RGB \leftrightarrow CIE XYZ.Rec 709 with D65 white point ( CV_BGR2XYZ, CV_RGB2XYZ, CV_XYZ2BGR, CV_XYZ2RGB )

        RGB \leftrightarrow YCrCb JPEG (or YCC) ( CV_BGR2YCrCb, CV_RGB2YCrCb, CV_YCrCb2BGR, CV_YCrCb2RGB )

        RGB \leftrightarrow HSV ( CV_BGR2HSV, CV_RGB2HSV, CV_HSV2BGR, CV_HSV2RGB )

        RGB \leftrightarrow HLS ( CV_BGR2HLS, CV_RGB2HLS, CV_HLS2BGR, CV_HLS2RGB ).

        RGB \leftrightarrow CIE L*a*b* ( CV_BGR2Lab, CV_RGB2Lab, CV_Lab2BGR, CV_Lab2RGB ).

        RGB \leftrightarrow CIE L*u*v* ( CV_BGR2Luv, CV_RGB2Luv, CV_Luv2BGR, CV_Luv2RGB ).
        Bayer \rightarrow RGB ( CV_BayerBG2BGR, CV_BayerGB2BGR, CV_BayerRG2BGR, CV_BayerGR2BGR, CV_BayerBG2RGB, CV_BayerGB2RGB,         CV_BayerRG2RGB,CV_BayerGR2RGB ).

3.distanceTransform. 计算源图像的每个像素到最接近的零像素的距离.

C++: void distanceTransform(InputArray src, OutputArray dst, int distanceType, int maskSize)
C++: void distanceTransform(InputArray src, OutputArray dst, OutputArray labels, int distanceType, int maskSize, int labelType=DIST_LABEL_CCOMP )
C: void cvDistTransform(const CvArr* src, CvArr* dst, int distance_type=CV_DIST_L2, int mask_size=3, const float* mask=NULL, CvArr* labels=NULL, int labelType=CV_DIST_LABEL_CCOMP )
Parameters:
  • src – 8位单通道源图像
  • dst – 输出具有计算出的距离的图像。它是一个与src大小相同的32位浮点单通道图像。
  • distanceType – 距离的类型。它可以是CV_DIST_L1,CV_DIST_L2或CV_DIST_C。
  • maskSize – 距离变换蒙版的大小。它可以是3、5或CV_DIST_MASK_PRECISE(仅第一个功能支持后一个选项)。在CV_DIST_L1或CV_DIST_C距离类型的情况下,该参数被强制为3,因为3×3的掩码得到的结果与5×5或更大的光圈相同。
  • labels – 可选的输出2D标签数组(离散Voronoi图)。它的类型为CV_32SC1,大小与src相同。
  • labelType – 要构建的标签数组的类型。如果labelType == DIST_LABEL_CCOMP,则将为src中的每个零连接分量(以及最接近所连接分量的所有非零像素)分配相同的标签。如果labelType == DIST_LABEL_PIXEL,则每个零像素(以及所有与其最接近的非零像素)都将获得自己的标签。

这个函数的具体用法可以参考例子opencv_source_code/samples/cpp/distrans.cpp

 

4.floodFill.用给定的颜色填充连接的组件

C++: int floodFill(InputOutputArray image, Point seedPoint, Scalar newVal, Rect* rect=0, Scalar loDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4 )
C++: int floodFill(InputOutputArray image, InputOutputArray mask, Point seedPoint, Scalar newVal, Rect* rect=0, Scalar loDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4 )
C: void cvFloodFill(CvArr* image, CvPoint seed_point, CvScalar new_val, CvScalar lo_diff=cvScalarAll(0), CvScalar up_diff=cvScalarAll(0), CvConnectedComp* comp=NULL, int flags=4, CvArr* mask=NULL )
Parameters:
  • image – 输入/输出1或3通道,8位或浮点图像。除非在函数的第二个变体中设置了FLOODFILL_MASK_ONLY标志,否则它将由函数进行修改
  • mask – 
  • seedPoint – 起点。
  • newVal – 重新绘制的域像素的新值。
  • loDiff –当前观察到的像素与属于该组件的相邻像素之一或添加到该组件的种子像素之间的最大较低亮度/色差。
  • upDiff – 当前观察到的像素与属于该组件的相邻像素之一或添加到该组件的种子像素之间的最大上亮度/色差。
  • rect – 函数设置为重绘域的最小边界矩形的可选输出参数。
  • flags – 操作标志。前8位包含连接性值。默认值4表示仅考虑四个最近的相邻像素(共享边缘的像素)。连通性值为8表示将考虑八个最近的相邻像素(共享一个角的像素)。接下来的8位(8-16)包含一个介于1和255之间的值,用于填充掩码(默认值为1)。例如,4 | (255 << 8)将考虑4个最近的邻居,并使用255的值填充掩码。以下附加选项占用较高的位,因此可以进一步使用按位或(|)与连接性和掩码填充值组合:

     

    • FLOODFILL_FIXED_RANGE - 如果设置,则考虑当前像素和种子像素之间的差异。否则,将考虑相邻像素之间的差异(即,范围是浮动的)。
    • FLOODFILL_MASK_ONLY - 如果设置,则该函数不会更改图像(将忽略newVal),而是仅使用标志的位8-16中指定的值填充掩码,如上所述。该选项仅在具有mask参数的功能变量中有意义。

 

参考实例:opencv_source_code/samples/cpp/ffilldemo.cpp

 

5.integral 计算图像的积分。

C++: void integral(InputArray src, OutputArray sum, int sdepth=-1 )
C++: void integral(InputArray src, OutputArray sum, OutputArray sqsum, int sdepth=-1 )
C++: void integral(InputArray src, OutputArray sum, OutputArray sqsum, OutputArray tilted, int sdepth=-1 )
Parameters:
  • image – 输入图像,格式为W×H,8位或浮点数(32f或64f)。
  • sum – 整数图像,格式为(W + 1)*(H + 1),32位整数或浮点数(32f或64f)。
  • sqsum – 平方像素值的积分图像; 它是(W + 1)*(H + 1),双精度浮点(64f)数组。
  • tilted – 旋转45度的图像的积分; 它是(W + 1)*(H + 1)数组,其数据类型与sum相同。
  • sdepth – 积分图像和倾斜的积分图像所需的深度CV_32S,CV_32F或CV_64F。

 

 

6.threshold 将固定级别阈值应用于每个数组元素。

C++: double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)
Parameters:
  • src – 输入数组(单通道,8位或32位浮点)。
  • dst – 与src具有相同大小和类型的输出数组。
  • thresh – 阈值。
  • maxval – 与THRESH_BINARY和THRESH_BINARY_INV阈值类型一起使用的最大值。
  • type – 阈值类型.

 

 

7.watershed 使用分界线算法执行基于标记的图像分割。

C++: void watershed(InputArray image, InputOutputArray markers)
C: void cvWatershed(const CvArr* image, CvArr* markers)
Parameters:
  • image – 输入8位3通道图像。
  • markers – 输入/输出的32位单通道图像(图)。 它的大小应与image相同。

 

应用实例:opencv_source_code/samples/cpp/watershed.cpp

 

8.grabCut  GrabCut图像分割算法。

C++: void grabCut(InputArray img, InputOutputArray mask, Rect rect, InputOutputArray bgdModel, InputOutputArray fgdModel, int iterCount, int mode=GC_EVAL )
Parameters:
  • img – 8位三通道图像
  • mask – 输入/输出8位单通道掩码。当模式设置为GC_INIT_WITH_RECT时,该掩码由函数初始化。其元素可能具有以下值之一:
    • GC_BGD定义了明显的背景像素。
    • GC_FGD定义了明显的前景(对象)像素。

    • GC_PR_BGD定义可能的背景像素。

    • GC_PR_FGD定义可能的前景像素。

  • rect – 包含分段对象的ROI。 ROI外部的像素被标记为“明显背景”。仅在mode == GC_INIT_WITH_RECT时使用该参数。
  • bgdModel – 背景模型的临时数组。处理同一图像时,请勿对其进行修改。
  • fgdModel – 前景模型的临时数组。处理同一图像时,请勿对其进行修改。
  • iterCount – 算法在返回结果之前应该进行的迭代次数。请注意,可以通过使用mode == GC_INIT_WITH_MASK或mode == GC_EVAL进行进一步调用来完善结果。
  • mode – 操作模式可能是以下之一:
    • GC_INIT_WITH_RECT该函数使用提供的矩形初始化状态和掩码。之后,它将运行算法的iterCount迭代。

    • GC_INIT_WITH_MASK该函数使用提供的掩码初始化状态。请注意,可以组合使用GC_INIT_WITH_RECT和GC_INIT_WITH_MASK。然后,使用GC_BGD自动初始化ROI之外的所有像素。
    • GC_EVAL该值表示该算法应重新开始。

 

应用实例:opencv_source_code/samples/cpp/grabcut.cpp

 

posted @ 2020-11-22 02:10  vkkkkkkkkkk  阅读(254)  评论(0编辑  收藏  举报