近来经常和心理系做实验,总是有各种“什么什么随机化,刺激的物理性质保持一样。。”的需求。之前做《去掩蔽》的实验时,有一套图片就是做的像素随机化,这是最简单的随机化了。当时图像只有两种像素,灰的和深灰的,而且深灰的比较少。
于是我就统计了深灰像素点的个数,然后在一张同样大的灰色图片中的随机位置洒深灰像素点。
int pix_count=0;
for(int i=0;i<img_width+eye_shift;i++){
uchar* p=sub_masker.ptr<uchar>(i);
for(int j=0;j<img_width+eye_shift;j++){
if(p[j*3]==78){
pix_count++;
}
}
}
//cout<<pix_count<<endl;
int pix_width=img_width+eye_shift;
while(pix_count>0){
int rand_x=rand()%pix_width;
int rand_y=rand()%pix_width;
uchar* p_pix=pix_masker.ptr<uchar>(rand_x);
if(p_pix[rand_y*3]==128){
p_pix[rand_y*3]=78;
p_pix[rand_y*3+1]=78;
p_pix[rand_y*3+2]=78;
pix_count--;
// cout<<pix_count<<endl;
}
}
大致效果如上图(*忽略几个字母,是叠加了目标刺激的效果)。
但这次需要对一个刺激视频中每一帧做随机化,且视频是彩色的。
我一开始的思路是对像素中每一个点,随机找另外一个点交换他们的RGB值。
Mat frame_copy(frame_rows,fram_cols, CV_8UC3,Scalar(0,0,0));
frame.copyTo(frame_copy);
Mat frame_tag=Mat::zeros(frame_rows,fram_cols, CV_8UC1);
for(int i=0;i<frame_rows;i++){
uchar* p=frame_copy.ptr<uchar>(i);
for(int j=0;j<fram_cols;j+=3){
uchar r=p[0];
uchar b=p[1];
uchar g=p[2];
int rand_row=rand()%frame_rows;
int rand_col=rand()%fram_cols;
// cout<<rand_row<<" "<<rand_col<<endl;
uchar* rand_p=frame_copy.ptr<uchar>(rand_row);
p[0]=rand_p[rand_col*3+0];
p[1]=rand_p[rand_col*3+1];
p[2]=rand_p[rand_col*3+2];
rand_p[rand_col*3+0]=r;
rand_p[rand_col*3+1]=b;
rand_p[rand_col*3+2]=g;
}
}
但不知为何,实现出来的效果是这样的。。。
莫不是因为每个点都被随机了,在后面的时候又以一定的概率被随机回去了???
于是还是改成了原来撒点的思路,对应新建一幅一样大的黑色图,逐点读取原图的像素点,如果遇到非黑色的点,就在新图随机找一个黑色的(也就是未被修改过的点)修改像素值为原图中此点的像素值。
完整代码:
int main(){
VideoCapture inputVideo("情绪学习.wmv");
if ( !inputVideo.isOpened()){
cout << "Could not open the input video." << endl;
return -1;
}
Size S = Size((int) inputVideo.get(CV_CAP_PROP_FRAME_WIDTH), //Acquire input size
(int) inputVideo.get(CV_CAP_PROP_FRAME_HEIGHT));
int ex = static_cast<int>(inputVideo.get(CV_CAP_PROP_FOURCC)); // Get Codec Type- Int form
VideoWriter outputVideo; // Open the output
outputVideo.open("ZhongXing.wmv",CV_FOURCC('M','J','P','G'), 30,S, true);
srand((unsigned)time(NULL));
int frame_count=0;
while(true){
Mat frame;
inputVideo>>frame;
if(frame.empty())
break;
int frame_rows=frame.rows;
int fram_cols=frame.cols;
Mat frame_copy(frame_rows,fram_cols, CV_8UC3,Scalar(0,0,0));
Mat frame_tag=Mat::zeros(frame_rows,fram_cols, CV_8UC1);
for(int i=0;i<frame_rows;i++){
uchar* p_frame=frame.ptr<uchar>(i);
for(int j=0;j<fram_cols;j+=3){
uchar r=p_frame[j+0];
uchar b=p_frame[j+1];
uchar g=p_frame[j+2];
if((r>0)||(b>0)||(g>0)){
bool if_tag=false;
while(!if_tag){
int rand_row=rand()%frame_rows;
int rand_col=rand()%fram_cols;
uchar* p_tag=frame_tag.ptr<uchar>(rand_row);
uchar* p_copy=frame_copy.ptr<uchar>(rand_row);
if(p_tag[rand_col]==1)
continue;
else{
p_tag[rand_col]=1;
p_copy[rand_col*3+0]=r;
p_copy[rand_col*3+1]=b;
p_copy[rand_col*3+2]=g;
if_tag=true;
}
}
}
}
}
cout<<"Write frame: "<<frame_count++<<endl;
outputVideo<<frame_copy;
}
cout<<"Finished Writing"<<endl;
return 0;
}
然后就实现了漫天飞舞的随机雪花效果啦~
分享到:
相关推荐
图像处理与分析——变分,PDE,小波及随机方法 本书是图像处理领域一本令人激动的书籍.作者从变分法、偏微分方程、小波方法及随机方法的框架下对图像处理和分析进行了深入浅出的描述和分析。 本书首先介绍了对于...
英文PDF版,清晰,对了解相关知识有用!
图像处理系统是一个典型的图像处理软件,它由图像显示、图像转换、图像处理、字符识别、其他和帮助等几部分组成。 图像显示模块 该模块主要包括显示位图、显示JPEG、显示GIF 3个部分。 图像转换模块 该模块...
该PPT系统地讲述了马尔科夫随机场的理论及其在图像处理中的应用,是学习与教学都非常好的教材。它国外牛校得授课课件
图像处理系统是一个典型的图像处理软件,它由图像显示、图像转换、图像处理、字符识别、其他和帮助等几部分组成。 图像显示模块 该模块主要包括显示位图、显示JPEG、显示GIF 3个部分。 图像转换模块 该模块...
图像处理算法的源程序,C++,包括: 对图像进行二值化处理的源代码 对图像进行对角镜像处理(几何变换)的源代码 对图像进行离散余弦变换处理(图像变换)的源代码 对图像进行傅立叶变换处理(图像变换)的源代码 ...
图像滤波就是采用一定的算法对数字图像进行处理,以获得人眼视觉或者某种接受系统所需要的图像处理过程。对图像滤波的要求是,既能滤除图像中的噪声又能保持图像的细节。由于噪声和图像细节的混叠,所以在图像滤波中...
最近在整理文件时发现的,C语言写的,包括有: ...5.图像增强:二值化、灰度化、直方图均衡化、伪彩色; 6.特征检测:LOG、Robert、Sobel、Prewitte等边缘检测算子; 7.图像仿真:加椒盐噪声、加随机噪声。
详细介绍见:https://blog.csdn.net/renjingzhaozhao/article/details/105383605
基于OpenCV的图像处理系统python实现源码+UI界面+项目说明文档(课程设计、整合常用图像处理方法和技术).zip 【实现功能】 文件操作 打开、关闭、保存一幅图像 亮度对比度调节 调整图像的亮度和对比度 几何变换 对...
像素化关于随机化像素化图片的处理草图##这个怎么运作一旦创建了一些形状,该程序就会用在上随机选择的一些图块来填补空白##控件鼠左键单击:在形状上创建一个点右键单击:删除形状方向键左/右:增加/减少立方体...
图象平滑的目的在于消除各种噪声,这些噪声可能是在图像采集、量化等过程中产生的,也可能是图像传送过程中产生的。其表现是图像信息被干扰噪音所污损。这类噪音的特点是离散性和随机性。
数字图像处理方面的经典教材,中文译本 阮秋琦,阮宇智等译 本书是把图像处理基础理论论述与软件实践方法相结合的第一本书,它集成了冈萨雷斯和伍兹所著的《数字图像处理》一书中的重要内容和MathWorks公司的图像...
将原图像中与矩阵小于per/2对应位置相同的像素置为255,处于per/2与per之间的置为0,这就完成为图像添加椒盐噪声。 白噪声与椒盐噪声类似,不同的是椒盐噪声可能添加黑色或白色的噪声点,而白噪声只会添加白色噪声...
我是图像识别与人工只能研究所的研究生,这是我在实验室做图像处理与跟踪实验所用的框架程序。里面已经包含了如下函数模块: 图像显示:单幅图像显示,连续文件名的序列图像显示,SRC(纯数据图像文件)序列图显示 ...
针对遥感图像地物覆盖分类方法对图像空间分布信息利用不足的问题,提出一种基于超像素统计量的随机森林遥感图像分类方法。以北京市海淀区为研究区,选用Landsat-8卫星为主要数据源,通过改进SLIC超像素分割方法,使...
图像加法运算最常见的用途是实现图像的叠加功能。利用此功能,可以将不同图像中的目标合并到同一图像中。...对于经过长距离模拟通信方式传送的图像(如航天器传回的星际图像),这种处理必不可少。 项目可直接运行~