以前我用Matlab实现矩阵arnold置乱是这样的:
 for t=1:10
 for a=1:256
 for b=1:256
 h(mod(a+b,256)+1, mod(a+2*b,256)+1)=j(a,b);
 end
 end
 j=h;
 end
相当于循环把一个矩阵内容赋值给新矩阵的不同位置上,可是现在我需要用opencv中cvMat型矩阵实现这种置乱该如何写呢?求教具体代码……

解决方案 »

  1.   

    上一页  目 录  下一页RandArr
     
     
    RandArr
    用随机数填充数组并更新 RNG 状态 void cvRandArr( CvRNG* rng, CvArr* arr, int dist_type, CvScalar param1, CvScalar param2 );
    rng 
    被 cvRNG 初始化的 RNG 状态. 
    arr 
    输出数组 
    dist_type 
    分布类型: 
    CV_RAND_UNI - 均匀分布 
    CV_RAND_NORMAL - 正态分布 或者 高斯分布 
    param1 
    分布的第一个参数。如果是均匀分布它是随机数范围的闭下边界。如果是正态分布它是随机数的平均值。 
    param2 
    分布的第二个参数。如果是均匀分布它是随机数范围的开上边界。如果是正态分布它是随机数的标准差。 
    函数 cvRandArr 用均匀分布的或者正态分布的随机数填充输出数组。在下面的例子中该函数被用来添加一些正态分布的浮点数到二维数组的随机位置。 /* let's noisy_screen be the floating-point 2d array that is to be "crapped" */
    CvRNG rng_state = cvRNG(0xffffffff);
    int i, pointCount = 1000;
    /* allocate the array of coordinates of points */
    CvMat* locations = cvCreateMat( pointCount, 1, CV_32SC2 );
    /* arr of random point values */
    CvMat* values = cvCreateMat( pointCount, 1, CV_32FC1 );
    CvSize size = cvGetSize( noisy_screen );cvRandInit( &rng_state,
                0, 1, /* 现在使用虚参数以后再调整 */
                0xffffffff /*这里使用一个确定的种子  */,
                CV_RAND_UNI /* 指定为均匀分布类型 */ );/* 初始化 locations */
    cvRandArr( &rng_state, locations, CV_RAND_UNI, cvScalar(0,0,0,0), cvScalar(size.width,size.height,0,0) );/* modify RNG to make it produce normally distributed values */
    rng_state.disttype = CV_RAND_NORMAL;
    cvRandSetRange( &rng_state,
                    30 /* deviation */,
                    100 /* average point brightness */,
                    -1 /* initialize all the dimensions */ );
    /* generate values */
    cvRandArr( &rng_state, values, CV_RAND_NORMAL,
               cvRealScalar(100), // average intensity
               cvRealScalar(30) // deviation of the intensity
              );/* set the points */
    for( i = 0; i < pointCount; i++ )
    {
        CvPoint pt = *(CvPoint*)cvPtr1D( locations, i, 0 );
        float value = *(float*)cvPtr1D( values, i, 0 );
        *((float*)cvPtr2D( noisy_screen, pt.y, pt.x, 0 )) += value;
    }/* not to forget to release the temporary arrays */
    cvReleaseMat( &locations );
    cvReleaseMat( &values );/* RNG state does not need to be deallocated */
        
     
     
    收录时间:2007年7月18日,16点16分
    编辑时间:2007年7月18日,16点16分 
      

  2.   

    上一页  目 录  下一页RandShuffle
     
     
    RandShuffle
    随机交换数组的元素 void cvRandShuffle( CvArr* mat, CvRNG* rng, double iter_factor=1.);
    mat 
    输入的矩阵,用来被随机处理. 
    rng 
    随机数产生器用来随机交换数组元素.如果为NULL,一个当前的随机数发生器将被创建与使用. 
    iter_factor 
    相关的参数,用来刻划交换操作的密度.请看下面的说明. 
    这个函数在每个反复的操作中交换随机选择的矩阵里面的元素(在多通道的数组里面每个元素可能包括若干个部分),反复的次数(也就是交换的对数)等于round(iter_factor*rows(mat)*cols(mat)), 因此如果iter_factor=0,没有交换产生,如果等于1意味着随机交换了rows(mat)*cols(mat)对数.  
     
    收录时间:2007年7月18日,15点52分
    编辑时间:2007年7月18日,15点52分