计算机视觉
图像处理

【图像处理】图像像素随机化:雪花漫天飞

近来经常和心理系做实验,总是有各种“什么什么随机化,刺激的物理性质保持一样。。”的需求。之前做《【图像处理】双眼去掩蔽 》的实验时,有一套图片就是做的像素随机化,这是最简单的随机化了。当时图像只有两种像素,灰的和深灰的,而且深灰的比较少。

于是我就统计了深灰像素点的个数,然后在一张同样大的灰色图片中的随机位置洒深灰像素点。

  1. int pix_count=0;
  2.     for(int i=0;i<img_width+eye_shift;i++){
  3.         uchar* p=sub_masker.ptr<uchar>(i);
  4.         for(int j=0;j<img_width+eye_shift;j++){
  5.             if(p[j*3]==78){
  6.                 pix_count++;
  7.             }
  8.         }
  9.     }
  10.     //cout<<pix_count<<endl;
  11.     int pix_width=img_width+eye_shift;
  12.     while(pix_count>0){
  13.         int rand_x=rand()%pix_width;
  14.         int rand_y=rand()%pix_width;
  15.         uchar* p_pix=pix_masker.ptr<uchar>(rand_x);
  16.         if(p_pix[rand_y*3]==128){
  17.             p_pix[rand_y*3]=78;
  18.             p_pix[rand_y*3+1]=78;
  19.             p_pix[rand_y*3+2]=78;
  20.             pix_count–;
  21.             //  cout<<pix_count<<endl;
  22.         }
  23.     }
大致效果如上图(*忽略几个字母,是叠加了目标刺激的效果)。
但这次需要对一个刺激视频中每一帧做随机化,且视频是彩色的。
我一开始的思路是对像素中每一个点,随机找另外一个点交换他们的RGB值。
  1. Mat frame_copy(frame_rows,fram_cols, CV_8UC3,Scalar(0,0,0));
  2. frame.copyTo(frame_copy);
  3. Mat frame_tag=Mat::zeros(frame_rows,fram_cols, CV_8UC1);
  4. for(int i=0;i<frame_rows;i++){
  5.     uchar* p=frame_copy.ptr<uchar>(i);
  6.     for(int j=0;j<fram_cols;j+=3){
  7.         uchar r=p[0];
  8.         uchar b=p[1];
  9.         uchar g=p[2];
  10.         int rand_row=rand()%frame_rows;
  11.         int rand_col=rand()%fram_cols;
  12.     //  cout<<rand_row<<” “<<rand_col<<endl;
  13.         uchar* rand_p=frame_copy.ptr<uchar>(rand_row);
  14.         p[0]=rand_p[rand_col*3+0];
  15.         p[1]=rand_p[rand_col*3+1];
  16.         p[2]=rand_p[rand_col*3+2];
  17.         rand_p[rand_col*3+0]=r;
  18.         rand_p[rand_col*3+1]=b;
  19.         rand_p[rand_col*3+2]=g;
  20.     }
  21. }

但不知为何,实现出来的效果是这样的。。。

莫不是因为每个点都被随机了,在后面的时候又以一定的概率被随机回去了???
于是还是改成了原来撒点的思路,对应新建一幅一样大的黑色图,逐点读取原图的像素点,如果遇到非黑色的点,就在新图随机找一个黑色的(也就是未被修改过的点)修改像素值为原图中此点的像素值。
完整代码:
  1. int main(){
  2.     VideoCapture inputVideo(“情绪学习.wmv”);
  3.     if ( !inputVideo.isOpened()){
  4.         cout << “Could not open the input video.”  << endl;
  5.         return -1;
  6.     }
  7.     Size S = Size((int) inputVideo.get(CV_CAP_PROP_FRAME_WIDTH), //Acquire input size
  8.         (int) inputVideo.get(CV_CAP_PROP_FRAME_HEIGHT));
  9.     int ex = static_cast<int>(inputVideo.get(CV_CAP_PROP_FOURCC)); // Get Codec Type- Int form
  10.     VideoWriter outputVideo; // Open the output
  11.     outputVideo.open(“ZhongXing.wmv”,CV_FOURCC(‘M’,‘J’,‘P’,‘G’), 30,S, true);
  12.     srand((unsigned)time(NULL));
  13.     int frame_count=0;
  14.     while(true){
  15.         Mat frame;
  16.         inputVideo>>frame;
  17.         if(frame.empty())
  18.             break;
  19.         int frame_rows=frame.rows;
  20.         int fram_cols=frame.cols;
  21.         Mat frame_copy(frame_rows,fram_cols, CV_8UC3,Scalar(0,0,0));
  22.         Mat frame_tag=Mat::zeros(frame_rows,fram_cols, CV_8UC1);
  23.         for(int i=0;i<frame_rows;i++){
  24.             uchar* p_frame=frame.ptr<uchar>(i);
  25.             for(int j=0;j<fram_cols;j+=3){
  26.                 uchar r=p_frame[j+0];
  27.                 uchar b=p_frame[j+1];
  28.                 uchar g=p_frame[j+2];
  29.                 if((r>0)||(b>0)||(g>0)){
  30.                     bool if_tag=false;
  31.                     while(!if_tag){
  32.                         int rand_row=rand()%frame_rows;
  33.                         int rand_col=rand()%fram_cols;
  34.                         uchar* p_tag=frame_tag.ptr<uchar>(rand_row);
  35.                         uchar* p_copy=frame_copy.ptr<uchar>(rand_row);
  36.                         if(p_tag[rand_col]==1)
  37.                             continue;
  38.                         else{
  39.                             p_tag[rand_col]=1;
  40.                             p_copy[rand_col*3+0]=r;
  41.                             p_copy[rand_col*3+1]=b;
  42.                             p_copy[rand_col*3+2]=g;
  43.                             if_tag=true;
  44.                         }
  45.                     }
  46.                 }
  47.             }
  48.         }
  49.         cout<<“Write frame: “<<frame_count++<<endl;
  50.         outputVideo<<frame_copy;
  51.     }
  52.     cout<<“Finished Writing”<<endl;
  53.     return 0;
  54. }

然后就实现了漫天飞舞的随机雪花效果啦~

转载注明来源:CV视觉网 » 【图像处理】图像像素随机化:雪花漫天飞

分享到:更多 ()
扫描二维码,给作者 打赏
pay_weixinpay_weixin

请选择你看完该文章的感受:

0不错 0超赞 0无聊 0扯淡 0不解 0路过

评论 6

评论前必须登录!