opencv line函数什么函数可以替代insert

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运算);
:计算一个数组缩放后与另一个数组的和;
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:;
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:直方图均衡化;
:创建一新直方图;
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:计算形变和非行变图像的对应;
:computes the undistortion and rectification transformation map;
222.cvRemap:图像重映射,校正标定图像,图像插值;
223.cvFindFundamentalMat:由两幅图像中对应点计算出基本矩阵;
224.cvComputeCorrespondEpilines:为一幅图像中的点计算其在另一幅图像中对应的对极线;
:绘制检测到的棋盘角点;
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:;
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方法计算一个稀疏特征集的光流;
:用块匹配方法计算两幅图像的光流;
275.cvUpdateMotionHistory:运动模板中,去掉影像以更新运动历史图像;
276.cvRunningAvg:更新running average滑动平均;
:运动模板中,计算运动历史图像的梯度方向;
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:中,检测图像中的目标;
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;
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;
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1952次
排名:千里之外opencv图像修复算法cvInpaint(Telea的FMM算法) --苦逼孩
最近项目中要用到修复技术,看opencv里有两种算法,我先尝试了一下Telea在2004年提出的基于快速行进的修复算法(后面简称FMM算法)。找到作者的原文看了一下,对算法有了一定了解,记录一下。
论文题目:An Image Inpainting Technique Based on the Fast Marching Method (2004)
作者主页:http://www.cs.rug.nl/~alext/
论文下载: http://www.cs.rug.nl/~alext/PAPERS/index.html
(编号36的那篇)
在opencv中实现修复有两种算法,这里只介绍Telea的算法,即基于快速行进(FMM)的修复算法。
首先看c++接口中,函数的定义。
void cv::inpaint( const Mat& src, const Mat& mask, Mat& dst,
double inpaintRange, int flags )
//src:要修复的图像;
//mask:修复模板,必须是单通道图像;
//dst:目标图像;
//inpaintRange:选取邻域半径;
//flags:要使用的方法,可以是CV INPAINT NS或CV INPAINT TELEA(本文介绍的方法)。
其实c++接口实现的inpaint方法,只是调用了一下c接口中的cvinpaint。
cvInpaint( const vArr*_input_img,const CvArr* _inpaint_mask,CvArr* _output_img, double inpaintRange, int flags )
首先,FMM算法基于的思想是,先处理待修复区域边缘上的像素点,然后层层向内推进,直到修复完所有的像素点。
下面以灰度图为例,我们只需要计算出像素新的灰度值即可。对于彩色图像,分别用同样的方法处理各个通道即可。
一、先说一下如何修复一个像素点的。
参考上图,Ω区域是待修复的区域;δΩ指Ω的边界);要修复Ω中的像素,就需要计算出新的像素值来代替原值。
现在假设p点是我们要修复的像素。以p为中心选取一个小邻域B(ε),该邻域中的点像素值都是已知的(只要已知的)。(这个ε就是opencv函数中参数 inpaintRadius)
q为 Bε(p)中的一点,由q点计算P的灰度值公式如下:
I q (p) = I(q) + ? I(q)(p - q)(? I(q)是q点的亮度梯度值)
显然,我们需要的是用邻域Bε(p)中的所有点计算p点的新灰度值。显然,各个像素点所起的作用应该是不同的,也就引入了权值函数来决定哪些像素的值对新像素值影响更大,哪些比较小。采用下面的公式(公式2):
这里的w(p, q)就是权值函数,是用来限定邻域中各像素的贡献大小的。
w(p, q) = dir(p, q) · dst(p, q) · lev(p, q)
其中,d0和 T0分别为距离参数和水平集参数,一般都取为 1。方向因子 dir(p,q)保证了越靠近法线方向 N =
?T的像素点对 p 点的贡献最大;几何距离因子 dst(p,q)保证了离 p 点越近的像素点对p 点贡献越大;水平集距离因子lev(p,q)保证了离经过点 p 的待修复区域的轮廓线越近的已知像素点对点 p 的贡献越大。
二、下面就是考虑是什么样的顺序来处理待修复区域中的所有像素。作者采用的是快速行进方法Fast Marching Method。
行进算法伪代码:
δΩi = boundary of region to inpaint//修复区域的边缘
δΩ = δΩi
while (δΩ not empty)
p = pixel of δΩ closest to δΩi//修复距离边缘最近的像素
inpaint p using Eqn.2//利用公式2修复p点
advance δΩ into Ω//把边缘向里行进
看到这里,就会有疑惑了,怎么确定像素与边缘的距离呢。
算法中为待修复区域边缘构建了一个窄边(narrowBand),就是上面所说的δΩ。在opencv里是利用先将mask膨胀得到mask2(结构元素是长为2*ε+1的十字形,以中心点为原点),再用mask2减去mask得到band图,则band中非0元素即narrowBand)。从这里可以看出最初的narrowBand(即δΩ1)是不需要修复的。确定窄边的目的就是为了找到下面要修复的像素。
首先将像素分为三类,用flag标识记录:BAND:其实就是δΩ上的像素; KNOWN:就是δΩ外部不需要修复的像素;INSIDE:就是δΩ内部的等待修复的像素。
另外,每个像素还需要存储两个值:T(该像素离到边缘 δΩ的距离);I(灰度值)。
下面先说一下处理像素是按怎样的行进方式的:
初始化。首先按上面说的方法找到narrowBand,flag记为BAND;窄边内部的待修复区域记为INSIDE,已知像素flag设为KNOWN。BAND和KNOWN类型的像素T值初始化为0(这里看opencv代码里好像把KNOWN也设为106),INSIDE类型像素T值设为无限大(实际中设为106)。
定义一个数据结构NarrowBand(opencv中采用双向链表实现),将窄边中的像素按T值升序排列,依次加入到NarrowBand中,先处理T最小的像素。假设为p点,将p点类型改为KNOWN,然后依次处理p点的四邻域点Pi。如果Pi类型为INSIDE,若是则重新计算I,修复该点,并更新其T值,修改该点类型为BAND,加入NarrowBand(这里仍按顺序,即始终保持NarrowBand是按升序排列的)。依次进行,每次处理的都是NarrowBand中T最小的像素,直到NarrowBand中没有像素。
代码如下:
while (NarrowBand not empty)
extract P(i,j) = head(NarrowBand); /* STEP 1 *//*提取T值最小像素*/
for (k,l) in (i-1,j),(i,j-1),(i+1,j),(i,j+1)/*依次处理该像素的四邻域像素*/
if (f(k,l)!=KNOWN)
if (f(k,l)==INSIDE)
f(k,l)=BAND; /* STEP 2修改(k,l)像素点的lag*/
inpaint(k,l); /* STEP 3修复(k,l)像素点*/
T (k,l) = min(solve(k-1,l,k,l-1), /* STEP 4 更新(k,l)像素点的值*/
solve(k+1,l,k,l-1),
solve(k-1,l,k,l+1),
solve(k+1,l,k,l+1));
insert(k,l) in NarrowB /* STEP 5 将(k,l)像素点加入NarrowBand*/
下面是具体计算T的代码个地方,原文中的代码有错误,下面是参考opencv代码修改好的)
T(k,l)=min(solve(k-1,l,k,l-1),solve(k+1,l,k,l-1),solve(k-1,l,k,l+1),solve(k+1,l,k,l+1));
float solve(int i1,int j1,int i2,int j2)
float sol = 1.0e6;
if (f(i1,j1)==KNOWN)
if (f(i2,j2)==KNOWN)
float r = sqrt(2-(T(i1,j1)-T(i2,j2))*(T(i1,j1)-T(i2,j2)));
float s = (T(i1,j1)+T(i2,j2)-r)/2;
if (s&=T(i1,j1) && s&=T(i2,j2)) sol =
{ s += if (s&=T(i1,j1) && s&=T(i2,j2))
else sol = 1+T(i1,j1));
else if (f(i2,j2)==KNOWN) sol = 1+T(i2,j2));
贴一个原文中的结果图:

我要回帖

更多关于 mysql insert id替代 的文章

 

随机推荐