一、cvThreshold
作用:函数 cvThreshold 对单通道数组应用固定阈值操作。该函数的典型应用是对灰度图像进行阈值操作得到二值图像。(cvCmpS 也可以达到此目的) 或者是去掉噪声,例如过滤很小或很大象素值的图像点。本函数支持的对图像取阈值的方法由 threshold_type 确定。
形式:
void cvThreshold( const CvArr* src, CvArr* dst, doublethreshold, double max_value,
int threshold_type );
参数说明:
src:原始数组 (单通道 , 8-bit of 32-bit 浮点数)。dst:输出数组,必须与 src 的类型一致,或者为 8-bit。
threshold:阈值
max_value:使用 CV_THRESH_BINARY 和CV_THRESH_BINARY_INV 的最大值。
threshold_type:阈值类型 threshold_type=CV_THRESH_BINARY:
如果 src(x,y)>threshold ,dst(x,y) = max_value; 否则,dst(x,y)=0;
threshold_type=CV_THRESH_BINARY_INV:
如果 src(x,y)>threshold,dst(x,y) = 0; 否则,dst(x,y) = max_value.
threshold_type=CV_THRESH_TRUNC:
如果 src(x,y)>threshold,dst(x,y) =threshold; 否则dst(x,y) = src(x,y).
threshold_type=CV_THRESH_TOZERO:
如果src(x,y)>threshold,dst(x,y) =src(x,y) ; 否则 dst(x,y) = 0。
threshold_type=CV_THRESH_TOZERO_INV:
如果 src(x,y)>threshold,dst(x,y) = 0 ; 否则dst(x,y) = src(x,y)。
二、cvAdaptiveThreshold
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 );
自适应阈值在每个像素点的值都不同。通过计算像素点周围的bxb区域的加权平均,然后减去一个常数来得到自适应阈值,b由block_size指定,常数由param1指定。关键是里面的block_size参数,该参数是决定局部阈值的block的大小,当block很小时,如block_size=3 or 5 or 7时,“自适应”的程度很高,即容易出现block里面的像素值都差不多,这样便无法二值化,而只能在边缘等梯度大的地方实现二值化,结果显得它是边缘提取函数。当把block_size设为比较大的值时,如block_size=21 or 31 or 41时, cvAdaptiveThreshold便是二值化函数啦~
CV_ADAPTIVE_THRESH_MEAN_C:对区域的所有像素的平均加权;
CV_ADAPTIVE_THRESH_GAUSSIAN_C:根据高斯函数按照他们离中心点的距离进行加权平均。
三、cvCvtColor
是Opencv里的颜色空间转换函数,可以实现RGB颜色向HSV,HSI等颜色空间的转换,也可以转换为灰度图像。参数CV_BGR2GRAY是RGB到gray,参数 CV_GRAY2BGR是gray到RGB.处理结果是彩色的,则转灰色就是了:
void cvCvtColor( const CvArr* src, CvArr* dst, int code );
src:输入的 8-bit,16-bit或 32-bit单倍精度浮点数影像。
dst:输出的8-bit, 16-bit或 32-bit单倍精度浮点数影像。
code:色彩空间转换的模式,该code来实现不同类型的颜色空间转换。比如CV_BGR2GRAY表示转换为灰度图,CV_BGR2HSV将图片从RGB空间转换为HSV空间。其中当code选用CV_BGR2GRAY时,dst需要是单通道图片。当code选用CV_BGR2HSV时,对于8位图,需要将RGB值归一化到0-1之间。这样得到HSV图中的H范围才是0-360,S和V的范围是0-1。
函数使用范例,这里给出将RGB图像转换为灰度和HSV的例子:
IplImage *src = cvLoadImage("4085_1.jpg",1);//原图
IplImage *dst_gray = cvCreateImage(cvGetSize(src),src->depth,1);//灰度图
IplImage *dst_image = cvCreateImage(cvGetSize(src),32,src->nChannels);
IplImage *src_image_32 = cvCreateImage(cvGetSize(src),32,src->nChannels);
//这两个图需要是32浮点位的,因为对原图进行归一化后得到的是浮点数
cvCvtColor(src,dst_gray,CV_BGR2GRAY);//得到灰度图
cvConvertScale(src,src_image_32,1.0/255.0,0);//将原图RGB归一化到0-1之间
cvCvtColor(src_image_32,dst_image,CV_BGR2HSV);//得到HSV图
四、cvCanny
开放计算机视觉(OpenCV)库库函数之一,用于对图像的边缘检测(采用canny算法)。
void cvCanny( const CvArr* image,CvArr* edges,double threshold1,double threshold2, int aperture_size=3 );
参数说明:
image 输入图像(可以是彩色图像)
edges 输出的边缘图像 ,也是单通道的,但是是黑白的
threshold1 第一个阈值
threshold2 第二个阈值
aperture_size Sobel 算子内核大小
函数 cvCanny 采用 Canny 算法发现输入图像的边缘而且在输出图像中标识这些边缘。threshold1和threshold2 当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。需要注意的是canny需要输入的是灰度图像,所以我们在使用canny之前要使用cvCvtColor将之转换为灰度图像。canny算子得实质:如果一个像素的梯度大与上限值,则被认为是边缘像素,如果小于下限阈值,则被抛弃,那么如果该店的梯度位于两者之间呢?则当其与高于上限值的像素点连接时我们才保留,否则删除。
五、cvHoughLines2
说明:此函数是opencv图像变换函数中的一个,主要用来访问霍夫变换的两个算法———标准霍夫变换(SHT)和累计概率霍夫变换(PPHT)。
函数原型:
CvSeq* cvHoughLines2(CvArr* image,void* line_storage,int mehtod,double rho,double theta
,int threshold,double param1 =0,double param2 =0);
参数说明
image:输入 8-比特、单通道 (二值) 图像,当用CV_HOUGH_PROBABILISTIC方法检测的时候其内容会被函数改变。line_storage:检测到的线段存储仓. 可以是内存存储仓 (此种情况下,一个线段序列在存储仓中被创建,并且由函数返回),或者是包含线段参数的特殊类型(见下面)的具有单行/单列的矩阵(CvMat*)。矩阵头为函数所修改,使得它的 cols/rows 将包含一组检测到的线段。如果 line_storage 是矩阵,而实际线段的数目超过矩阵尺寸,那么最大可能数目的线段被返回(线段没有按照长度、可信度或其它指标排序).
method:Hough 变换变量,是下面变量的其中之一:
(1)CV_HOUGH_STANDARD - 传统或标准 Hough 变换. 每一个线段由两个浮点数 (ρ, θ) 表示,其中 ρ 是直线与原点 (0,0) 之间的距离,θ 线段与 x-轴之间的夹角。因此,矩阵类型必须是 CV_32FC2 type.
(2)CV_HOUGH_PROBABILISTIC - 概率 Hough 变换(如果图像包含一些长的线性分割,则效率更高). 它返回线段分割而不是整个线段。每个分割用起点和终点来表示,所以矩阵(或创建的序列)类型是 CV_32SC4.
(3)CV_HOUGH_MULTI_SCALE - 传统 Hough 变换的多尺度变种。线段的编码方式与 CV_HOUGH_STANDARD 的一致。
rho:与像素相关单位的距离精度
theta:弧度测量的角度精度
threshold:阈值参数。如果相应的累计值大于 threshold, 则函数返回这条线段.
param1:第一个方法相关的参数:对传统 Hough 变换,不使用(0).对概率 Hough 变换,它是最小线段长度.对多尺度 Hough 变换,它是距离精度 rho 的分母 (大致的距离精度是 rho 而精确的应该是 rho / param1 ).
param2:第二个方法相关参数:对传统 Hough 变换,不使用 (0).对概率 Hough 变换,这个参数表示在同一条直线上进行碎线段连接的最大间隔值(gap), 即当同一条直线上的两条碎线段之间的间隔小于param2时,将其合二为一。对多尺度 Hough 变换,它是角度精度 theta 的分母 (大致的角度精度是 theta 而精确的角度应该是 theta / param2)
六、cvLine
OPENCV绘图函数,功能:绘制连接两个点的线段
函数原型:
void cvLine( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1, int line_type=8, int shift=0 );
img 图像。
pt1 线段的第一个端点。
pt2 线段的第二个端点。
color 线段的颜色。
thickness 线段的粗细程度。
line_type 线段的类型。
8 (or 0) - 8-connected line(8邻接)连接线。
4 - 4-connected line(4邻接)连接线。
CV_AA - antialiased 线条。
shift 坐标点的小数点位数。
函数cvLine 在图像中的点1和点2之间画一条线段。线段被图像或感兴趣的矩形(ROI rectangle)所裁剪。对于具有整数坐标的non-antialiasing 线条,使用8-连接或者4-连接Bresenham 算法。画粗线条时结尾是圆形的。画 antialiased 线条使用高斯滤波。要指定线段颜色,用户可以使用使用宏CV_RGB( r, g, b )。
而且指定线条颜色的时候用到的宏CV_RGB(r,g,b)定义为#define CV_RGB( r, g, b ) cvScalar( (b), (g), (r), 0 ),由此可见,实际上起作用的颜色是看cvScalar中的b,g,r顺序,线段颜色就不言而喻了
七、cvCircle
定义
void cvCircle( CvArr* img, CvPoint center, int radius, CvScalar color, int thickness=1, int line_type=8, int shift=0 );
参数
• img 图像
• center 圆心坐标
• radius 圆形的半径
• color 线条的颜色
• thickness 如果是正数,表示组成圆的线条的粗细程度。否则,表示圆是否被填充
• line_type 线条的类型。见 cvLine 的描述
• shift 圆心坐标点和半径值的小数点位数
解释
函数cvCircle绘制或填充一个给定圆心和半径的圆。圆被感兴趣矩形所裁剪。 若指定圆的颜色,可以使用宏 CV_RGB ( r, g, b )。
八、cvHoughCircles
CvSeq *cvHoughCircles(CvArr *image,void *circle_storage,int method,double dp,double min_dist,double param1,double param2,int min_radius,int max_radius)
参数
image:输入8bit(灰度)图像,其内容可被函数所改变
circle_storage:检测到的圆存储仓,可以是内存存储仓 (此种情况下,一个线段序列在存储仓中被创建,并且由函数返回)或者是包含圆参数的特殊类型的具有单行/单列的 CV_32FC3型矩阵(CvMat*). 矩阵头为函数所修改,使得它的 cols/rows 将包含一组检测到的圆。如果 circle_storage 是矩阵,而实际圆的数目超过矩阵尺寸,那么最大可能数目的圆被返回,每个圆由三个浮点数表示:圆心坐标(x,y)和半径.).
method:Hough 变换方式,目前只支持CV_HOUGH_GRADIENT
dp:寻找圆弧圆心的累计分辨率,这个参数允许创建一个比输入图像分辨率低的累加器。(这样做是因为有理由认为图像中存在的圆会自然降低到与图像宽高相同数量的范畴)。如果dp设置为1,则分辨率是相同的;如果设置为更大的值(比如2),累加器的分辨率受此影响会变小(此情况下为一半)。dp的值不能比1小。
min_dist:该参数是让算法能明显区分的两个不同圆之间的最小距离。
param1:用于Canny的边缘阀值上限,下限被置为上限的一半。
param2:累加器的阀值。
min_radius:最小圆半径。
max_radius:最大圆半径。