cvwatershed的函数excel 自定义函数在哪儿

图像处理和图像识别中常用的OpenCV函数
图像处理和图像识别中常用的OpenCV函数
发布时间: 11:28:02
编辑:www.fx114.net
本篇文章主要介绍了"图像处理和图像识别中常用的OpenCV函数",主要涉及到图像处理和图像识别中常用的OpenCV函数方面的内容,对于图像处理和图像识别中常用的OpenCV函数感兴趣的同学可以参考一下。
文章来源:http://blog.csdn.net/fengbingchun/article/details/5816253
1.&& cvLoadImage:将图像文件加载至内存;
2.&& cvNamedWindow:在屏幕上创建一个窗口;
3.&& cvDestroyWindow:销毁显示图像文件的窗口;
4.&& cvDestroyAllWindows:销毁显示图像文件的所有窗口;
5.&& cvShowImage:在一个已创建好的窗口中显示图像;
6.&& cvWaitKey:使程序暂停,等待用户触发一个按键操作;
7.&& cvReleaseImage:释放图像文件所分配的内存;
8.&& cvCreateFileCapture:通过参数设置确定要读入的AVI文件;
9.&& cvQueryFrame:用来将下一帧视频文件载入内存;
10.& cvReleaseCapture:释放CvCapture结构开辟的内存空间;
11.& cvCreateTrackbar:创建一个滚动条;
12.& cvSetCaptureProperty:设置CvCapture对象的各种属性;
13.& cvGetCaptureProperty:查询CvCapture对象的各种属性;
14.& cvGetSize:当前图像结构的大小;
15.& cvSmooth:对图像进行平滑处理;
16.& cvPyrDown:图像金字塔,降采样,图像缩小为原来四分之一;
17.& cvPyrUp:图像金字塔,将现有的图像在每个维度上都放大两倍;
18.& cvResize:放大或缩小图像;
19.& cvCreateCameraCapture:从摄像设备中读入数据;
20.& cvCreateVideoWriter:创建一个写入设备以便逐帧将视频流写入视频文件;
21.& cvWriteFrame:逐帧将视频流写入文件;
22.& cvReleaseVideoWriter:释放CvVideoWriter结构开辟的内存空间;
23.& CV_MAT_ELEM:从矩阵中得到一个元素;
24.& cvAbs:计算数组中所有元素的绝对值;
25.& cvAbsDiff:计算两个数组差值的绝对值;
26.& cvAbsDiffS:计算数组和标量差值的绝对值;
27.& cvAdd:两个数组的元素级的加运算;
28.& cvAddS:一个数组和一个标量的元素级的相加运算;
29.& cvAddWeighted:两个数组的元素级的加权相加运算(alpha运算);
30.& cvScaleAdd:计算一个数组缩放后与另一个数组的和;
31.& cvAvg:计算数组中所有元素的平均值;
32.& cvAvgSdv:计算数组中所有元素的绝对值和标准差;
33.& cvCalcCovarMatrix:计算一组n维空间向量的协方差;
34.& cvCmp:对两个数组中的所有元素运用设置的比较操作;
35.& cvCmpS:对数组和标量运用设置的比较操作;
36.& cvConvertScale(cvConvert):用可选的缩放值转换数组元素类型;
37.& cvCopy:把数组中的值复制到另一个数组中;
38.& cvCountNonZero:计算数组中非0值的个数;
39.& cvCrossProduct:计算两个三维向量的向量积(叉积);
40.& cvCvtColor:将数组的通道从一个颜色空间转换另外一个颜色空间;
41.& cvDet:计算方阵的行列式;
42.& cvDotProduct:计算两个向量的点积;
43.& cvEigenVV:计算方阵的特征值和特征向量;
44.& cvFlip:围绕选定轴翻转;
45.& cvGEMM:矩阵乘法;
46.& cvGetCol:从一个数组的列中复制元素;
47.& cvGetCols:从数据的相邻的多列中复制元素;
48.& cvGetDiag:复制数组中对角线上的所有元素;
49.& cvGetDims:返回数组的维数;
50.& cvGetDimSize:返回一个数组的所有维的大小;
51.& cvGetRow:从一个数组的行中复制元素值;
52.& cvGetRows:从一个数组的多个相邻的行中复制元素值;
53.& cvGetSize:得到二维的数组的尺寸,以CvSize返回;
54.& cvGetSubRect:从一个数组的子区域复制元素值;
55.& cvInRange:检查一个数组的元素是否在另外两个数组中的值的范围内;
56.& cvInRangeS:检查一个数组的元素的值是否在另外两个标量的范围内;
57.& cvInvert:求矩阵的逆;
58.& cvMahalonobis:计算两个向量间的马氏距离;
59.& cvMax:在两个数组中进行元素级的取最大值操作;
60.& cvMaxS:在一个数组和一个标量中进行元素级的取最大值操作;
61.& cvMin:在两个数组中进行元素级的取最小值操作;
62.& cvMinS:在一个数组和一个标量中进行元素级的取最小值操作;
63.& cvMinMaxLoc:寻找数组中的最大最小值;
64.& cvMul:计算两个数组的元素级的乘积(点乘);
65.& cvDiv:用另外一个数组对一个数组进行元素级的除法运算;
66.& cvNormalize:将数组中元素进行归一化;
67.& cvReduce:通过给定的操作符将二维数组简为向量;
68.& cvRepeat:以平铺的方式进行数组复制;
69.& cvSet:用给定值初始化数组;
70.& cvSetZero:将数组中所有元素初始化为0;
71.& cvSetIdentity:将数组中对角线上的元素设为1,其他置0;
72.& cvSolve:求出线性方程组的解;
73.& cvSplit:将多通道数组分割成多个单通道数组;
74.& cvMerge:把几个单通道图像合并为一个多通道图像;
75.& cvSub:两个数组元素级的相减;
76.& cvSubS:元素级的从数组中减去标量;
77.& cvSubRS:元素级的从标量中减去数组;
78.& cvSum:对数组中的所有元素求和;
79.& cvSVD:二维矩阵的奇异值分解;
80.& cvSVBkSb:奇异值回代计算;
81.& cvTrace:计算矩阵迹;
82.& cvTranspose:矩阵的转置运算;
83.& cvNot:按位对数组中的每一个元素求反;
84.& cvOr:对两个数组进行按位或操作;
85.& cvOrs:在数组与标量之间进行按位或操作;
86.& cvXor:对两个数组进行按位异或操作;
87.& cvXorS:在数组和标量之间进行按位异或操作;
88.& cvAnd:对两个数组进行按位与操作;
89.& cvAndS:在数组和标量之间进行按位与操作;
90.& cvZero:将所有数组中的元素置为0;
91.& cvConvertScaleAbs:计算可选的缩放值的绝对值之后再转换数组元素的类型;
92.& cvNorm:计算数组的绝对范数, 绝对差分范数或者相对差分范数;
93.& cvScale:是cvConvertScale的一个宏,可以用来重新调整数组的内容,并且可以将参数从一种数据类型转换为另一种;
94.& cvT:是函数cvTranspose的缩写;
95.& cvLine:画直线;
96.& cvRectangle:画矩形;
97.& cvCircle:画圆;
98.& cvEllipse:画椭圆;
99.& cvEllipseBox:使用外接矩形描述椭圆;
100.cvFillPoly、cvFillConvexPoly、cvPolyLine:画多边形;
101.cvPutText:在图像上输出一些文本;
102.cvGetTextSize:计算文本串的宽和高;
103.cvInitFont:采用一组参数配置一些用于屏幕输出的基本个特定字体;
104.cvSave:矩阵保存;
105.cvLoad:矩阵读取;
106.cvOpenFileStorage:为读/写打开存储文件;
107.cvReleaseFileStorage:释放存储的数据;
108.cvStartWriteStruct:开始写入新的数据结构;
109.cvEndWriteStruct:结束写入数据结构;
110.cvWriteInt:写入整数型;
111.cvWriteReal:写入浮点型;
112.cvWriteString:写入字符型;
113.cvWriteComment:写一个XML或YAML的注释字串;
114.cvWrite:写一个对象;
115.cvWriteRawData:写入多个数值;
116.cvWriteFileNode:将文件节点写入另一个文件存储器;
117.cvGetRootFileNode:获取存储器最顶层的节点;
118.cvGetFileNodeByName:在映图或存储器中找到相应节点;
119.cvGetHashedKey:为名称返回一个惟一的指针;
120.cvGetFileNode:在映图或文件存储器中找到节点;
121.cvGetFileNodeName:返回文件的节点名;
122.cvReadInt:读取一个无名称的整数型;
123.cvReadIntByName:读取一个有名称的整数型;
124.cvReadReal:读取一个无名称的浮点型;
125.cvReadRealByName:读取一个有名称的浮点型;
126.cvReadString:从文件节点中寻找字符串;
127.cvReadStringByName:找到一个有名称的文件节点并返回它;
128.cvRead:将对象解码并返回它的指针;
129.cvReadByName:找到对象并解码;
130.cvReadRawData:读取多个数值;
131.cvStartReadRawData:初始化文件节点序列的读取;
132.cvReadRawDataSlice:读取文件节点的内容;
133.cvGetModuleInfo:检查IPP库是否已经正常安装并且检验运行是否正常;
134.cvResizeWindow:用来调整窗口的大小;
135.cvSaveImage:保存图像;
136.cvMoveWindow:将窗口移动到其左上角为x,y的位置;
137.cvDestroyAllWindow:用来关闭所有窗口并释放窗口相关的内存空间;
138.cvGetTrackbarPos:读取滑动条的值;
139.cvSetTrackbarPos:设置滑动条的值;
140.cvGrabFrame:快速的从摄像头或视频文件中抓取帧,被抓取的帧在内部被存储;
141.cvRetrieveFrame:取回由函数cvGrabFrame抓取的图像,返回的图像不可以被用户释放或者修改;
142.cvConvertImage:用于在常用的不同图像格式之间转换;
143.cvErode:形态学腐蚀;
144.cvDilate:形态学膨胀;
145.cvMorphologyEx:更通用的形态学函数;
146.cvCreateStructuringElementEx:创建自定义的IplConvKernel核,应用在相应形态学操作中;
147.cvReleaseStructuringElement:释放由自定义创建的IplConvKernel核;
148.cvFloodFill:漫水填充算法,用来进一步控制哪些区域将被填充颜色;
149.cvPyrSegmentation:利用金字塔实现图像分割;
150.cvThreshold:图像阈值化;
151.cvAcc:可以将8位整数类型图像累加为浮点图像;
152.cvAdaptiveThreshold:图像自适应阈值;
153.cvFilter2D:图像卷积;
154.cvCopyMakeBorder:将特定的图像轻微变大,然后以各种方式自动填充图像边界;
155.cvCanny:Canny边缘检测;
156.cvSobel:图像边缘检测,Sobel算子;
157.cvLaplace:拉普拉斯变换、图像边缘检测;
158.cvHoughLines2:霍夫直线变换;
159.cvHoughCircles:霍夫圆变换;
160.cvWarpAffine:稠密仿射变换;
161.cvGetQuadrangleSubPix:仿射变换(提取像素四边形,使用子像素精度);
162.cvGetRectSubPix:从图像中提取像素矩形,使用子像素精度;
163.cvGetAffineTransform:仿射映射矩阵的计算;
164.cvCloneImage:将整个IplImage结构复制到新的IplImage中;
165.cv2DRotationMatrix:仿射映射矩阵的计算;
166.cvTransform:稀疏仿射变换;
167.cvWarpPerspective:密集透视变换(单应性);
168.cvGetPerspectiveTransform:计算透视映射矩阵;
169.cvPerspectiveTransform:稀疏透视变换;
170.cvCartToPolar:将数值从笛卡尔空间到极坐标(极性空间)进行映射;
171.cvPolarToCart:将数值从极性空间到笛卡尔空间进行映射;
172.cvLogPolar:对数极坐标变换;
173.cvDFT:离散傅里叶变换;
174.cvMulSpectrums:频谱乘法;
175.cvDCT:离散余弦变换;
176.cvIntegral:计算积分图像;
177.cvDistTransform:图像的距离变换;
178.cvEqualizeHist:直方图均衡化;
179.cvCreateHist:创建一新直方图;
180.cvReleaseHist:释放创建的直方图;
181.cvMakeHistHeaderForArray:根据已给出的数据创建直方图;
182.cvNormalizeHist:归一化直方图;
183.cvThreshHist:直方图阈值函数;
184.cvCalcHist:从图像中自动计算直方图;
185.cvCompareHist:用于对比两个直方图的相似度;
186.cvCalcEMD2:陆地移动距离(EMD)算法;
187.cvCalcBackProject:反向投影;
188.cvCalcBackProjectPatch:图块的方向投影;
189.cvMatchTemplate:模板匹配;
190.cvCreateMemStorage:用于创建一个内存存储器;
191.cvCreateSeq:创建序列;
192.cvSeqInvert:将序列进行逆序操作;
193.cvCvtSeqToArray:复制序列的全部或部分到一个连续内存数组中;
194.cvFindContours:从二值图像中寻找轮廓;
195.cvDrawContours:绘制轮廓;
196.cvApproxPoly:使用多边形逼近一个轮廓;
197.cvConvexHull2:使用Sklansky算法计算2D点集的凸外形;
198.cvPointPolygonTest:点在多边形中的位置(内部、外部、多边形边上);
199.cvContourPerimeter:轮廓长度;
200.cvContoursMoments:计算轮廓矩;
201.cvMoments:计算Hu不变矩;
202.cvMatchShapes:使用矩进行匹配;
203.cvInitLineIterator:对任意直线上的像素进行采样;
204.cvSampleLine:对直线采样;
205.cvAbsDiff:帧差;
206.cvWatershed:分水岭算法;
207.cvInpaint:修补图像;
208.cvGoodFeaturesToTrack:寻找角点;
209.cvCornerHarris:Harris角点检测;
210.cvFindCornerSubPix:用于发现亚像素精度的角点位置;
211.cvMeanShift:mean-shift跟踪算法;
212.cvCamShift:camshift跟踪算法;
213.cvCreateConDensation:condensation算法,分配condensation滤波器结构;
214.cvReleaseConDensation:condensation算法,释放condensation滤波器结构;
215.cvConDensInitSampleSet:condensation算法,初始化condensation算法中的粒子集;
216.cvConDensUpdateByTime:condensation算法,估计下个模型状态;
217.cvConvertPointsHomogenious:对齐次坐标进行转换;
218.cvFindChessboardCorners:定位棋盘角点;
219.cvCalibrateCamera2:利用定标来计算摄像机的内参数和外参数;
220.cvInitUndistortMap:计算形变和非行变图像的对应;
221.cvInitUndistortRectifyMap:computes the undistortion and rectification transformation map;
222.cvRemap:图像重映射,校正标定图像,图像插值;
223.cvFindFundamentalMat:由两幅图像中对应点计算出基本矩阵;
224.cvComputeCorrespondEpilines:为一幅图像中的点计算其在另一幅图像中对应的对极线;
225.cvDrawChessboardCorners:绘制检测到的棋盘角点;
226.cvFindHomography:计算单应性矩阵;
227.cvRodrigues2:罗德里格斯变换;
228.cvFitLine:直线拟合算法;
229.cvCalcCovarMatrix:计算协方差矩阵;
230.cvInvert:计算协方差矩阵的逆矩阵;
231.cvMahalanobis:计算Mahalanobis距离;
232.cvKMeans2:K均值;
233.cvCloneMat:根据一个已有的矩阵创建一个新矩阵;
234.cvPreCornerDetect:计算用于角点检测的特征图;
235.cvGetImage:CvMat图像数据格式转换成IplImage图像数据格式;
236.cvMatMul:两矩阵相乘;
237.cvMatMulAdd:dst = src1 * src2 + src3;
238.cvRound:返回和参数最接近的整数值;
239.cvFloor:返回不大于参数的最大整数值;
240.cvCeil:返回不小于参数的最小整数值;
241.cvCreateImage:创建图像;
242.cvSetMouseCallback:用鼠标获取确定窗口上的矩形;
243.cvContourArea:计算整个或部分轮廓的面积;
244.cvArcLength:计算轮廓周长或曲线长度;
245.cvBoundingRect:计算点集的最外面矩形边界(获取轮廓的外接矩形);
246.cvSeqRemove:删除序列中指定位置的元素(轮廓);
247.cvGetTickCount:返回64位长整数的时间数据;
248.cvGetTickFrequency:返回系统时钟频率;
249.cvRNG:随机生成一个64位随机数(uint64);
250.cvRandInt:返回均匀分布32位的随机数(uint32);
251.cvRandReal:返回均匀分布0~1之间的随机小数;
252.cvRandArr:用随机数填充数组并更新RNG状态;
253.cvRandInit:初始化CvRandState数据结构,可以选定随机分布的种类,并给定它种子;
254.cvInitMatHeader:初始化矩阵头,不分配存储空间;
255.cvTermCriteria:迭代算法终止准则;
256.CvSVMParams:SVM训练参数,该结构需要初始化,并传递给CvSVM训练函数;
257.CvSVM::train:训练SVM(支持向量机);
258.CvSVM::predict:预测一个新样本的响应值,在分类问题中,这个函数返回类别编号,在回归问题中,返回函数值;
259.cvSet2D:修改指定的数组;
260.CvSVM::get_support_vector_count:获得支持向量的个数;
261.CvSVM::get_support_vector:获得对应索引编号的支持向量;
262.CvSVM::save:将SVM训练完的数据保存到指定的文件中(save来源于cvStatModel为ML库的通用类);
263.CvSVM::load:将指定的文件装载到SVM指定的对象中;
264.cvCreateBGCodeBookModel:codebook方法中,初始化;
265.cvBGCodeBookUpdate:codebook方法中,更新背景模型;
266.cvBGCodeBookClearStale:codebook方法中,清除消极的codebook;
267.cvBGCodeBookDiff:codebook方法中,背景减除;
268.cvReleaseBGCodeBookModel:codebook方法中,释放资源;
269.cvSegmentFGMask:对前景做连通域分割;
270.cvRunningAvg:更新running average,可用于运动目标检测中更新背景;
271.cvCalcOpticalFlowHS:使用Horn&Schunck算法计算两幅图像的光流;
272.cvCalcOpticalFlowLK:使用Lucas&Kanade算法计算两幅图像的光流(非金字塔);
273.cvCalcOpticalFlowPyrLK:使用金字塔Lucas&Kanade方法计算一个稀疏特征集的光流;
274.cvCalcOpticalFlowBM:用块匹配方法计算两幅图像的光流;
275.cvUpdateMotionHistory:运动模板中,去掉影像以更新运动历史图像;
276.cvRunningAvg:更新running average滑动平均;
277.cvCalcMotionGradient:运动模板中,计算运动历史图像的梯度方向;
278.cvSegmentMotion:运动模板中,将整个运动分割为独立的运动部分;
279.cvCalcGlobalOrientation:运动模板中,计算某些选择区域的全局运动方向;
280.cvGetMinMaxHistValue:直方图中找到最小值和最大值;
281.cvMinAreaRect2:寻找最小面积的外接矩形;
282.cvMinEnclosingCircle:计算轮廓的最小外接圆;
283.cvFitEllipse2:获取轮廓的椭圆边界框;
284.cvMaxRect:寻找包含两个输入矩形的具有最小面积的矩形边界;
285.cvBoxPoints:寻找盒子的顶点;
286.cvCreateKalman:Kalman中,分配Kalman滤波器结构;
287.cvReleaseKalman:Kalman中,释放Kalman滤波器结构;
288.cvKalmanPredict:Kalman中,估计后来的模型状态;
289.cvKalmanCorrect:Kalman中,调节模型状态;
290.cvLoadHaarClassifierCascade:CvHaarClassifierCascade中,从文件中装载训练好的级联分类器或者从OpenCV中嵌入的分类器数据库中导入;
291.cvHaarDetectObjects:CvHaarClassifierCascade中,检测图像中的目标;
292.cvSetImageForHaarClassifierCascade:CvHaarClassifierCascade中,为隐藏的cascade(hidden cascade)指定图像;
293.cvReleaseHaarClassifierCascade:CvHaarClassifierCascade中,释放haar classifier cascade;
294.cvRunHaarClassifierCascade:CvHaarClassifierCascade中,在给定位置的图像中运行cascade of boosted classifier;
295.CvAdaptiveSkinDetector::process:皮肤检测;
296.cvCalcEigenObjects:计算传入影像阵列的eigen vector、eigen value、image average(影像平均值);
297.cvEigenDecomposite:透过eigen vector和原始影像集来解析每张图片降维后对应的系数coefficients;
298.cvEigenProjection:投影图片在特征空间;
299.cvAlloc:分配内存;
300.cvFree:释放内存(cvAlloc与cvFree应匹配出现);
301.CvANN_MLP::create:constructs MLP(multi-layer perceptrons) withthe specified topology;
302.CvANN_MLP::train:trains/updates MLP;
303.CvANN_MLP::predict:predicts responses for input samples;
304.CvANN_MLP::get_layer_count:returns the number fo layers in the MLP;
305.CvANN_MLP::get_layer_size:returns numbers of neurons in each layer ofthe MLP;
306.CvANN_MLP::get_weights:returns neurons weights of the particularlayer;
307.CvKNearest::CvKNearest:default and training constructors;
308.CvKNearest::train:trains the model;
309.CvKNearest::find_nearest:finds the neighbors and predicts responses forinput vectors;
310.CvKNearest::get_max_k:returns the number of maximum neighbors thatmay be passed to the method CvKNearest::find_nearest();
311.CvKNearest::get_var_count:returns the number of used features(variablescount);
312.CvKNearest::get_sample_count:returns the total number of train samples;
313.CvKNearest::is_regression:returns type of the problem(true forregression and false for classification);
314.cvGetSeqElem:returns a pointer to a sequenceelement according to its index;
315.cvGetReal2D:return a specific element ofsingle-channel 2D array;
316.cvSqrt:计算平方根;
317.cvPow:对数组内每个元素求幂;
318.cvCbrt:计算立方根;
319.cvExp:计算数组元素的指数幂;
320.cvLog:计算每个数组元素的绝对值的自然对数;
321.cvSetImageROI:设置感兴趣区域;
322.cvResetImageROI:释放感兴趣区域;
323.cvSetImageCOI:设置感兴趣通道;
324.cvLUT:显示查找表,实际上就是一张像素灰度值的映射表,它将实际采样到的像素灰度值经过一定的变换如阈值、反转、二值化、对比度调整、线性变换等,变成了另外一个与之对应的灰度值;
325.&class FeatureDetector:abstract base class for 2D image feature detectors;
326.&class FastFeatureDetector:wrapping class for feature detection using the FAST() method;
327.&class SURF(SurfFeatureDetector、SurfDescriptorExtractor):extracting Speeded Up RobustFeatures from an image;
328.&class SIFT(SiftFeatureDetector):extracting keypoints and computingdescriptors using the Scale Invariant Feature Transform(SIFT) algorithm;
329.cvExtractSURF:detects keypoints andcomputes SURF descriptors for them;
本文标题:
本页链接:图像处理(1)
本文转载自:王先荣同志的博客 /xrwang/archive//ImageSegmentation.html
图像分割指的是将数字图像细分为多个图像子区域的过程,在OpenCv中实现了三种跟图像分割相关的算法,它们分别是:分水岭分割算法、金字塔分割算法以及均值漂移分割算法。它们的使用过程都很简单,下面的文章权且用于记录,并使该系列保持完整吧。
1、分水岭分割算法
&&& 分水岭分割算法需要您或者先前算法提供标记,该标记用于指定哪些大致区域是目标,哪些大致区域是背景等等;分水岭分割算法的分割效果严重依赖于提供的标记。OpenCv中的函数cvWatershed实现了该算法,函数定义如下:
void cvWatershed(const CvArr * image, CvArr * markers)
其中:image为8为三通道的彩色图像;
&&&&& markers是单通道整型图像,它用不同的正整数来标记不同的区域,下面的代码演示了如果响应鼠标事件,并生成标记图像。
生成标记图像
//当鼠标按下并在源图像上移动时,在源图像上绘制分割线条
private void pbSource_MouseMove(object sender, MouseEventArgs e)
//如果按下了左键
if (e.Button == MouseButtons.Left)
if (previousMouseLocation.X &= 0 && previousMouseLocation.Y &= 0)
Point p1 = new Point((int)(previousMouseLocation.X * xScale), (int)(previousMouseLocation.Y * yScale));
Point p2 = new Point((int)(e.Location.X * xScale), (int)(e.Location.Y * yScale));
LineSegment2D ls = new LineSegment2D(p1, p2);
int thickness = (int)(LineWidth * xScale);
imageSourceClone.Draw(ls, new Bgr(255d, 255d, 255d), thickness);
pbSource.Image = imageSourceClone.B
imageMarkers.Draw(ls, new Gray(drawCount), thickness);
previousMouseLocation = e.L
//当松开鼠标左键时,将绘图的前一位置设置为(-1,-1)
private void pbSource_MouseUp(object sender, MouseEventArgs e)
previousMouseLocation = new Point(-1, -1);
drawCount++;
您可以用类似下面的方式来使用分水岭算法:
使用分水岭分割算法
/// &summary&
/// 分水岭算法图像分割
/// &/summary&
/// &returns&返回用时&/returns&
private string Watershed()
//分水岭算法分割
Image&Gray, Int32& imageMarkers2 = imageMarkers.Copy();
Stopwatch sw = new Stopwatch();
sw.Start();
CvInvoke.cvWatershed(imageSource.Ptr, imageMarkers2.Ptr);
sw.Stop();
//将分割的结果转换到256级灰度图像
pbResult.Image = imageMarkers2.B
imageMarkers2.Dispose();
return string.Format(&分水岭图像分割,用时:{0:F05}毫秒。\r\n&, sw.Elapsed.TotalMilliseconds);
2、金字塔分割算法
&&& 金字塔分割算法由cvPrySegmentation所实现,该函数的使用很简单;需要注意的是图像的尺寸以及金字塔的层数,图像的宽度和高度必须能被2整除,能够被2整除的次数决定了金字塔的最大层数。下面的代码演示了如果校验金字塔层数:
校验金字塔分割的金字塔层数
/// &summary&
/// 当改变金字塔分割的参数“金字塔层数”时,对参数进行校验
/// &/summary&
/// &param name=&sender&&&/param&
/// &param name=&e&&&/param&
private void txtPSLevel_TextChanged(object sender, EventArgs e)
int level = int.Parse(txtPSLevel.Text);
if (level & 1 || imageSource.Width % (int)(Math.Pow(2, level - 1)) != 0 || imageSource.Height % (int)(Math.Pow(2, level - 1)) != 0)
MessageBox.Show(this, &注意:您输入的金字塔层数不符合要求,计算结果可能会无效。&, &金字塔层数错误&);
使用金字塔分割的示例代码如下:
使用金字塔分割算法
/// &summary&
/// 金字塔分割算法
/// &/summary&
/// &returns&&/returns&
private string PrySegmentation()
//准备参数
Image&Bgr, Byte& imageDest = new Image&Bgr, byte&(imageSource.Size);
MemStorage storage = new MemStorage();
IntPtr ptrComp = IntPtr.Z
int level = int.Parse(txtPSLevel.Text);
double threshold1 = double.Parse(txtPSThreshold1.Text);
double threshold2 = double.Parse(txtPSThreshold2.Text);
//金字塔分割
Stopwatch sw = new Stopwatch();
sw.Start();
CvInvoke.cvPyrSegmentation(imageSource.Ptr, imageDest.Ptr, storage.Ptr, out ptrComp, level, threshold1, threshold2);
sw.Stop();
//显示结果
pbResult.Image = imageDest.B
//释放资源
imageDest.Dispose();
storage.Dispose();
return string.Format(&金字塔分割,用时:{0:F05}毫秒。\r\n&, sw.Elapsed.TotalMilliseconds);
3、均值漂移分割算法
均值漂移分割算法由cvPryMeanShiftFiltering所实现,均值漂移分割的金字塔层数只能介于[1,7]之间,您可以用类似下面的代码来使用它:
使用均值漂移分割算法
/// &summary&
/// 均值漂移分割算法
/// &/summary&
/// &returns&&/returns&
private string PryMeanShiftFiltering()
//准备参数
Image&Bgr, Byte& imageDest = new Image&Bgr, byte&(imageSource.Size);
double spatialRadius = double.Parse(txtPMSFSpatialRadius.Text);
double colorRadius = double.Parse(txtPMSFColorRadius.Text);
int maxLevel = int.Parse(txtPMSFNaxLevel.Text);
int maxIter = int.Parse(txtPMSFMaxIter.Text);
double epsilon = double.Parse(txtPMSFEpsilon.Text);
MCvTermCriteria termcrit = new MCvTermCriteria(maxIter, epsilon);
//均值漂移分割
Stopwatch sw = new Stopwatch();
sw.Start();
OpenCvInvoke.cvPyrMeanShiftFiltering(imageSource.Ptr, imageDest.Ptr, spatialRadius, colorRadius, maxLevel, termcrit);
sw.Stop();
//显示结果
pbResult.Image = imageDest.B
//释放资源
imageDest.Dispose();
return string.Format(&均值漂移分割,用时:{0:F05}毫秒。\r\n&, sw.Elapsed.TotalMilliseconds);
函数cvPryMeanShiftFiltering在EmguCv中没有实现,我们可以用下面的方式来使用:
//均值漂移分割
[DllImport(&cv200.dll&)]
public static extern void cvPyrMeanShiftFiltering(IntPtr src, IntPtr dst, double spatialRadius, double colorRadius, int max_level, MCvTermCriteria termcrit);
4、分割效果及性能对比
&&& 上述三种分割算法的效果如何呢?下面我们以它们的默认参数,对一幅大小的图像进行分割。得到的结果如下所示:
总结:从上面我们可以看出:
&&& (1)分水岭分割算法的分割效果效果最好,均值漂移分割算法次之,而金字塔分割算法的效果最差;
&&& (2)均值漂移分割算法效率最高,分水岭分割算法接近于均值漂移算法,金字塔分割算法需要很长的时间。
&&& 值得注意的是分水岭算法对标记很敏感,需要仔细而认真的绘制。
本文的完整代码:
&span style=&font-size:18&&本文完整代码
using System.Collections.G
using System.D
using System.D
using System.L
using System.T
using System.Windows.F
using System.D
using System.Runtime.InteropS
using Emgu.CV;
using Emgu.CV.CvE
using Emgu.CV.S
using Emgu.CV.UI;
namespace ImageProcessLearn
public partial class FormImageSegment : Form
//成员变量
private string sourceImageFileName = &wky_tms_.jpg&;//源图像文件名
private Image&Bgr, Byte& imageSource =
private Image&Bgr, Byte& imageSourceClone =
//源图像的克隆
private Image&Gray, Int32& imageMarkers =
//标记图像
private double xScale = 1d;
//原始图像与PictureBox在x轴方向上的缩放
private double yScale = 1d;
//原始图像与PictureBox在y轴方向上的缩放
private Point previousMouseLocation = new Point(-1, -1);
//上次绘制线条时,鼠标所处的位置
private const int LineWidth = 5;
//绘制线条的宽度
private int drawCount = 1;
//用户绘制的线条数目,用于指定线条的颜色
public FormImageSegment()
InitializeComponent();
//窗体加载时
private void FormImageSegment_Load(object sender, EventArgs e)
//设置提示
toolTip.SetToolTip(rbWatershed, &可以在源图像上用鼠标绘制大致分割区域线条,该线条用于分水岭算法&);
toolTip.SetToolTip(txtPSLevel, &金字塔层数跟图像尺寸有关,该值只能是图像尺寸被2整除的次数,否则将得出错误结果&);
toolTip.SetToolTip(txtPSThreshold1, &建立连接的错误阀值&);
toolTip.SetToolTip(txtPSThreshold2, &分割簇的错误阀值&);
toolTip.SetToolTip(txtPMSFSpatialRadius, &空间窗的半径&);
toolTip.SetToolTip(txtPMSFColorRadius, &色彩窗的半径&);
toolTip.SetToolTip(btnClearMarkers, &清除绘制在源图像上,用于分水岭算法的大致分割区域线条&);
//加载图像
LoadImage();
//当窗体关闭时,释放资源
private void FormImageSegment_FormClosing(object sender, FormClosingEventArgs e)
if (imageSource != null)
imageSource.Dispose();
if (imageSourceClone != null)
imageSourceClone.Dispose();
if (imageMarkers != null)
imageMarkers.Dispose();
//加载源图像
private void btnLoadImage_Click(object sender, EventArgs e)
OpenFileDialog ofd = new OpenFileDialog();
ofd.CheckFileExists =
ofd.DefaultExt = &jpg&;
ofd.Filter = &图片文件|*.*.*.bmp|所有文件|*.*&;
if (ofd.ShowDialog(this) == DialogResult.OK)
if (ofd.FileName != &&)
sourceImageFileName = ofd.FileN
LoadImage();
ofd.Dispose();
//清除分割线条
private void btnClearMarkers_Click(object sender, EventArgs e)
if (imageSourceClone != null)
imageSourceClone.Dispose();
imageSourceClone = imageSource.Copy();
pbSource.Image = imageSourceClone.B
imageMarkers.SetZero();
drawCount = 1;
//当鼠标按下并在源图像上移动时,在源图像上绘制分割线条
private void pbSource_MouseMove(object sender, MouseEventArgs e)
//如果按下了左键
if (e.Button == MouseButtons.Left)
if (previousMouseLocation.X &= 0 && previousMouseLocation.Y &= 0)
Point p1 = new Point((int)(previousMouseLocation.X * xScale), (int)(previousMouseLocation.Y * yScale));
Point p2 = new Point((int)(e.Location.X * xScale), (int)(e.Location.Y * yScale));
LineSegment2D ls = new LineSegment2D(p1, p2);
int thickness = (int)(LineWidth * xScale);
imageSourceClone.Draw(ls, new Bgr(255d, 255d, 255d), thickness);
pbSource.Image = imageSourceClone.B
imageMarkers.Draw(ls, new Gray(drawCount), thickness);
previousMouseLocation = e.L
//当松开鼠标左键时,将绘图的前一位置设置为(-1,-1)
private void pbSource_MouseUp(object sender, MouseEventArgs e)
previousMouseLocation = new Point(-1, -1);
drawCount++;
//加载源图像
private void LoadImage()
if (imageSource != null)
imageSource.Dispose();
imageSource = new Image&Bgr, byte&(sourceImageFileName);
if (imageSourceClone != null)
imageSourceClone.Dispose();
imageSourceClone = imageSource.Copy();
pbSource.Image = imageSourceClone.B
if (imageMarkers != null)
imageMarkers.Dispose();
imageMarkers = new Image&Gray, Int32&(imageSource.Size);
imageMarkers.SetZero();
xScale = 1d * imageSource.Width / pbSource.W
yScale = 1d * imageSource.Height / pbSource.H
drawCount = 1;
//分割图像
private void btnImageSegment_Click(object sender, EventArgs e)
if (rbWatershed.Checked)
txtResult.Text += Watershed();
else if (rbPrySegmentation.Checked)
txtResult.Text += PrySegmentation();
else if (rbPryMeanShiftFiltering.Checked)
txtResult.Text += PryMeanShiftFiltering();
/// &summary&
/// 分水岭算法图像分割
/// &/summary&
/// &returns&返回用时&/returns&
private string Watershed()
//分水岭算法分割
Image&Gray, Int32& imageMarkers2 = imageMarkers.Copy();
Stopwatch sw = new Stopwatch();
sw.Start();
CvInvoke.cvWatershed(imageSource.Ptr, imageMarkers2.Ptr);
sw.Stop();
//将分割的结果转换到256级灰度图像
pbResult.Image = imageMarkers2.B
imageMarkers2.Dispose();
return string.Format(&分水岭图像分割,用时:{0:F05}毫秒。\r\n&, sw.Elapsed.TotalMilliseconds);
/// &summary&
/// 金字塔分割算法
/// &/summary&
/// &returns&&/returns&
private string PrySegmentation()
//准备参数
Image&Bgr, Byte& imageDest = new Image&Bgr, byte&(imageSource.Size);
MemStorage storage = new MemStorage();
IntPtr ptrComp = IntPtr.Z
int level = int.Parse(txtPSLevel.Text);
double threshold1 = double.Parse(txtPSThreshold1.Text);
double threshold2 = double.Parse(txtPSThreshold2.Text);
//金字塔分割
Stopwatch sw = new Stopwatch();
sw.Start();
CvInvoke.cvPyrSegmentation(imageSource.Ptr, imageDest.Ptr, storage.Ptr, out ptrComp, level, threshold1, threshold2);
sw.Stop();
//显示结果
pbResult.Image = imageDest.B
//释放资源
imageDest.Dispose();
storage.Dispose();
return string.Format(&金字塔分割,用时:{0:F05}毫秒。\r\n&, sw.Elapsed.TotalMilliseconds);
/// &summary&
/// 均值漂移分割算法
/// &/summary&
/// &returns&&/returns&
private string PryMeanShiftFiltering()
//准备参数
Image&Bgr, Byte& imageDest = new Image&Bgr, byte&(imageSource.Size);
double spatialRadius = double.Parse(txtPMSFSpatialRadius.Text);
double colorRadius = double.Parse(txtPMSFColorRadius.Text);
int maxLevel = int.Parse(txtPMSFNaxLevel.Text);
int maxIter = int.Parse(txtPMSFMaxIter.Text);
double epsilon = double.Parse(txtPMSFEpsilon.Text);
MCvTermCriteria termcrit = new MCvTermCriteria(maxIter, epsilon);
//均值漂移分割
Stopwatch sw = new Stopwatch();
sw.Start();
OpenCvInvoke.cvPyrMeanShiftFiltering(imageSource.Ptr, imageDest.Ptr, spatialRadius, colorRadius, maxLevel, termcrit);
sw.Stop();
//显示结果
pbResult.Image = imageDest.B
//释放资源
imageDest.Dispose();
return string.Format(&均值漂移分割,用时:{0:F05}毫秒。\r\n&, sw.Elapsed.TotalMilliseconds);
/// &summary&
/// 当改变金字塔分割的参数“金字塔层数”时,对参数进行校验
/// &/summary&
/// &param name=&sender&&&/param&
/// &param name=&e&&&/param&
private void txtPSLevel_TextChanged(object sender, EventArgs e)
int level = int.Parse(txtPSLevel.Text);
if (level & 1 || imageSource.Width % (int)(Math.Pow(2, level - 1)) != 0 || imageSource.Height % (int)(Math.Pow(2, level - 1)) != 0)
MessageBox.Show(this, &注意:您输入的金字塔层数不符合要求,计算结果可能会无效。&, &金字塔层数错误&);
/// &summary&
/// 当改变均值漂移分割的参数“金字塔层数”时,对参数进行校验
/// &/summary&
/// &param name=&sender&&&/param&
/// &param name=&e&&&/param&
private void txtPMSFNaxLevel_TextChanged(object sender, EventArgs e)
int maxLevel = int.Parse(txtPMSFNaxLevel.Text);
if (maxLevel & 0 || maxLevel & 8)
MessageBox.Show(this, &注意:均值漂移分割的金字塔层数只能在0至8之间。&, &金字塔层数错误&);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:7172次
排名:千里之外

我要回帖

更多关于 cvwatershed 的文章

 

随机推荐