Snake模型&&openCV代码

出处:http://blog.csdn.net/hongxingabc/article/details/51606520

       主动轮廓线模型又称为Snake模型,由Kass于1987年提出,它对于在噪声和对比度不敏感,能将目标从复杂背景中分割出来,并能有效的跟踪目标的形变和非刚体的复杂运动而被广泛用于图像分割和物体跟踪等图像处理领域。已广泛应用于数字图像分析和计算机视觉领域。由于Snake模型具有良好的提取和跟踪特定区域内目标轮廓的能力,因此非常适合于医学图像如CT和MR图像的处理,以获得特定器官及组织的轮廓。Snake主要原理是先在待分割图像目标位置附近定义的一个初始轮廓曲线函数,并对其定义个能量函数,通过最小化能量目标函数使轮廓沿能量降低的方向靠近,控制参数曲线变形,当能量函数达到最小的时候,提供的初始轮廓收敛到图形中目标的真实轮廓。

        Snake能量函数是有内部能量函数和外部能量函数组成,内部能量控制轮廓的平滑性和连续性,外部能量由图像能量和约束能量组成,控制轮廓向着实际轮廓收敛,其中约束能量可根据具体的对象形态定义,使得snake具有很大的灵活性。

       Snake模型具有一些经典方法所无法比拟的优点:图像数据、初始估计、目标轮廓及基于知识的约束统一于一个过程中;经适当的初始化后,它能自主地收敛于能量极小值状态;尺度空间中由初到精地极小化能量可以极大地扩展捕获区域和降低复杂性。同时,Snake模型也有其自身的缺点:对初始位置敏感,需要依赖其他机制将Snake放置在感兴趣的图像特征附近,而当图像边缘模糊,目标比较复杂或与其他的物体靠的比较近时,其初始轮廓更不易确定;由于Snake模型的非凸性,它有可能收敛到局部极值点,甚至发散。现有的初始轮廓确定的方法有以下几种:1.人工勾勒图像的边缘    2.序列图像差分边界    3.基于序列图像的前一帧图像边界的预测  4.基于传统图像分割结果进行边界选取。

       Snake模型发展10多年来,许多学者对于经典的snake模型做了改进,提出各种改进的snake模型,其中梯度矢量流(Gradient Vector  Flow,GVF)模型扩大了经典snake的外力作用范围,加强了对目标凹轮廓边缘的吸引力,提高了传统的snake模型。Snake模型主要研究的方面:(1) 表示内部能量的曲线演化;(2) 外力;(3) 能量最小化。

Snake模型的改进算法:

1.Cohen提出的气球(balloon)理论模型:应用压力和高斯能力一起增大吸引范围的方法,该压力可使模型扩大或缩小,因此不再要求将模型初始化在所期望的对象边界附近。在图像的梯度力场上叠加气球里,以使轮廓线作为一个整体进行膨胀或收缩,从而扩大了模型寻找图像特证的范围。

优势:对初始边界不敏感            

存在的缺点:存在弱边界,漏出边界间隙等问题。

2.Xu提出梯度矢量流(GVF)概念,用GVF场代替经典外力场,GVF场可以看做是对图像梯度场得逼近,这不仅使模型捕捉的范围得到了提高,而且能使活动轮廓进入凹陷区。

优势:有良好的收敛性,深入目标边缘的凹陷区域           

存在的缺点:仍不能解决曲线的拓扑变化问题

局部优化算法:

1.Amini提出基于动态规划的snake算法。 2.变分法  3.贪婪算法  4.有限差分法   5.有限元法

全局优化算法:

1.模拟退火     2.遗传算法    3.神经网络

Snake模型的蚁群算法(Ant Colony Optimization)模型

蚁群算法是最近几年有意大利学者M.Dorigo等人首次提出的一种新型的模拟进化算法,称为蚁群系统,蚁群算法通过候选解组成的群体的进化过程来寻求最优解,该过程包括两个基本阶段:适应阶段和协同工作阶段,算法本身采用正反馈原理,加快了进化过程,不易陷入局部最优解,而且个体之间不断进行信息交流和传递,有利于对解空间的进一步探索,因此有很强的发展解的能力。

Snake的进化模型

1.McInerney 提出一种拓扑自适应snake模型(Topology Adaptive  Snake,T-Snake)

该算法基于仿射细胞图像分解(Affine Cell Image  Decomposition,ACID)先在待分割图像上加以三角网格,然后在图像区域的适当位置做一条初始曲线,最后取曲线与网格的交点作为snake的初始离散点,其第i个snake的离散点的坐标为其中,相邻两点,之间由一条弹性样条连接而成

由于T-Snake模型可借助三角形网格和网格点的特征函数来确定边界三角形,可促使snake模型演化过程中的分裂和合并,从而保证了其具有能够处理拓扑结果复杂图像的能力,因此能够很好的满足医学图像拓扑结果复杂的特点。此算法用于脑部MR切片有良好的性能。

2.双T-Snake模型

双T-Snake模型(Dual-T-Snakes)是在T-Snake模型的基础上产生的,其主要思想是采用内外两个初始轮廓,其中一个轮廓从目标外向内收缩和分裂,另一个轮廓从目标内部向外膨胀,两个初始轮廓可以离目标边界较远,迭代的过程中对能量较大的轮廓增加驱动力,使其靠近与之相对应的轮廓,直到连个轮廓收敛到同一个为止

3.Loop  Snake 模型

Loop  Snake模型是一种加强了拓扑控制的T-Snake模型,这种方法的关键集中在曲线的每一步进化中都要形成循环,其基本思想是,确保图像轮廓曲线精确地线性地映射到适当的分类中,然后在额外的记过loop-Tree的帮助下,尽可能少的时间内运用已经被snake探究的循环来决定是否进行区域划分,这种模型的实质是对T-Snake模型的一种改进。由于加强了拓扑控制,使得Loop Snake模型既可以忽略背景中强噪声又可以在演化过程中进行多次分裂。

4.连续snake模型

在Snake模型中,轮廓曲线由一条给定容许误差范围的光滑曲线组成,相对于离散snake来说,连续snake模型所需要的控制点少,比离散的更具优越性。

5.B-Snake模型

B-Snake模型是通过B样条曲线来定义的,其轮廓曲线由各曲线段光滑相连而成,每一个曲线段都是由一个给定次数多项式表示,这种多项式是B样条曲度函数的一种线性组合,并以控制点为系数。在有些B-Snake模型中并没有明确应用内部能量,这是因为B样条本身就含有内部能量,snake轮廓曲线只受外力影响着图像边缘移动。可用于对图像切片分割区域的描述与跟踪而用于器官的三维重建。

 

应用snake的优势:由于生物或人体组织解剖结构的复杂性,以及软组织形状的易变性,那些仅依赖于图像本身的灰度,纹理属性等低层次视觉属性来进行分割的图像分割方法难以获得理想的分割效果,因此医学图像分割迫切需要有一种灵活的框架,能将基于图像本身低层次视觉属性(边缘,纹理,灰度,色彩)和人们对于待分割目标的知识经验,如目标形状的描述,亮度,色彩的经验统计,医生的经验等,可以一种有机的方式整合起来,得到待分割区域的完整表达。


Opencv中snake函数解析及例子:

[cpp] view plain copy
  1. /*M/////////////////////////////////////////////////////////////////////////////////////// 
  2. // 
  3. //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. 
  4. // 
  5. //  By downloading, copying, installing or using the software you agree to this license. 
  6. //  If you do not agree to this license, do not download, install, 
  7. //  copy or use the software. 
  8. // 
  9. // 
  10. //                        Intel License Agreement 
  11. //                For Open Source Computer Vision Library 
  12. // 
  13. // Copyright (C) 2000, Intel Corporation, all rights reserved. 
  14. // Third party copyrights are property of their respective owners. 
  15. // 
  16. // Redistribution and use in source and binary forms, with or without modification, 
  17. // are permitted provided that the following conditions are met: 
  18. // 
  19. //   * Redistribution's of source code must retain the above copyright notice, 
  20. //     this list of conditions and the following disclaimer. 
  21. // 
  22. //   * Redistribution's in binary form must reproduce the above copyright notice, 
  23. //     this list of conditions and the following disclaimer in the documentation 
  24. //     and/or other materials provided with the distribution. 
  25. // 
  26. //   * The name of Intel Corporation may not be used to endorse or promote products 
  27. //     derived from this software without specific prior written permission. 
  28. // 
  29. // This software is provided by the copyright holders and contributors "as is" and 
  30. // any express or implied warranties, including, but not limited to, the implied 
  31. // warranties of merchantability and fitness for a particular purpose are disclaimed. 
  32. // In no event shall the Intel Corporation or contributors be liable for any direct, 
  33. // indirect, incidental, special, exemplary, or consequential damages 
  34. // (including, but not limited to, procurement of substitute goods or services; 
  35. // loss of use, data, or profits; or business interruption) however caused 
  36. // and on any theory of liability, whether in contract, strict liability, 
  37. // or tort (including negligence or otherwise) arising in any way out of 
  38. // the use of this software, even if advised of the possibility of such damage. 
  39. // 
  40. //M*/  
  41. #include "_cv.h"  
  42.    
  43. #define _CV_SNAKE_BIG 2.e+38f  
  44. #define _CV_SNAKE_IMAGE 1  
  45. #define _CV_SNAKE_GRAD  2  
  46.    
  47.    
  48. /*F/////////////////////////////////////////////////////////////////////////////////////// 
  49. //    Name:      icvSnake8uC1R     
  50. //    Purpose:   
  51. //    Context:   
  52. //    Parameters: 
  53. //               src - source image, 
  54. //               srcStep - its step in bytes, 
  55. //               roi - size of ROI, 
  56. //               pt - pointer to snake points array 
  57. //               n - size of points array, 
  58. //               alpha - pointer to coefficient of continuity energy, 
  59. //               beta - pointer to coefficient of curvature energy,  
  60. //               gamma - pointer to coefficient of image energy,  
  61. //               coeffUsage - if CV_VALUE - alpha, beta, gamma point to single value 
  62. //                            if CV_MATAY - point to arrays 
  63. //               criteria - termination criteria. 
  64. //               scheme - image energy scheme 
  65. //                         if _CV_SNAKE_IMAGE - image intensity is energy 
  66. //                         if _CV_SNAKE_GRAD  - magnitude of gradient is energy 
  67. //    Returns:   
  68. //F*/  
  69.    
  70. static CvStatus  
  71. icvSnake8uC1R( unsigned char *src,   //原始图像数据  
  72.                int srcStep,         //每行的字节数  
  73.                CvSize roi,         //图像尺寸  
  74.                CvPoint * pt,       //轮廓点(变形对象)  
  75.                int n,            //轮廓点的个数  
  76.                float *alpha,       //指向α的指针,α可以是单个值,也可以是与轮廓点个数一致的数组  
  77.                float *beta,        //β的值,同α  
  78.                float *gamma,       //γ的值,同α  
  79.                int coeffUsage,   //确定αβγ是用作单个值还是个数组  
  80.         CvSize win,       //每个点用于搜索的最小的领域大小,宽度为奇数  
  81.              CvTermCriteria criteria,   //递归迭代终止的条件准则  
  82. int scheme )         //确定图像能量场的数据选择,1为灰度,2为灰度梯度  
  83. {  
  84.     int i, j, k;  
  85.     int neighbors = win.height * win.width;    //当前点领域中点的个数  
  86.    
  87.    //当前点的位置  
  88.     int centerx = win.width >> 1;            
  89.     int centery = win.height >> 1;           
  90.    
  91.     float invn;        //n 的倒数?  
  92.     int iteration = 0;     //迭代次数  
  93.     int converged = 0;      //收敛标志,0为非收敛  
  94.       
  95.   //能量  
  96.     float *Econt;    //  
  97.     float *Ecurv;   //轮廓曲线能量  
  98.     float *Eimg;    //图像能量  
  99.     float *E;      //  
  100.     
  101.    //αβγ的副本  
  102.     float _alpha, _beta, _gamma;  
  103.    
  104.     /*#ifdef GRAD_SNAKE */  
  105.     float *gradient = NULL;  
  106.     uchar *map = NULL;  
  107.     int map_width = ((roi.width - 1) >> 3) + 1;  
  108.     int map_height = ((roi.height - 1) >> 3) + 1;  
  109.     CvSepFilter pX, pY;  
  110.     #define WTILE_SIZE 8  
  111.     #define TILE_SIZE (WTILE_SIZE + 2)         
  112.     short dx[TILE_SIZE*TILE_SIZE], dy[TILE_SIZE*TILE_SIZE];  
  113.     CvMat _dx = cvMat( TILE_SIZE, TILE_SIZE, CV_16SC1, dx );  
  114.     CvMat _dy = cvMat( TILE_SIZE, TILE_SIZE, CV_16SC1, dy );  
  115.     CvMat _src = cvMat( roi.height, roi.width, CV_8UC1, src );  
  116.    
  117.     /* inner buffer of convolution process */  
  118.     //char ConvBuffer[400];  
  119.    
  120.     /*#endif */  
  121.    
  122.      //检点参数的合理性  
  123.     /* check bad arguments */  
  124.     if( src == NULL )  
  125.         return CV_NULLPTR_ERR;  
  126.     if( (roi.height <= 0) || (roi.width <= 0) )  
  127.         return CV_BADSIZE_ERR;  
  128.     if( srcStep < roi.width )  
  129.         return CV_BADSIZE_ERR;  
  130.     if( pt == NULL )  
  131.         return CV_NULLPTR_ERR;  
  132.     if( n < 3 )                         //轮廓点至少要三个  
  133.         return CV_BADSIZE_ERR;  
  134.     if( alpha == NULL )  
  135.         return CV_NULLPTR_ERR;  
  136.     if( beta == NULL )  
  137.         return CV_NULLPTR_ERR;  
  138.     if( gamma == NULL )  
  139.         return CV_NULLPTR_ERR;  
  140.     if( coeffUsage != CV_VALUE && coeffUsage != CV_ARRAY )  
  141.         return CV_BADFLAG_ERR;  
  142.     if( (win.height <= 0) || (!(win.height & 1)))   //邻域搜索窗口得是奇数  
  143.         return CV_BADSIZE_ERR;  
  144.     if( (win.width <= 0) || (!(win.width & 1)))  
  145.         return CV_BADSIZE_ERR;  
  146.    
  147.     invn = 1 / ((float) n);        //轮廓点数n的倒数,用于求平均?  
  148.    
  149.     if( scheme == _CV_SNAKE_GRAD )  
  150. {  
  151.      //X方向上和Y方向上的Scoble梯度算子,用于求图像的梯度,  
  152. //处理的图像最大尺寸为TILE_SIZE+2,此例为12,算子半长为3即{-3,-2,-1,0,1,2,3}  
  153. //处理后的数据类型为16位符号数,分别存放在_dx,_dy矩阵中,长度为10  
  154.         pX.init_deriv( TILE_SIZE+2, CV_8UC1, CV_16SC1, 1, 0, 3 );  
  155.         pY.init_deriv( TILE_SIZE+2, CV_8UC1, CV_16SC1, 0, 1, 3 );  
  156.        //图像梯度存放缓冲区  
  157.         gradient = (float *) cvAlloc( roi.height * roi.width * sizeoffloat ));  
  158.    
  159.         if( !gradient )  
  160.             return CV_OUTOFMEM_ERR;  
  161.        //map用于标志相应位置的分块的图像能量是否已经求得  
  162.         map = (uchar *) cvAlloc( map_width * map_height );  
  163.         if( !map )  
  164.         {  
  165.             cvFree( &gradient );  
  166.             return CV_OUTOFMEM_ERR;  
  167.         }  
  168.         /* clear map - no gradient computed */  
  169.        //清除map标志  
  170.         memset( (void *) map, 0, map_width * map_height );  
  171. }  
  172. //各种能量的存放处,取每点的邻域的能量  
  173.     Econt = (float *) cvAlloc( neighbors * sizeoffloat ));  
  174.     Ecurv = (float *) cvAlloc( neighbors * sizeoffloat ));  
  175.     Eimg = (float *) cvAlloc( neighbors * sizeoffloat ));  
  176.     E = (float *) cvAlloc( neighbors * sizeoffloat ));  
  177.    //开始迭代  
  178.     while( !converged )    //收敛标志无效时进行  
  179.     {  
  180.         float ave_d = 0;  //轮廓各点的平均距离  
  181.         int moved = 0;      //轮廓变形时,发生移动的数量  
  182.    
  183.         converged = 0;       //标志未收敛  
  184.         iteration++;        //更新迭代次数+1  
  185.    
  186. //计算轮廓中各点的平均距离  
  187.         /* compute average distance */  
  188.       //从点0到点n-1的距离和  
  189.         for( i = 1; i < n; i++ )  
  190.         {  
  191.             int diffx = pt[i - 1].x - pt[i].x;  
  192.             int diffy = pt[i - 1].y - pt[i].y;  
  193.    
  194.             ave_d += cvSqrt( (float) (diffx * diffx + diffy * diffy) );   
  195.         }  
  196.      //再加上从点n-1到点0的距离,形成回路轮廓  
  197.         ave_d += cvSqrt( (float) ((pt[0].x - pt[n - 1].x) *  
  198.                                   (pt[0].x - pt[n - 1].x) +  
  199.                                   (pt[0].y - pt[n - 1].y) * (pt[0].y - pt[n - 1].y)));  
  200.     //求平均,得出平均距离  
  201.         ave_d *= invn;  
  202.         /* average distance computed */  
  203.    
  204.    
  205.       //对于每个轮廓点进行特定循环迭代求解  
  206.         for( i = 0; i < n; i++ )  
  207.         {  
  208.             /* Calculate Econt */  
  209.           //初始化各个能量  
  210.             float maxEcont = 0;  
  211.             float maxEcurv = 0;  
  212.             float maxEimg = 0;  
  213.             float minEcont = _CV_SNAKE_BIG;  
  214.             float minEcurv = _CV_SNAKE_BIG;  
  215.             float minEimg = _CV_SNAKE_BIG;  
  216.             float Emin = _CV_SNAKE_BIG;  
  217.          //初始化变形后轮廓点的偏移量  
  218.             int offsetx = 0;  
  219.             int offsety = 0;  
  220.             float tmp;  
  221.    
  222.         //计算边界  
  223.             /* compute bounds */  
  224.            //计算合理的搜索边界,以防领域搜索超过ROI图像的范围  
  225.             int left = MIN( pt[i].x, win.width >> 1 );  
  226.             int right = MIN( roi.width - 1 - pt[i].x, win.width >> 1 );  
  227.             int upper = MIN( pt[i].y, win.height >> 1 );  
  228.             int bottom = MIN( roi.height - 1 - pt[i].y, win.height >> 1 );  
  229.           //初始化Econt  
  230.             maxEcont = 0;  
  231.             minEcont = _CV_SNAKE_BIG;  
  232.          //在合理的搜索范围内进行Econt的计算  
  233.             for( j = -upper; j <= bottom; j++ )  
  234.             {  
  235.                 for( k = -left; k <= right; k++ )  
  236.                 {  
  237.                     int diffx, diffy;  
  238.                     float energy;  
  239.              //在轮廓点集的首尾相接处作相应处理,求轮廓点差分  
  240.                     if( i == 0 )  
  241.                     {  
  242.                         diffx = pt[n - 1].x - (pt[i].x + k);  
  243.                         diffy = pt[n - 1].y - (pt[i].y + j);  
  244.                     }  
  245.                     else  
  246.              //在其他地方作一般处理  
  247.    
  248.                     {  
  249.                         diffx = pt[i - 1].x - (pt[i].x + k);  
  250.                         diffy = pt[i - 1].y - (pt[i].y + j);  
  251.                     }  
  252.              //将邻域陈列坐标转成Econt数组的下标序号,计算邻域中每点的Econt  
  253.               //Econt的值等于平均距离和此点和上一点的距离的差的绝对值(这是怎么来的?)  
  254.                     Econt[(j + centery) * win.width + k + centerx] = energy =  
  255.                         (float) fabs( ave_d -  
  256.                                       cvSqrt( (float) (diffx * diffx + diffy * diffy) ));  
  257.              //求出所有邻域点中的Econt的最大值和最小值  
  258.                     maxEcont = MAX( maxEcont, energy );  
  259.                     minEcont = MIN( minEcont, energy );  
  260.                 }  
  261.             }  
  262.            //求出邻域点中最大值和最小值之差,并对所有的邻域点的Econt进行标准归一化,若最大值最小  
  263.            //相等,则邻域中的点Econt全相等,Econt归一化束缚为0  
  264.             tmp = maxEcont - minEcont;  
  265.             tmp = (tmp == 0) ? 0 : (1 / tmp);  
  266.             for( k = 0; k < neighbors; k++ )  
  267.             {  
  268.                 Econt[k] = (Econt[k] - minEcont) * tmp;  
  269.             }  
  270.    
  271.    
  272.            //计算每点的Ecurv  
  273.             /*  Calculate Ecurv */  
  274.             maxEcurv = 0;  
  275.             minEcurv = _CV_SNAKE_BIG;  
  276.             for( j = -upper; j <= bottom; j++ )  
  277.             {  
  278.                 for( k = -left; k <= right; k++ )  
  279.                 {  
  280.                     int tx, ty;  
  281.                     float energy;  
  282.                     //第一个点的二阶差分  
  283.                     if( i == 0 )  
  284.                     {  
  285.                         tx = pt[n - 1].x - 2 * (pt[i].x + k) + pt[i + 1].x;  
  286.                         ty = pt[n - 1].y - 2 * (pt[i].y + j) + pt[i + 1].y;  
  287.                     }  
  288.                    //最后一个点的二阶差分  
  289.                     else if( i == n - 1 )  
  290.                     {  
  291.                         tx = pt[i - 1].x - 2 * (pt[i].x + k) + pt[0].x;  
  292.                         ty = pt[i - 1].y - 2 * (pt[i].y + j) + pt[0].y;  
  293.                     }  
  294.                    //其余点的二阶差分  
  295.                     else  
  296.                     {  
  297.                         tx = pt[i - 1].x - 2 * (pt[i].x + k) + pt[i + 1].x;  
  298.                         ty = pt[i - 1].y - 2 * (pt[i].y + j) + pt[i + 1].y;  
  299.                     }  
  300.                   //转换坐标为数组序号,并求各点的Ecurv的值,二阶差分后取平方  
  301.                     Ecurv[(j + centery) * win.width + k + centerx] = energy =  
  302.                         (float) (tx * tx + ty * ty);  
  303.                   //取最小的Ecurv和最大的Ecurv  
  304.                     maxEcurv = MAX( maxEcurv, energy );  
  305.                     minEcurv = MIN( minEcurv, energy );  
  306.                 }  
  307.             }  
  308.                //对Ecurv进行标准归一化  
  309.             tmp = maxEcurv - minEcurv;  
  310.             tmp = (tmp == 0) ? 0 : (1 / tmp);  
  311.             for( k = 0; k < neighbors; k++ )  
  312.             {  
  313.                 Ecurv[k] = (Ecurv[k] - minEcurv) * tmp;  
  314.             }  
  315.            
  316.            //求Eimg  
  317.             /* Calculate Eimg */  
  318.             for( j = -upper; j <= bottom; j++ )  
  319.             {  
  320.                 for( k = -left; k <= right; k++ )  
  321.                 {  
  322.                     float energy;  
  323.                //若采用灰度梯度数据  
  324.                     if( scheme == _CV_SNAKE_GRAD )  
  325.                     {  
  326.                         /* look at map and check status */  
  327.                         int x = (pt[i].x + k)/WTILE_SIZE;  
  328.                         int y = (pt[i].y + j)/WTILE_SIZE;  
  329.                         //若此处的图像能量还没有获取,则对此处对应的图像分块进行图像能量的求解  
  330.                         if( map[y * map_width + x] == 0 )  
  331.                         {  
  332.                             int l, m;                             
  333.    
  334.                             /* evaluate block location */  
  335.                            //计算要进行梯度算子处理的图像块的位置  
  336.                             int upshift = y ? 1 : 0;  
  337.                             int leftshift = x ? 1 : 0;  
  338.                             int bottomshift = MIN( 1, roi.height - (y + 1)*WTILE_SIZE );  
  339.                             int rightshift = MIN( 1, roi.width - (x + 1)*WTILE_SIZE );  
  340.                           //图像块的位置大小(由于原ROI不一定是8的倍数,所以图像块会大小不一)  
  341.                             CvRect g_roi = { x*WTILE_SIZE - leftshift, y*WTILE_SIZE - upshift,  
  342.                                 leftshift + WTILE_SIZE + rightshift, upshift + WTILE_SIZE + bottomshift };  
  343.                             CvMat _src1;  
  344.                             cvGetSubArr( &_src, &_src1, g_roi );  //得到图像块的数据  
  345.                             //分别对图像的X方向和Y方向进行梯度算子  
  346.                             pX.process( &_src1, &_dx );  
  347.                             pY.process( &_src1, &_dy );  
  348.                          //求分块区域中的每个点的梯度  
  349.                             for( l = 0; l < WTILE_SIZE + bottomshift; l++ )  
  350.                             {  
  351.                                 for( m = 0; m < WTILE_SIZE + rightshift; m++ )  
  352.                                 {  
  353.                                     gradient[(y*WTILE_SIZE + l) * roi.width + x*WTILE_SIZE + m] =  
  354.                                         (float) (dx[(l + upshift) * TILE_SIZE + m + leftshift] *  
  355.                                                  dx[(l + upshift) * TILE_SIZE + m + leftshift] +  
  356.                                                  dy[(l + upshift) * TILE_SIZE + m + leftshift] *  
  357.                                                  dy[(l + upshift) * TILE_SIZE + m + leftshift]);  
  358.                                 }  
  359.                             }  
  360.                             //map相应位置置1表示此处图像能量已经获取  
  361.                             map[y * map_width + x] = 1;  
  362.                         }  
  363.                       //以梯度数据作为图像能量  
  364.                         Eimg[(j + centery) * win.width + k + centerx] = energy =  
  365.                             gradient[(pt[i].y + j) * roi.width + pt[i].x + k];  
  366.                     }  
  367.                     else  
  368.                     {  
  369.                        //以灰度作为图像能量  
  370.                         Eimg[(j + centery) * win.width + k + centerx] = energy =  
  371.                             src[(pt[i].y + j) * srcStep + pt[i].x + k];  
  372.                     }  
  373.                    //获得邻域中最大和最小的图像能量  
  374.                     maxEimg = MAX( maxEimg, energy );  
  375.                     minEimg = MIN( minEimg, energy );  
  376.                 }  
  377.             }  
  378.               //Eimg的标准归一化  
  379.             tmp = (maxEimg - minEimg);  
  380.             tmp = (tmp == 0) ? 0 : (1 / tmp);  
  381.    
  382.             for( k = 0; k < neighbors; k++ )  
  383.             {  
  384.                 Eimg[k] = (minEimg - Eimg[k]) * tmp;  
  385.             }  
  386.             //加入系数  
  387.             /* locate coefficients */  
  388.             if( coeffUsage == CV_VALUE)  
  389.             {  
  390.                 _alpha = *alpha;  
  391.                 _beta = *beta;  
  392.                 _gamma = *gamma;  
  393.             }  
  394.             else  
  395.             {                    
  396.                 _alpha = alpha[i];  
  397.                 _beta = beta[i];  
  398.                 _gamma = gamma[i];  
  399.             }  
  400.    
  401.             /* Find Minimize point in the neighbors */  
  402.             //求得每个邻域点的Snake能量  
  403.             for( k = 0; k < neighbors; k++ )  
  404.             {  
  405.                 E[k] = _alpha * Econt[k] + _beta * Ecurv[k] + _gamma * Eimg[k];  
  406.             }  
  407.             Emin = _CV_SNAKE_BIG;  
  408.         //获取最小的能量,以及对应的邻域中的相对位置  
  409.             for( j = -upper; j <= bottom; j++ )  
  410.             {  
  411.                 for( k = -left; k <= right; k++ )  
  412.                 {  
  413.    
  414.                     if( E[(j + centery) * win.width + k + centerx] < Emin )  
  415.                     {  
  416.                         Emin = E[(j + centery) * win.width + k + centerx];  
  417.                         offsetx = k;  
  418.                         offsety = j;  
  419.                     }  
  420.                 }  
  421.             }  
  422.          //如果轮廓点发生改变,则记得移动次数  
  423.             if( offsetx || offsety )  
  424.             {  
  425.                 pt[i].x += offsetx;  
  426.                 pt[i].y += offsety;  
  427.                 moved++;  
  428.             }  
  429.         }  
  430.    
  431.       //各个轮廓点迭代计算完成后,如果没有移动的点了,则收敛标志位有效,停止迭代  
  432.         converged = (moved == 0);  
  433.      //达到最大迭代次数时,收敛标志位有效,停止迭代  
  434.         if( (criteria.type & CV_TERMCRIT_ITER) && (iteration >= criteria.max_iter) )  
  435.             converged = 1;  
  436.   //到大相应精度时,停止迭代(与第一个条件有相同效果)  
  437.         if( (criteria.type & CV_TERMCRIT_EPS) && (moved <= criteria.epsilon) )  
  438.             converged = 1;  
  439.     }  
  440.    
  441.   //释放各个缓冲区  
  442.     cvFree( &Econt );  
  443.     cvFree( &Ecurv );  
  444.     cvFree( &Eimg );  
  445.     cvFree( &E );  
  446.    
  447.     if( scheme == _CV_SNAKE_GRAD )  
  448.     {  
  449.         cvFree( &gradient );  
  450.         cvFree( &map );  
  451.     }  
  452.     return CV_OK;  
  453. }  
  454.    
  455.    
  456. CV_IMPL void  
  457. cvSnakeImage( const IplImage* src, CvPoint* points,  
  458.               int length, float *alpha,  
  459.               float *beta, float *gamma,  
  460.               int coeffUsage, CvSize win,  
  461.               CvTermCriteria criteria, int calcGradient )  
  462. {  
  463.    
  464.     CV_FUNCNAME( "cvSnakeImage" );  
  465.    
  466.     __BEGIN__;  
  467.    
  468.     uchar *data;  
  469.     CvSize size;  
  470.     int step;  
  471.    
  472.     if( src->nChannels != 1 )  
  473.         CV_ERROR( CV_BadNumChannels, "input image has more than one channel" );  
  474.    
  475.     if( src->depth != IPL_DEPTH_8U )  
  476.         CV_ERROR( CV_BadDepth, cvUnsupportedFormat );  
  477.    
  478.     cvGetRawData( src, &data, &step, &size );  
  479.    
  480.     IPPI_CALL( icvSnake8uC1R( data, step, size, points, length,  
  481.                               alpha, beta, gamma, coeffUsage, win, criteria,  
  482.                               calcGradient ? _CV_SNAKE_GRAD : _CV_SNAKE_IMAGE ));  
  483.     __END__;  
  484. }  
  485.    
  486. /* end of file */  
  487.    
  488.    
  489.    
  490.    
  491.    
  492. 测试应用程序  
  493.    
  494. #include "stdafx.h"  
  495. #include <iostream>  
  496. #include <string.h>  
  497. #include <cxcore.h>  
  498. #include <cv.h>  
  499. #include <highgui.h>  
  500. #include <fstream>  
  501.    
  502.    
  503. IplImage *image = 0 ; //原始图像  
  504. IplImage *image2 = 0 ; //原始图像copy  
  505.    
  506. using namespace std;  
  507. int Thresholdness = 141;  
  508. int ialpha = 20;  
  509. int ibeta=20;  
  510. int igamma=20;  
  511.    
  512. void onChange(int pos)  
  513. {  
  514.      
  515.     if(image2) cvReleaseImage(&image2);  
  516.     if(image) cvReleaseImage(&image);  
  517.    
  518.     image2 = cvLoadImage("grey.bmp",1); //显示图片  
  519.     image= cvLoadImage("grey.bmp",0);  
  520.    
  521.     cvThreshold(image,image,Thresholdness,255,CV_THRESH_BINARY); //分割域值     
  522.    
  523.     CvMemStorage* storage = cvCreateMemStorage(0);  
  524.     CvSeq* contours = 0;  
  525.    
  526.     cvFindContours( image, storage, &contours, sizeof(CvContour), //寻找初始化轮廓  
  527.         CV_RETR_EXTERNAL , CV_CHAIN_APPROX_SIMPLE );  
  528.    
  529.     if(!contours) return ;  
  530.     int length = contours->total;     
  531.     if(length<10) return ;  
  532.     CvPoint* point = new CvPoint[length]; //分配轮廓点  
  533.    
  534.     CvSeqReader reader;  
  535.     CvPoint pt= cvPoint(0,0);;     
  536.     CvSeq *contour2=contours;     
  537.    
  538.     cvStartReadSeq(contour2, &reader);  
  539.     for (int i = 0; i < length; i++)  
  540.     {  
  541.         CV_READ_SEQ_ELEM(pt, reader);  
  542.         point[i]=pt;  
  543.     }  
  544.     cvReleaseMemStorage(&storage);  
  545.    
  546.     //显示轮廓曲线  
  547.     for(int i=0;i<length;i++)  
  548.     {  
  549.         int j = (i+1)%length;  
  550.         cvLine( image2, point[i],point[j],CV_RGB( 0, 0, 255 ),1,8,0 );  
  551.     }  
  552.    
  553.     float alpha=ialpha/100.0f;  
  554.     float beta=ibeta/100.0f;  
  555.     float gamma=igamma/100.0f;  
  556.    
  557.     CvSize size;  
  558.     size.width=3;  
  559.     size.height=3;  
  560.     CvTermCriteria criteria;  
  561.     criteria.type=CV_TERMCRIT_ITER;  
  562.     criteria.max_iter=1000;  
  563.     criteria.epsilon=0.1;  
  564.     cvSnakeImage( image, point,length,&alpha,&beta,&gamma,CV_VALUE,size,criteria,0 );  
  565.    
  566.     //显示曲线  
  567.     for(int i=0;i<length;i++)  
  568.     {  
  569.         int j = (i+1)%length;  
  570.         cvLine( image2, point[i],point[j],CV_RGB( 0, 255, 0 ),1,8,0 );  
  571.     }  
  572.     delete []point;  
  573.    
  574. }  
  575.    
  576. int main(int argc, char* argv[])  
  577. {  
  578.    
  579.      
  580.     cvNamedWindow("win1",0);  
  581.     cvCreateTrackbar("Thd""win1", &Thresholdness, 255, onChange);  
  582.     cvCreateTrackbar("alpha""win1", &ialpha, 100, onChange);  
  583.     cvCreateTrackbar("beta""win1", &ibeta, 100, onChange);  
  584.     cvCreateTrackbar("gamma""win1", &igamma, 100, onChange);  
  585.     cvResizeWindow("win1",300,500);  
  586.     onChange(0);  
  587.    
  588.     for(;;)  
  589.     {  
  590.         if(cvWaitKey(40)==27) break;  
  591.         cvShowImage("win1",image2);  
  592.     }  
  593.      
  594.     return 0;  

本文由以下两篇博客整理得到:

http://blog.csdn.net/lbd2008/article/details/7180506

http://chyyeng.blog.163.com/blog/static/16918230201272724529214/

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. Shiro教程(八)Shiro Freemarker标签的使用。

    Shiro 提供了JSP 的一套JSTL 标签,用于做JSP 页面做权限控制的。可以控制一些按钮和一些超链接,或者一些显示内容。JSP 的下篇文章会讲到,这篇先讲讲 Freemarker 的 Shiro 标签。引用包:<!-- freemarker + shiro(标签) begin --><dependency><groupId&…...

    2024/4/14 22:02:06
  2. 几种经典的网络服务器架构模型的分析与比较

    事件驱动为广大的程序员所熟悉,其最为人津津乐道的是在图形化界面编程中的应用;事实上,在网络编程中事件驱动也被广泛使用,并大规模部署在高连接数高吞吐量的服务器程序中,如 http 服务器程序、ftp 服务器程序等。相比于传统的网络编程方式,事件驱动能够极大的降低资源占…...

    2024/4/17 7:35:12
  3. VMware12版虚拟机怎么安装win7系统(win7镜像ios安装版)

    VMware12版虚拟机怎么安装win7系统(详细教程) 现 在很多人都会在虚拟机上体验不同的系统,可是很多时候我们并不能非常顺利的安装好系统,这中间经常会出现很多差错,导致我们安装不上,比如在虚拟机上安装 win7系统,很多人发现安装的时候总是会跳到工具箱中去,导致根本不能…...

    2024/4/27 1:48:33
  4. matlab二进制十进制十六进制和任意进制之间的转换

    >> a=bin2dec(1011001) %将二进制转换为10进制a = 89>> b=dec2bin(22) %将10进制转换为2进制b =10110>> c=hex2dec(9B3C) %将16进制转换为10进制c = 39740>> d=dec2hex(97) %将10进制转换为16进制d =61>> e=base2dec(212,3) %将任…...

    2024/4/18 12:41:37
  5. 第一次IPC捣乱

    1、先扫出139端口开放,且密码为空的机子2、建立空连接 net use //192.168.1.67/ipc$ ""/user:"administrator"3、telnet登录 telnet 192.168.1.67 514、几个有用的命令 net share sharename=d:/ net share sharename /delete copy srv.exe //19…...

    2024/4/14 22:38:16
  6. Snake模型综合介绍

    Snake模型背景及应用 Snake模型称为动态轮廓模型(Active Contour Model)是Kass与1987年提出的,它对于在噪声和对比度不敏感,能将目标从复杂背景中分割出来,并能有效的跟踪目标的形变和非刚体的复杂运动而被广泛用于图像分割和物体跟踪等图像处理领域。 Snake主要原理是先…...

    2024/4/20 12:52:53
  7. 16进制字符串转换成10进制数据

    //16进制字符串转换成10进制数据 #include "stdafx.h" #include <string.h> bool IsValidateStr16(const char *str); int StrToNumber16(const char *str); int Char16ToInt(char c);int main(int argc, char* argv[]) {int num;char str[] = "00Ff"…...

    2024/4/17 23:57:42
  8. shiro

    一:Shiro1.shiro是一个安全框架 使用shiro可以非常容易开发出足够好的应用,可以帮助我们完成:认证 授权 加密 会话管理 与web集成 缓存等。2.Shiro的三个核心组件*Subject:即”当前操作用户“,但在shiro中不仅仅指人还指第三方进程 后台账户 或其他类似事物。仅仅意味着”…...

    2024/4/16 2:19:09
  9. 12、渗透测试笔记_信息收集 20191014

    1、域名信息对应ip收集相关域名对应ip,相关工具:nslookup,一些工具网站子域名收集工具:layer、subDomainsBrutewhois(注册人)信息查询根据已知域名反查,分析出此域名的注册人、邮箱、电话等; 工具:爱站网、站长之家、微步在线 site.ip138.com、searchdns.netcraft.com…...

    2024/4/25 10:08:02
  10. NTP服务器同步本地时间(WinForm)

    WinForm实现从NTP服务器自动同步本地时间,并且能够自动检测计算机设置的时区是否为中国,若不是,则提示是否更改时区。并且可以通过相关设置,实现一键式自动同步本地时间。代码下载:点击打开链接1. 主界面:2. 单击右侧的【扩展】按钮,显示日志栏;再次单击右侧的【扩展】…...

    2024/4/14 22:38:11
  11. 安装WIN7加载识别USB3.0驱动的解决办法

    主要原因是Intel新平台不再对USB 2.0提供支持,可以使用下面方法添加 USB3.0 驱动。 方法一:1.华硕主板 (1)下载win7原版镜像iso。 (2)进入华硕的官网 http://www.asus.com.cn 找到主板型号以Z170-K为例 选择驱动程序和工具软件 选择常用系统 WIN7 64位。公用程序中找到如…...

    2024/4/14 22:38:10
  12. 使用van-cli创建项目

    使用van-cli创建项目 https://www.cnblogs.com/jiangxiangit/p/10992007.html...

    2024/4/16 9:39:21
  13. itk中的图像分割算法(一)

    本文要记录的是图像分割中的经典:Snake。简单分割算法关注的是局部信息,忽略了图像的纹理结构、位置等信息,而Snake模型可以将局部特征和全局特征相结合。 Snake简介: Snake的思路就是将目标图像的边缘检测转变为求解能量泛函最小值的过程。这类算法需要给出初始的轮廓,然…...

    2024/4/14 22:38:08
  14. 咨询关于以下电路的作用?

    这个电路的作用是滤波吗...

    2024/4/25 2:10:44
  15. 怎么看服务器网络带宽?该怎样选择服务器的网络带宽和流量?

    一、在这里首先和大家介绍一下带宽是什么: 带宽是决定主机访问速度的重要因素之一,尤其是对于访问量大的网站,网络带宽的大小显得尤为重要。带宽指的是在单位时间内可以传输的数据总量。 二、那如何查看服务器的网络带宽呢: 1.利用文件下载测试 下载文件,一般情况下载速度…...

    2024/4/16 2:19:40
  16. 几个10进制和16进制之间转化的函数

    只是粗略的写了写,希望能够起到抛砖引玉的作用 以下在模块: Option ExplicitPrivate Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)10进制到16进制数组Public Sub mDec2HexA…...

    2024/4/19 8:43:05
  17. Shiro教程(九)Shiro JSP标签的使用。

    Shiro 提供了 JSP 的一套 JSTL 标签,用于做 JSP 页面做权限控制的。可以控制一些按钮和一些超链接,或者一些显示内容。Freemarker Shiro标签讲解:https://blog.csdn.net/baidu_37366055/article/details/88072120其实标签都是和Freemarker Shiro标签对应的,只不过是把@…...

    2024/4/14 22:38:05
  18. win7下安装配置coursera课程文件批量下载工具

    安装环境:win7 ultimate 64位(这个安装过程对32位也适用) Github上的coursera课程下载工具有详细的配置安装过程,在windows上其实也是大同小异,闲话少说,开始安装: 1.安装Python2.7.3从这里下载Python2.7.3对应安装包,双击进行安装,并将python安装目录加入到系统的环境变…...

    2024/4/24 1:33:46
  19. 28. 各类信息收集手段

    1、域名信息对应ip收集 相关域名对应ip,相关工具:nslookup,一些工具网站子域名收集 工具:layer、subDomainsBrutewhois(注册人)信息查询根据已知域名反查,分析出此域名的注册人、邮箱、电话等; 工具:爱站网、站长之家、微步在线 site.ip138.com、searchdns.netcraft.c…...

    2024/4/14 22:02:13
  20. git推送多个仓库的config文件配置

    [core]repositoryformatversion = 0filemode = falsebare = falselogallrefupdates = truesymlinks = falseignorecase = true [remote "origin"]url = 这里填你推送代码和拉取代码的仓库1链接,会推送到仓库1,并且拉取代码从仓库1拉取pushurl = 这里填仓库2的git链…...

    2024/4/14 22:02:11

最新文章

  1. C语言:文件操作(上)

    片头 嗨&#xff01;小伙伴们&#xff0c;今天我们来学习新的知识----文件操作&#xff0c;准备好了吗&#xff1f;我要开始咯! 目录 1. 为什么使用文件&#xff1f; 2. 什么是文件&#xff1f; 3. 二进制文件和文本文件&#xff1f; 4. 文件的打开和关闭 5. 文件顺序读写…...

    2024/5/3 21:26:28
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 基于AI智能识别技术的智慧展览馆视频监管方案设计

    一、建设背景 随着科技的不断进步和社会安全需求的日益增长&#xff0c;展览馆作为展示文化、艺术和科技成果的重要场所&#xff0c;其安全监控系统的智能化升级已成为当务之急。为此&#xff0c;旭帆科技&#xff08;TSINGSEE青犀&#xff09;基于视频智能分析技术推出了展览…...

    2024/4/30 17:11:11
  4. Dapr(一) 基于云原生了解Dapr

    (这期先了解Dapr&#xff0c;之后在推出如何搭建Dapr&#xff0c;以及如何使用。Dapr(二) 分布式应用运行时搭建及服务调用--Dapr(二) 分布式应用运行时搭建及服务调用-CSDN博客) 目录 引言&#xff1a; Service Mesh定义 Service Mesh解决的痛点 Istio介绍 Service Mes…...

    2024/4/30 16:34:16
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/2 16:16:39
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/2 9:28:15
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/2 15:04:34
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/2 9:07:46
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57