2013-04-13 19:55:04 xiaowei_cqu 阅读数 6380

和心理系在做的实验,主要是研究基于双眼视差的立体视觉在不同的掩蔽类型以及不同视差条件下的去掩蔽效应。基于双眼视差的立体视觉不改变目标与掩蔽刺激之间的信噪比,但能使不同的刺激被知觉在不同的深度位置上以降低目标信号所受到的掩蔽作用。掩蔽作用依据机制不同,可分为能量掩蔽,即不受双眼立体视觉所造成的主观空间分离影响的;以及信息掩蔽,即可以被主观空间分离的。

实验分为几个阶段,最主要是在阶段II被试在存在掩蔽刺激的情况下判断目标图像中的四个字母是否相同。


我主要负责生成实验材料,以下是一些关键代码:

//旋转任意角度随机字母
Mat letterRandRotateMaskerImage(int tag_location)
{
	int target_width=img_width+eye_shift+50;
	int target_height=img_width+50;
	Mat masker_img(target_height, target_width,CV_8UC3,Scalar(128,128,128));

	Rect roi;
	roi.y = 0;
	roi.height = pics[0].rows;
	int ini_height = 0;

	int pic_num=pics.size();
	int ang_num=angles.size();

	while(1)
	{
		if((ini_height+pics[0].rows) > target_height) break;
		//initial roi
		roi.x = 0;
		while(1)
		{
			roi.y = ini_height;
			int pic_idx = rand()%pic_num;
			int rotate_angle = rand()%70;
			if((pic_idx==8||pic_idx==9)&&rotate_angle>45)
					rotate_angle=rotate_angle-45;
			int time_flag=rand()%2;
			int ver_flag=rand()%2;
			//rotate picture
			Mat rota_img = rotateImage(pics[pic_idx], rotate_angle, time_flag,ver_flag);
			//get roi
			roi.width = rota_img.cols;
			roi.height = rota_img.rows;
			if(roi.x < 0) roi.x = 0;
			if(roi.y < 0) roi.y = 0;
			if((roi.x+roi.width) > target_width) break;
			if((roi.y+roi.height) > target_height) break;

			Mat sub_img(masker_img,roi);
			for(int i=0;i<sub_img.rows;i++){
				uchar* ptr_rotate=rota_img.ptr<uchar>(i);
				uchar* ptr_sub=sub_img.ptr<uchar>(i);
				for(int j=0;j<sub_img.cols;j++){
					if( (ptr_rotate[j*3]<180)&&(ptr_rotate[j*3+1]<180) &&((ptr_rotate[j*3+2]<180))){
						ptr_sub[j*3]=78;
						ptr_sub[j*3+1]=78;
						ptr_sub[j*3+2]=78;
					}
				}
			}
			roi.x = roi.x + pics[pic_idx].cols+2;
		}
		//next y position
		ini_height += pics[0].rows+2;
	}

	//cout<<"masker ok 2"<<endl;
	int video_width=img_width*2+border_width*4+img_shift;
	int video_height=img_width+border_width*2;

	Mat video_img(video_height,video_width,CV_8UC3,Scalar(0,0,0));

	roi.width=img_width;
	roi.height=img_width;
	roi.x=border_width;
	roi.y=border_width;
	Mat left_video(video_img,roi);
	
	roi.x=rand()%10;
	roi.y=rand()%10;
	Mat right_target(masker_img,roi);


	roi.x+=eye_shift;
	Mat left_target(masker_img,roi);
	
	roi.x=border_width*3+img_shift+img_width;
	roi.y=border_width;
	Mat right_video(video_img,roi);

	if(tag_location==0){
		left_target.copyTo(left_video);
		right_target.copyTo(right_video);
	}
	else if(tag_location==1){
		left_target.copyTo(right_video);
		left_target.copyTo(left_video);
	}
	else if(tag_location==2){
		left_target.copyTo(right_video);
		right_target.copyTo(left_video);
	}
	int center_x=video_img.rows/2;
	int center_y=video_img.cols/2;
	uchar* p_center=video_img.ptr<uchar>(center_x);
	p_center[center_y*3]=255;
	p_center[center_y*3+1]=255;
	p_center[center_y*3+2]=255;

	return video_img;
}

这是最主要的掩蔽刺激,任意旋转角度的字母,主要存在信息掩蔽。还有另外几种掩蔽类型:切割后的字母,随机像素,以及随机相位,都是在此种图像处理的结果。

生成图片其实为左右两幅,用立体镜放映可以使被试看到“立体”效果,当右眼图像内容相对左眼是向右“偏移”时,会有远离人眼的效果,即掩蔽刺激在目标刺激之后。

//生成随机目标图像
Mat targetImage(int tag_same)
{
	int id_same,id_dif;
	if(tag_same){
		id_same=rand()%26;
		id_dif=id_same;
	}else{
		int dif_tmp=rand()%diff_size;
		id_same=diffs[dif_tmp];
		if(dif_tmp%2==0){
			id_dif=diffs[dif_tmp+1];
		}else{
			id_dif=diffs[dif_tmp-1];
		}
	}
	
	int id_location=rand()%4;
	int textWidth=pics[id_same].cols;
	int textHeight=pics[id_same].rows;
	int x[4],y[4];
	x[0] = img_width/2-textWidth-text_shift;
	y[0] = img_width/2-textHeight/2;
	x[1] = img_width/2-textWidth/2;
	y[1] = img_width/2-textHeight-text_shift;
	x[2]=img_width/2+text_shift;
	y[2]=y[0];
	x[3]=x[1];
	y[3]=img_width/2+text_shift;
	Mat targetImage(img_width,img_width, CV_8UC1, 255);
	Mat subImage1(targetImage,Rect(x[0],y[0],textWidth,textHeight));
	Mat subImage2(targetImage,Rect(x[1],y[1],textWidth,textHeight));
	Mat subImage3(targetImage,Rect(x[2],y[2],textWidth,textHeight));
	Mat subImage4(targetImage,Rect(x[3],y[3],textWidth,textHeight));
	Mat aGrayImg;
	cvtColor(pics[id_same], aGrayImg, CV_BGR2GRAY);
	if(id_location!=0)
		aGrayImg.copyTo(subImage1);
	if(id_location!=1)
		aGrayImg.copyTo(subImage2);
	if(id_location!=2)
		aGrayImg.copyTo(subImage3);
	if(id_location !=3)
		aGrayImg.copyTo(subImage4);

	int difTextWidth=pics[id_dif].cols;
	int difTexttHeight=pics[id_dif].rows;
	int difX=0;
	int difY=0;
	if(id_location==0){
		difX = img_width/2-difTextWidth-text_shift;
		difY = img_width/2-difTexttHeight/2;
	}
	else if(id_location==1){
		difX= img_width/2-difTextWidth/2;
		difY = img_width/2-difTexttHeight-text_shift;
	}
	else if(id_location==2){
		difX=img_width/2+text_shift;
		difY=img_width/2-difTexttHeight/2;
	}
	else{
		difX=img_width/2-difTextWidth/2;
		difY=img_width/2+text_shift;
	}
	Mat subDifImage(targetImage,Rect(difX,difY,difTextWidth,difTexttHeight));
	Mat bGrayImg;
	cvtColor(pics[id_dif], bGrayImg, CV_BGR2GRAY);
	bGrayImg.copyTo(subDifImage);

	//	imshow("target",targetImage);
	return targetImage;
}
*生成的目标刺激和掩蔽刺激后面要合成一张图,目标刺激的左右眼图是在同一视差



还有保证各种刺激条件的随机性的代码:

void randVector(vector<int>&same_ids, vector<int>&type_ids, vector<int>&location_ids, int numbers,int tag)
{
	for(int i=0;i<numbers;i++){
		same_ids[i]=0;
		type_ids[i]=0;
		location_ids[i]=0;
	}
	int same_number=numbers/2;
	
	//type_ids 固定,same_ids 和 location_ids 随机
	if(tag==0){
		int same_count=0;
		while(same_count<same_number){
			int rand_id=rand()%numbers;
			if(same_ids[rand_id]==0){
				same_ids[rand_id]=1;
				++same_count;
			}
		}
		int same_location_number=same_number/3;
		for(int s=0;s<2;s++){
			for(int t=1;t<3;t++){
				int location_count=0;
				while(location_count<same_location_number){
					int rand_id=rand()%numbers;
					if(same_ids[rand_id]==s&&location_ids[rand_id]==0){
						location_ids[rand_id]=t;
						++location_count;
					}
				}
			}
		}

	} //end of tag==0
	//location_ids 固定,type_ids 和 same_ids 随机
	else if(tag==1){
		int same_count=0;
		while(same_count<same_number){
			int rand_id=rand()%numbers;
			if(same_ids[rand_id]==0){
				same_ids[rand_id]=1;
				++same_count;
			}
		}
		int type_numbers=same_number/4;
		for(int s=0;s<2;s++){
			for(int t=1;t<4;t++){
				int type_count=0;
				while(type_count<type_numbers){
					int rand_id=rand()%numbers;
					if(same_ids[rand_id]==s&&type_ids[rand_id]==0){
						type_ids[rand_id]=t;
						++type_count;
					}
				}
			}
		}
	}// end of tag==1
	//location_ids ,type_ids 和 same_ids 都随机
	else if(tag==2){
		int same_count=0;
		while(same_count<same_number){
			int rand_id=rand()%numbers;
			if(same_ids[rand_id]==0){
				same_ids[rand_id]=1;
				++same_count;
			}
		}
		int same_location_number=same_number/3;
		for(int s=0;s<2;s++){
			for(int t=1;t<3;t++){
				int location_count=0;
				while(location_count<same_location_number){
					int rand_id=rand()%numbers;
					if(same_ids[rand_id]==s&&location_ids[rand_id]==0){
						location_ids[rand_id]=t;
						++location_count;
					}
				}
			}
		}
		int same_type_number=same_location_number/4;
		for(int s=0;s<2;s++){
			for(int l=0;l<3;l++){
				for(int t=1;t<4;t++){
					int type_count=0;
					while(type_count<same_type_number){
						int rand_id=rand()%numbers;
						if(same_ids[rand_id]==s&&location_ids[rand_id]==l&&type_ids[rand_id]==0){
							type_ids[rand_id]=t;
							++type_count;
						}
					}
				}
			}
		}
	}
	return ;

}

这段代码写得比较笨拙。。。


(转载请注明作者和出处:http://blog.csdn.net/xiaowei_cqu 未经允许请勿用于商业用途)


2015-01-31 19:53:38 TonyShengTan 阅读数 5177

学习DIP第35天

转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意。有些网站转载了我的博文,很开心的是自己写的东西被更多人看到了,但不开心的是这段话被去掉了,也没标明转载来源,虽然这并没有版权保护,但感觉还是不太好,出于尊重文章作者的劳动,转载请标明出处!!!!

文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro

 

开篇废话

 

 

       废话开始,今天写了两篇博客,为了加快学习进度,而且是周末,相当于给自己加个班,而且理论之前已经研究明白了,所以写起来也比较自如。有人在群里问,学习图像处理,要看书还是要写代码还是要作项目,我觉得,看书像是内功心法,写代码相当于招式练习,项目就像实战一样,所以如果只写代码或者一上来就去跟别人做项目而完全不看书研究基础算法就像空中楼阁,美丽但不牢固,更重要的是容易迷失自己,也就是走火入魔,个人观点,本人也在基础练习阶段,所以说这些没什么经验依据,只是自己的理解。

       非锐化掩蔽,一开始感觉这个词好难接受,不知道要干嘛,google之发现线索不多,经过一番研究发现这个词这么理解:非锐化--锐化的相反的操作是平滑,所以非锐化就是平滑操作;掩蔽--字面意思是隐藏,其实我们可以把它理解成为减去除去,所以这个过程就是减去平滑后的图像得到的结果。而实际算法的思路是,原图减去平滑后的图像,得到被削弱的边缘部分,然后按照一定比例和原图相加,如果比例为1,那么就是非锐化掩蔽,如果大于1就是高提升滤波,和前面频率域的高提升,高频强调思路一致,只是那部分用的是频率域方法。

 

 

数学原理

 

内容迁移至  

http://www.face2ai.com/DIP-5-7-灰度图像-图像增强-非锐化掩蔽UnsharpeningMask/

 

 

http://www.tony4ai.com/DIP-5-7-灰度图像-图像增强-非锐化掩蔽UnsharpeningMask/

2016-08-10 22:14:17 voicanoo 阅读数 18994

      数字图像处理中图像增强算法中常用的两种技术:非锐化掩蔽和高提升滤波

      非锐化掩蔽:

      顾名思义即减去平滑后的图像,其原理流程图如下:

    1、平滑原图像:f->s;

    2、从原图像中减去模糊图像,产生的差值图像称为模板:m=f-s;

    3、将模板加到原图像中:

   

                   




   特点:1、系数k越大对细节增强越明显;

               2、平滑减弱的边缘,锐化后增强的更加明显



    高提升滤波:

    一般锐化模板其系数之和均为0,这说明算子在灰度恒定区域的响应为0,即在锐化处理后的图像中,原图像的平滑区域近乎黑色,而原图中所有的边缘、细节和灰度跳变点都作为黑背景中的高灰度部分突出显示。基于锐化的图像增强中存储希望在增强边缘和细节的同时仍然保留原图像中的信息,而非将平滑区域的灰度信息丢失,因此可以把原图像加上锐化后的图像得到比较理想的结果。

    其原理流程图如下:

   1、图像锐化

   2、原图像与锐化图像按比例混合

   3、混合后的灰度调整(归一化至[0,255])


              



参考博客出处:1、http://blog.csdn.net/tonyshengtan


2019-02-21 16:40:50 cyf15238622067 阅读数 409

非锐化掩蔽和高提升滤波

在印刷和出版界使用多年的图像锐化处理过程是从原图像中减去一幅非锐化(平滑过的)版本。这个称为非锐化掩蔽的处理过程由下列步骤组成:

1、模糊原图像

2、从原图像中减去模糊图像(产生的差值图像称为模板)

3、将模板加到原图像上。

另F(x,y)表示模糊图像,非锐化掩蔽以公式形式描述如下。首先我们要先得到模板:

gmask(x,y)=f(x,y) - F(x,y)

然后在原图像上加上该模板的一个权重部分:

g(x,y)= f(x,y) + k* gmask(x,y)

通常,我们会在上式中包含一个权重系数k(k>=0)。当k=1时,我们得到上面定义的非锐化掩蔽。当k>1时,该处理称为高提升滤波。当k<1时,则不强调非锐化模板的贡献。
 

代码:

#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>

using namespace cv;

int main( int argc, char** argv )
{
    Mat src, gaussi;
    const char* imageName = argc >=2 ? argv[1] : "123.tif";
    int k = 3;
    src = imread( imageName, IMREAD_COLOR ); // Load an image

    // Check if image is loaded fine
    if(src.empty()){
        printf(" Error opening image\n");
        printf(" Program Arguments: [image_name -- default ../data/lena.jpg] \n");
        return -1;
    }
    imshow("src", src);
    GaussianBlur(src, gaussi, Size(5, 5), 3, 3);
    imshow("gaussi", gaussi);
    Mat mask;
    cv::subtract(src, gaussi, mask);
    imshow("mask", k*mask);
    Mat imageEnhance;
    cv::add(src,k*mask, imageEnhance );
    imshow("dst", imageEnhance);

    waitKey(0);

    return 0;
}

结果:

dst更清晰了

2020-01-10 19:15:16 weixin_44045163 阅读数 7

开发环境:VS2012+MFC+Opencv2.4.9
实验目的:
利用VC++实现人脸美化软件,要求:
1、具有人脸美化界面;
2、具有磨皮功能,参数可调;
3、具有美白功能,参数可调;
实验原理:
磨皮:滤波(均值滤波、高斯滤波、双边滤波)
融合:使用高反差保留进行图像融合
美白:使用图像增强—非掩蔽锐化
界面展示:
在这里插入图片描述
(加载原始图片)

在这里插入图片描述
(磨皮效果)
在这里插入图片描述
(融合效果)
在这里插入图片描述
(美白效)

visual c++图像处理

阅读数 3405

没有更多推荐了,返回首页