
对一个数组进行自适应的阈值化处理。
C++: void adaptiveThreshold (InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C )
Python: cv2.adaptiveThreshold (src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) → dst
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 )
Python: cv.AdaptiveThreshold (src, dst, maxValue, adaptive_method=CV_ADAPTIVE_THRESH_MEAN_C, thresholdType=CV_THRESH_BINARY, blockSize=3, param1=5) → None
|
参数: |
|
这个函数会根据以下公式来将一张灰度图转换成单色图:
•. THRESH_BINARY
•. THRESH_BINARY_INV
其中T(x,y)是针对每个像素点单独计算的阈值。
•.对于ADAPTIVE_THRESH_MEAN_C 这个方法,阈值T(x,y)是这样计算的:将(x,y)周围相邻的blockSize x blockSize 像素点的平均值减去 C 。
•.对于ADAPTIVE_THRESH_GAUSSIAN_C 这个方法,阈值T(x,y)是这样计算的:将(x,y)周围相邻的blockSize x blockSize 像素点的加权和(一个高斯窗口中的十字型相关度(cross-correlation with a Gaussian window))减去 C 。针对指定的块大小( blockSize )使用默认的和值计算式(sigma)(标准差(standard deviation))。参考 getGaussianKernel() 。
这个函数可对图片进行原地处理。
参考
将一张图片从一个颜色空间转换到另一个颜色空间。
C++: void cvtColor (InputArray src, OutputArray dst, int code, int dstCn=0 )
Python: cv2.cvtColor (src, code[, dst[, dstCn]]) → dst
C: void cvCvtColor (const CvArr* src, CvArr* dst, int code )
Python: cv.CvtColor (src, dst, code) → None
|
参数: |
|
这个函数将一张输入图片从一个颜色空间转换到另一个颜色空间。当妳的转换中牵涉到RGB 颜色空间时,应该显式地指定各个通道的顺序(RGB还是BGR)。注意,人们通知认为OpenCV 中的默认颜色格式是RGB,而事实上却是BGR(字节顺序是相反的)。所以,在一张标准的(24位)彩色图片中,第一个字节是一个8位的蓝色分量,第二个字节是绿色分量,第三个字节是红色分量。第四、五、六个字节就对应着第二个像素(蓝、绿、红),如此下去。
R、G、B三个通道的习惯取值范围是:
•.对于CV_8U格式的图片,0到255
•.对于CV_16U 格式的图片,0到65535
•.对于CV_32F格式的图片,0到1
对于线性变换来说,取值范围是无需担心的。但是,对于非线性变换,如果输入的图片是RGB 格式的,那么,应当先将它一般化(normalized)到适当的取值范围,这样才能得到正确的结果,例如,对于RGB→ L*u*v*的变换就需要这样。例如,如果妳在不调整取值范围的情况下,将一个8位的图片转换到一个32位的浮点数图片,则,这个函数会假设它的取值范围是0..255,而不是0..1。所以,在调用 cvtColor 之前,妳需要先将图片中的值缩小:
img *= 1./255;
cvtColor(img, img, CV_BGR2Luv);
如果妳对8位的图片使用 cvtColor ,则,在转换过程中会丢失一些信息。对于狠多程序来说,这种丢 失情况是察觉不到的,但是,对于那些需要保留完整颜色范围或者只是变换了图片做了处理之后又变换回来的程序来说,建议使用32位的图片格式。
这个函数可做以下转换:
•.RGB ↔ GRAY ( CV_BGR2GRAY 、 CV_RGB2GRAY 、 CV_GRAY2BGR 、 CV_GRAY2RGB ) 在RGB颜色空间中做变换,例如添加/删除透明度通道,反转通道顺序,在当前颜色格式与16位RGB 颜色格式(R5:G6:B5或R5:G5:B5)之间转换,以及在当前颜色格式与灰度颜色格式之间转换:
和
使用以下代码可将一张RGB 图片转换成灰度格式:
cvtColor(src, bwsrc, CV_RGB2GRAY);
可使用 mixChannels() 来进行更高端的通道顺序调整操作。
•.RGB ↔ CIE XYZ。使用D65 作为白点的Rec 709( CV_BGR2XYZ、CV_RGB2XYZ、CV_XYZ2BGR、CV_XYZ2RGB ):
X、Y和Z覆盖了整个取值范围(对于浮点数格式的图片,Z可能会超过1)。
•.RGB ↔ YCrCb JPEG (或YCC) ( CV_BGR2YCrCb 、 CV_RGB2YCrCb 、 CV_YCrCb2BGR 、 CV_YCrCb2RGB )
其中
Y、Cr和Cb覆盖整个取值范围。
•.RGB ↔ HSV ( CV_BGR2HSV 、 CV_RGB2HSV 、 CV_HSV2BGR 、 CV_HSV2RGB )
对于8位和16位图片,R、G和B都被转换为浮点数格式,并且缩放至0到1的范围内。
如果H<0,则H ← H+360。输出结果中0 ≤ V ≤ 1,0 ≤ S ≤ 1 , 0 ≤ H ≤ 360 。
接下来,这些值会转换成目标数据类型:
•.8位图片
•.16位图片(目前不支持)
•.32位图片
H、S和V的值保留原样
•.RGB ↔ HLS ( CV_BGR2HLS 、 CV_RGB2HLS 、 CV_HLS2BGR 、 CV_HLS2RGB )。
对于8位和16位图片,R、G和B都被转换为浮点数格式,并且缩放至0到1的范围内。
如果H<0,则H ← H+360。输出结果中0 ≤L≤ 1,0 ≤ S ≤ 1 , 0 ≤ H ≤ 360 。
接下来,这些值会转换成目标数据类型:
•.8位图片
L ← 255∙L,S ← 255∙S,H ← H/2 (以适应0到255的范围) ( ☯:原文是“V ← 255∙ V ,S ← 255∙S,H ← H/2 ( to fit to 0 to 255) ” )
•.16位图片(目前不支持)
L←65535 ∙ L,S←65535∙S,H←H ( ☯:原文是“V ←65535 ∙ V ,S←65535∙S,H←H ” )
•.32位图片
H、S、L的值保留原样( ☯:原文是“H,S,V are left as is” )
•.RGB ↔ CIE L*a*b* ( CV_BGR2Lab 、 CV_RGB2Lab 、 CV_Lab2BGR 、 CV_Lab2RGB )。
对于8位和16位图片,R、G和B都被转换为浮点数格式,并且缩放至0到1的范围内。
其中
输出结果中0 ≤ L ≤ 100,-127 ≤ a ≤ 127,-127 ≤ b ≤ 127。接下来,这些值会转换成目标数据类型:
•.8位图片
•.16位图片
(目前不支持)
•.32位图片
L、a和b的值保留原样
•.RGB ↔ CIE L*u*v* ( CV_BGR2Luv 、 CV_RGB2Luv 、 CV_Luv2BGR 、 CV_Luv2RGB )。
对于8位和16位图片,R、G和B都被转换为浮点数格式,并且缩放至0到1的范围内。
输出结果中0 ≤ L ≤ 100,-134 ≤ u ≤ 220,-140 ≤ v ≤ 122。
接下来,这些值会转换成目标数据类型:
•.8位图片
•.16位图片
(目前不支持)
•.32位图片
L、u和v的值原样保留
以上这些在RGB 颜色空间和其它颜色空间之间转换的公式是从网上找到的,主要是Charles Poynton这个网站 http://www.poynton.com/ColorFAQ.html
•.Bayer → RGB ( CV_BayerBG2BGR 、 CV_BayerGB2BGR 、 CV_BayerRG2BGR 、 CV_BayerGR2BGR 、 CV_BayerBG2RGB 、 CV_BayerGB2RGB 、 CV_BayerRG2RGB 、 CV_BayerGR2RGB )。Bayer模式在CCD和CMOS摄像头中被广泛使用。它允许妳从单个颜色平面中获取到彩色图片,在这个平面中R、G和B像素(特定颜色分量的传感器)是交错排列在一起的:
对于单个像素,输出的RGB 分量是按照周围具有相同颜色的1、2或4个相邻像素的值来插值计算出来的。对于以上模式,还有多种变种,其实现手段就是将整个模式向左和/或向上移动一个像素。在转换类型常量 CV_BayerC 1 C 2 2BGR 和 CV_BayerC 1 C 2 2RGB 中的那两个字母C 1 和C 2 ,就是表示这种特殊模式的。它们对应于第二行中第二、三列的两个分量。例如,上图中的模式就对应于非常流行的“BG”类型。
计算源图片中每个像素点到最近的0像素点之间的距离。
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 )
Python: cv2.distanceTransform (src, distanceType, maskSize[, dst]) → dst
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 )
Python: cv.DistTransform (src, dst, distance_type=CV_DIST_L2, mask_size=3, mask=None, labels=None) → None
|
参数: |
|
distanceTransform函数计算每个单色像素到最近的0像素之间的大致或精确距离。对于0像素,其距离显然是0.
如果maskSize == CV_DIST_MASK_PRECISE并且distanceType == CV_DIST_L2 ,则,这个函数会使用 [Felzenszwalb04] 中说明的算法。这个算法会利用TBB 库来进行并行计算。
其它情况下,会使用 [Borgefors86] 这个算法。就是说,对于每个像素,这个函数会找到由以下基本位移组成的指向最近0像素的最短路径:水平、竖直、对角线或象棋中的马步(最后一种对于5x5的掩膜有效)。整个距离是按照这些基本位移的和来计算的。由于距离函数应当是对称的,所以,所有的水平和竖直位移都必须具有相同的开销(标记为 a ),所有的对角线位移必须具有相同的开销(标记为 b ),所有的马步位移必须具有相同的开销(标记为 c )。对于 CV_DIST_C 和 CV_DIST_L1 类型,计算出的距离是精确的,而对于 CV_DIST_L2类型(欧几里德距离),所计算出来的距离会有相对的偏差(5x5的掩膜会给出更精确的结果)。对于 a 、 ``b``和c ,OpenCV使用的是原论文中建议的值:
|
CV_DIST_C |
(3x3) |
a = 1, b = 1 |
|
CV_DIST_L1 |
(3x3) |
a = 1, b = 2 |
|
CV_DIST_L2 |
(3x3) |
a=0.955, b=1.3693 |
|
CV_DIST_L2 |
(5x5) |
a=1, b=1.4, c=2.1969 |
一般情况下,要快速地计算出大致的 CV_DIST_L2 距离,会使用一个3x3掩膜。要想计算出一个更精确的 CV_DIST_L2 距离,会使用一个5x5掩膜或精确算法。注意,精确算法和近似算法的复杂度都是与像素点相关的线性复杂度。
此函数的第二个变种,不仅仅计算每个像素(x,y)的最小距离,还会标识出由0像素组成的最近的连通区域( labelType==DIST_LABEL_CCOMP )或最近的0像素( labelType==DIST_LABEL_PIXEL )。对应连通区域/像素的索引存储在labels(x,y)。当 labelType==DIST_LABEL_CCOMP时,这个函数自动地寻找输入图片中由0像素组成的连通区域,并且使用唯一的标签来标记它们。当 labelType==DIST_LABEL_CCOMP 时,这个函数扫描整张输入图片,并且将所有的0像素都标记为唯一的标签。
在这种模式下,复杂度仍然是线性的。也就是说,这个函数会以一种非常快的方法来计算一张单色图片的Voronoi 图。目前,第二个变种只能使用近似距离变换算法,也就是说,目前不支持maskSize=CV_DIST_MASK_PRECISE。
注意
•.在此处可找到一个使用距离变换的示例 opencv_source_code/samples/cpp/distrans.cpp
使用指定颜色来填充一个连通区域。
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 )
Python: cv2.floodFill (image, mask, seedPoint, newVal[, loDiff[, upDiff[, flags]]]) → retval, rect
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 )
Python: cv.FloodFill (image, seed_point, new_val, lo_diff=(0, 0, 0, 0), up_diff=(0, 0, 0, 0), flags=4, mask=None) → comp
|
参数: |
|
floodFill使用指定的颜色对从种子像素点开始的连通区域进行填充。连通性是使用相邻像素之间的颜色/亮度差来确定的。如果满足以下条件,则认为( x,y )处的像素属于连通区域:
•.
对于灰色图及漂移范围
•.
对于灰色图及固定范围
•.
对于彩色图片及漂移范围
并且
•.
对于彩色图片及固定范围
并且
其中,src(x',y')指的是当前像素的相邻像素中某个已知属于该连通区域的像素的值。也就是说,要想被加入到该连通区域中的话,当前像素的颜色/亮度应当足够接近:
•.对于漂移范围的情况,它的相邻像素中某个已知属于该连通区域的像素的颜色/亮度。
•.对于固定范围的情况,种子像素点的颜色/亮度。
使用这些函数可以做到:就地使用指定颜色将连通区域标记出来;或者,构建出一个掩膜,再提取出轮廓;或者,将该区域复制到另一张图片中;等等。
参考
注意
•.可在此处找到一个使用FloodFill技术的示例 opencv_source_code/samples/cpp/ffilldemo.cpp
计算一张图片的积分。
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 )
Python: cv2.integral (src[, sum[, sdepth]]) → sum
Python: cv2.integral2 (src[, sum[, sqsum[, sdepth]]]) → sum, sqsum
Python: cv2.integral3 (src[, sum[, sqsum[, tilted[, sdepth]]]]) → sum, sqsum, tilted
C: void cvIntegral (const CvArr* image, CvArr* sum, CvArr* sqsum=NULL, CvArr* tilted_sum=NULL )
Python: cv.Integral (image, sum, sqsum=None, tiltedSum=None) → None
|
参数: |
|
这个函数,按照以下公式来计算源图片的一张或多张积分图片:
使用这些积分图片,妳就可以在常数时间内计算当前图片中一个特定的右上矩形(up-right)或旋转后矩形区域的和、平均值及标准差,例如:
举个例子,这使得妳可以快速地以可变窗口大小做模糊操作,或者做块相关性(block correlation)计算。对于多通道的图片,每个通道的和都是单独累积的。
举个实际的例子,以下图片展示的是,计算一个正方向(straight)的矩形 Rect(3,3,3,2) 和一个倾斜的矩形 Rect(5,1,2,3) 的积分的情况。原始图片 image 中选中的像素被显示出来了,积分图片 sum 和 tilted 中相关的像素也被显示出来了。
对每个数组元素应用一个固定级别的阈值化操作。
C++: double threshold (InputArray src, OutputArray dst, double thresh, double maxval, int type )
Python: cv2.threshold (src, thresh, maxval, type[, dst]) → retval, dst
C: double cvThreshold (const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type )
Python: cv.Threshold (src, dst, threshold, maxValue, thresholdType) → None
|
参数: |
|
这个函数对一个单通道的数组应用一个固定级别的阈值化操作。这个函数一般用于从一张灰度图片中转换出一张单色图片( compare() 也可用于这个目的),或者用于去除噪声,也就是说,过滤掉那些值太小或太大的像素。这个函数支持多种阈值化操作。它们由 type 参数来决定:
•. THRESH_BINARY
•. THRESH_BINARY_INV
•. THRESH_TRUNC
•. THRESH_TOZERO
•. THRESH_TOZERO_INV
另外,有个特殊值 THRESH_OTSU ,可与以上任一个值组合使用。在这种情况下,这个函数会使用 Otsu’s 的算法来确定一个最佳的阈值,而不是使用调用代码中指定的 thresh 。这个函数会返回计算出来的阈值。目前,Otsu的方法只对8位图片有效。
参考
adaptiveThreshold() 、 findContours() 、 compare() 、 min() 、 max()
使用分水岭算法来进行一次基于标记的图片分段计算。
C++: void watershed (InputArray image, InputOutputArray markers )
C: void cvWatershed (const CvArr* image, CvArr* markers )
Python: cv2.watershed (image, markers) → None
|
参数: |
|
这个函数实现了分水岭算法中的一个变种,不带参数的基于标记的分段算法,详细说明见[Meyer92]。
在将图片传递给这个函数做处理之前,妳需要在图片markers 中使用正数(>0)的索引值来大概地圈出目标区域。可以,每个区域都使用一个或多个连通区域来表示,它们的像素值分别为1、2、3等等。这些标记可使用 findContours() 和 drawContours() 从单色掩膜中提取出来(参考 watershed.cpp 示例)。这些标记是未来计算出的图片区域的“种子”。 markers 中的所有其它的像素,它们与大致圈出的区域的关系是未知的,并且将会由这个算法来计算,所以,它们的值应当设置为0.在这个函数的输出图片中,每个像素的值,或者是设置为某个“种子”区域的值,或者是设置为-1,表示它处于两个区域之间的边界上。
可在OpenCV 示例目录中找到一个对此函数的可视化演示示例(参考watershed.cpp示例)。
注意
两个相邻的连通区域不一定会被一个分水岭边界(-1的像素点)分割开;比如说,它们可能在一开始传递给函数的标记图片中就已经是相连接的了。
参考
注意
•.可在此处找到分水岭算法的使用示例 opencv_source_code/samples/cpp/watershed.cpp
运行GrabCut 算法。
C++: void grabCut (InputArray img, InputOutputArray mask, Rect rect, InputOutputArray bgdModel, InputOutputArray fgdModel, int iterCount, int mode=GC_EVAL )
Python: cv2.grabCut (img, mask, rect, bgdModel, fgdModel, iterCount[, mode]) → None
|
参数: |
|
这个函数实现了GrabCut图片分段算法。参考grabcut.cpp 示例,以学会如何使用它。
注意
•.在此处可找到一个使用GrabCut算法的示例 opencv_source_code/samples/cpp/grabcut.cpp
英拉
HxLauncher: Launch Android applications by voice commands