精华内容
下载资源
问答
  • 如果是矩形等,是纯色,但是Photoshop对带弧形的,例如圆形,字母等,边缘其实不是纯色的像素,而是由很多渐变的越来越透明的像素组成,在白色背景下就是越来越浅,在黑色背景下,就是边缘变深。在两个图层合成后,...

    按照理论来说,纯色的字体加上纯色的背景,然后保存成png文件,然后用色彩范围选择纯色的背景,去掉背景,这样应该能得到原来设置的纯色的字体,但实际测试后不是这样的。
    如果是矩形等,是纯色,但是Photoshop对带弧形的,例如圆形,字母等,边缘其实不是纯色的像素,而是由很多渐变的越来越透明的像素组成,在白色背景下就是越来越浅,在黑色背景下,就是边缘变深。
    在两个图层合成后,保存为一张图,这些透明像素会受黑色背景的影响,导致边缘出现黑色+主体色的集合体,类似主体色加深的效果,导致和原图有差距。

    把图层去掉,可以看出无论是纯色字体,还是纯色的圆形等,边缘有弧形的部分都有各种透明度的像素色块。而合成图,由于背景和上面图层合并了,所以导致透明和底色合并,融合在了一起,在白色情况下,边缘就是各种原主体的浅色。

    如图,白色底色情况下 ,测试带弧形字体,矩形,和圆形的100%和放大1700%的效果:
    字体颜色是#9af84f后,
    放大1700%后,字体大部分像素点是#9af84f,颜色最深的像素点,边缘还有#b1f97e,#b8fa8b,#c6fba4,#d4fcba,#dafcc5,#e7fdd9,#edfee3等。。。。

    矩形,填充该#1c386d后,
    放大1700%,里面的像素点都是#1c386d。

    圆形,填充#1c386d后,
    放大1700%,大部分像素点是#9af84f,颜色最深的像素点,边缘还有#566b92,#7788a7,#b6bfd0,#cad1dd,#dfe3ea等。。。

    PS中弧形图形边缘效果(图中左侧是100%,右侧是1700%):

    1.字体颜色#5ea4c5纯色,然后填充背景图为黑色纯色,设置图片大小是200像素*65像素,分辨率是72像素/英寸后,保存为png格式的图片。
    2.重新载入这张png格式的图片,用色彩范围,选择色相容差最大200,去掉黑色背景,加个底色图层,白色图层。
    把原来psd格式的字体,后面黑色背景填充上白色。
    3.对比两个图片,可以发现,psd格式本身的图片是没有黑色渐变的边缘的,而由png格式的图片,利用色彩范围去黑色的图片,实际边缘会有渐变的黑色。

    如果是白色或浅色边缘,通过色彩范围去背景色后,放到白色的背景色,会不太明显,但是如果原来是黑色背景,会导致去色后会有黑色和本身颜色的混合体的像素出现,表现为颜色加深。
    比如该图中,有深蓝色的像素在边缘出现,而实际字体中并没有这种深蓝色。

    对于该问题,没有很好的处理方法,或者用色彩范围选择后,放大很多倍数,逐个修改像素,把橡皮调整成1个像素的大小,擦除不正常的像素,修改像素,但是这种是不可能的,因为工作量太大,放大后逐个像素修改是很难的,大致修改还差不多。

    目前没发现很好的处理方法,如果可以,最好的方法是在网上找类似图,带白色背景的,然后处理网上找到的白色背景图片。
    把找到的类似的白色背景图片,进行裁剪出来,拼接成和需要图类似的格式,然后把裁剪图先处理一定透明度,把需要的图放在下方,这样可以透过上面的图看到下面需要的图,然后根据下面的图调整大小,尽量与需要图融合。

    色彩范围容差最大也无法完全还原图。
    方法:1.放大很大倍数后,用橡皮和画笔(橡皮或画笔调整称一个像素)修改像素。(耗时间很麻烦,不可能用的方法)
    2.网上找类似的图,和自己需要的白色背景类似的图,然后合成和修改。
    3.重做该图。(用类似的字体作图,用钢笔等勾勒边缘填充颜色,也比较麻烦)


    图示:

     

    转载于:https://www.cnblogs.com/huaxie/p/11008312.html

    展开全文
  • PS怎么把两张图片合成一张?PS无缝贴图怎么用?PS无缝拼接要用什么工具?PS无缝拼图快捷键是什么?PS无缝拼图有色差怎么办?...方法一、融合画面1、同样的打开PS,导入想要处理的两张图片。2、直接...

    PS怎么把两张图片合成一张?PS无缝贴图怎么用?PS无缝拼接要用什么工具?PS无缝拼图快捷键是什么?PS无缝拼图有色差怎么办?PS把两张图片合成一张边缘怎么修?PS无缝拼接图片边缘如何处理?PS把一张图片的某个部分融入到另一张图片中?PS拼图的无缝功能在哪?下面来看看PS把两张图片拼接在一起的图文教程。

    0c7f25c74315a129288563e8a35e01c8.png

    PS怎么把两张图片合成一张?

    方法一、融合画面

    4b32c5c28355d7c778cb4f4f61285f4b.png

    1、同样的打开PS,导入想要处理的两张图片。

    2、直接用选择工具移动一张图片到另一图片上。

    3、把图片移动到合适位置,比如背景图片的左上方,当作挂壁。

    4、对图像进行一些简单的修饰,让其融合在一个场景中。

    43f539556b75727d6ad721cf7cf43f76.png

    方法二、拼贴

    1、首先,打开PS,打开我们想要合并的两张图片,如下图。

    2、选择文件,新建一个足够大的画布。

    3、将其他两张图片用移动工具拖动到新建的画布上。

    4、对图片的比例进行适当的调整,并摆成你想要的效果。

    5、选择图示的裁剪工具,对画布进行裁剪,将多余的白色区域裁去即可保存图片。

    PS拼图怎么消除接缝

    1、将Photoshop软件打开,然后新建一个空白文档,将背景设置为白色,

    ee16f14f596b750f2d4eeaafcca640c8.png

    2、导入两张图片进去

    a7733849922ac65d2261d525428b97c6.png

    eef91c9efcae1db43abf76e02cde9180.png

    3、然后将两张图分别拖到新建的空白文档中,

    403c9d85f03239cc8102105c828d9492.png

    4、将两张图片交叠一小部分放在一起,

    73bfc6bab0752252f6c46da36990e5ee.png

    5、按住Ctrl键、选中两个图片所在的图层,点击编辑选项,在下拉菜单里点击【自动混合图层】,在弹出的对话框里勾选【全景图】、【无缝色调和颜色】,点击确定,得到混合好的图片

    118bdc8cddb97a0efa289d8c8d61580b.png

    819f2110d25adcab4cb5229b1697be3a.png

    6、利用裁切工具,将四周的空白部分裁去,最终得到了完整的风景图,如图

    413b1cc88d5fedca7e27cf1116b3eaba.png

    d1dcf47451308e397e1485b658781393.png

    以上就是PS把一张图片的某个部分融入到另一张图片中、PS把两张图片合成一张边缘怎么修的详细介绍。PS拼图可以融合画面、拼贴、自然融合、上下叠加、自然叠加等,PS拼图有无缝功能,让拼接图片的边缘很自然,不再有色差。PS无缝功能在菜单“编辑”——自动混合图层——全景图——无缝色调和颜色。关注教-程-之家,解锁更多软件教程。

    展开全文
  • 最近做个项目,大致类似激萌(FaceU)那样给人头上加有趣的卡通头饰,这...下面介绍我们程序的核心算法alpha融合融合的方式有很多种,最粗暴的就是直接把前景直接覆盖到背景上面,但是这样就会像是浮在上面,很假很假。

    最近做个项目,大致类似激萌(FaceU)那样给人头上加有趣的卡通头饰,这时候我们需要做一个头饰模板供后续程序调用。当然这个模板可以由专业设计人员设计好,但是我们没有这个条件,那么可以用激萌生成好的图片,把这个模板抠出来供我们自己的程序调用。下面介绍我们程序的核心算法

    alpha融合

    融合的方式有很多种,最粗暴的就是直接把前景直接覆盖到背景上面,但是这样就会像是浮在上面,很假很假。我们应该做成像透明贴纸那样以无缝“贴”在上面,所以选择以一定比例将前背景融合在一起,即alpha融合
    公式:result = fg*alpha+bg*(1-alpha)
    这里我们需要个核心的参数alpha,就是png图片的alpha通道,即透明度的概念,如果alpha都为1,即:result = fg 就是直接把前景覆盖在上面,很不真实,尤其是边缘部分。如果在fg边缘部分alpha从外到里连续从0变到1,那么前景就会无缝融合在背景上。
    说到这里就有个关键问题了,如何得到这个alpha,当然需要借用我们强大的PS工具。

    利用快速选择或魔棒或套索得到选区,单独保存成通道

    为了体现细节,我们以扣头发为例
    

    1. 先用快速选择或魔棒或套索选出主体部分,注意不要把细节选进去,只选主体。


    这里写图片描述

    2. 然后点上面菜单里的选择这个Tab,然后里面有个调整边缘,选中智能半径,然后按住左键有个圆圈(可以调节大小)沿边缘划,松开看到头发慢慢出现,可以反复划,直到所有头发都出来,然后确定。

    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述

    注意这个时候,大多数会反向选择然后按delete删除,然后保存成png,进行alpha融合,但是依然会在边缘出现严重的失真
    这里写图片描述

    PS的delete键删除背景是如何实现的呢?其实它是将你要delete掉的地方alpha通道设为0(全图alpha通道默认为255,不透明),但是这没有达到我们前文说的要有连续的alpha,以便和背景融合时达到渐变的效果。我们刚刚的调整边缘,在图层上看到的是真实的alpha和rgb融合后的结果,所以result = alpha/255*(fg*真alpha)+bg*(1-alpha/255) ,此处的alpha是保存到png的alpha即0或255,result实际上= bg或fg*真alpha,根本没有融合的的过程,所以需要把alpha单独提取出来。

    3. 存储选区

    这里写图片描述
    这里写图片描述
    这里写图片描述
    可以看到刚刚命名的alpha通道,就是我们要的alpha了,边缘的alpha值是连续变化的。

    4. 分离通道单独保存这个alpha通道

    这里写图片描述

    点红色圆圈处,出现分离通道选项

    这里写图片描述

    把该通道保存下来(存储为web格式:png-24,读出来是3通道的都相同,用一个通道就好),然后后续程序处理时,读入这个alpha图作为融合的alpha。

    利用蒙版一步到位

    蒙版是选区的可视化表现,是将不同灰度色值转化为不同的透明度,刚刚我们把选区保存为通道其实就是蒙版。

    上面那种做法,alpha通道是单独保存下来的,现在我们直接让他保存在png图片的第4个通道里

    1. 前面过程和上一个方法一样就是快速选择,然后调整边缘

    2.新建蒙版

    这里写图片描述

    这里写图片描述

    然后直接存储为web格式:png-24就好,用opencv读取第4个channel就是alpha值。而且蒙版是不损坏原图的,用opencv读取前三个通道会发现还是原图。

    进阶

    如何我们要把脸也用蒙版也扣掉怎么做呢(同样要求alpha值连续)?
    同样的先选择脸然后反选调整边缘

    这里写图片描述
    这里写图片描述

    然后点击油漆桶,将颜色选择纯黑(纯黑表示0),注意蒙版是选中状态操作的是蒙版,不是图片。
    然后发现看到边缘是渐变的。

    这里写图片描述

    这里写图片描述

    ok,大功告成!!!

    展开全文
  • 一些人对此进行了部分改进,除了颜色特征以外,大家融入了纹理、边缘方向等特征,以此提高该算法的鲁棒性,也达到了一定的效果。 值得一提的是,就算是改进后的算法,在实际应用中也是相当的鸡肋,该算法表

             Camshift是我接触的第一个跟踪算法,原理简单明了(情怀啊!),Opencv将其实现并封装,拿起就用。

    但不得不承认传统Camshift局限性很大,对于背景复杂或者光照变化的环境跟踪效果很不理想。

    一些人对此进行了部分改进,除了颜色特征以外,大家融入了纹理、边缘方向等特征,以此提高该算法的鲁棒性,也达到了一定的效果。

    值得一提的是,就算是改进后的算法,在实际应用中也是相当的鸡肋,该算法表面上看早已是走上了末路。(个人观点,不喜绕路!)

    但基于Camshift算法的改进算法在目标跟踪入门时是很好的参考算法,甚至随便改进下在国内一些低质量的期刊上发表论文很容易,这些文章泛滥了估计有20年了,但来者不拒。

            以下是比较流行的一种自适应三特征融合之Camshift目标跟踪——颜色、纹理、边缘方向的实现,仅供大家参考!作者能力有限,如有疏漏,万分抱歉!

    以下分别为特征提取函数:

    1-- 纹理特征提取

    /*****************************
    
    函数功能:局部纹理特征(LBP)提取
    
    返回:纹理图像 Mat(8UC1)
    
    ******************************/
    Mat getTextureImg(Mat& inputImg)   //inputImg为灰度图像
    {
    	Mat outputImg(inputImg.rows,inputImg.cols,CV_8UC1);
    	int temp[8];
    	for(int i = 1;i < inputImg.rows-1;i++)
    	{
    		uchar* data = inputImg.ptr<uchar>(i);
    		uchar* data_pre = inputImg.ptr<uchar>(i-1);
    		uchar* data_lat = inputImg.ptr<uchar>(i+1);
    		
    		uchar* out = outputImg.ptr<uchar>(i);
    		for (int j = 1;j < inputImg.cols-1;j++)
    		{		
    			int k = data[j];
    
    			if (data_pre[j-1]>k)
    				temp[0] = 1;
    			else
    				temp[0] = 0;
    			if (data_pre[j]>k)
    				temp[1] = 1;
    			else
    				temp[1] = 0;
    			if (data_pre[j+1]>k)
    				temp[2] = 1;
    			else
    				temp[2] = 0;
    			if (data[j+1]>k)
    				temp[3] = 1;
    			else
    				temp[3] = 0;
    			if (data_lat[j+1]>k)
    				temp[4] = 1;
    			else
    				temp[4] = 0;
    			if (data_lat[j]>k)
    					temp[5] = 1;
    			else
    				temp[5] = 0;
    			if (data_lat[j-1]>k)
    				temp[6] = 1;
    			else
    				temp[6] = 0;
    			if (data[j-1]>k)
    				temp[7] = 1;
    			else
    				temp[7] = 0;
    			out[j] = temp[0]*128+temp[1]*64+temp[2]*32+temp[3]*16+temp[4]*8+temp[5]*4+temp[6]*2+temp[7];
    		}
    	}
    	return outputImg;
    }

    或者Gabor滤波器提取纹理特征,封装为一个类,需要的转到以下地址Download

    2--边缘方向特征提取

    /***********************************
    
    函数功能:提取图像边缘方向特征
    
    返回:边缘方向图像
    
    ************************************/
    Mat getEdgeDirectionImage(Mat& inputImg) //inputImg为灰度图像
    {
        Size size = inputImg.size();
    	Mat canny(size,CV_8UC1);
    	Mat dx16(size,CV_16SC1);
    	Mat dy16(size,CV_16SC1);
    	Mat dx32(size,CV_32FC1);
    	Mat dy32(size,CV_32FC1);
    	Mat gradient_dir(inputImg.size(),CV_32FC1);
    	
    
    	Canny(inputImg,canny,60,180,3);
    	Sobel(inputImg,dx16,CV_16S,1,0,3);// 一阶X方向的图像差分 :dx  
    	Sobel(inputImg,dy16,CV_16S,0,1,3);// 一阶Y方向的图像差分 :dy 
    	
    	dx16.convertTo(dx32,CV_32F);
    	dy16.convertTo(dy32,CV_32F);
    
    
    	divide(dy32,dx32,gradient_dir); // 梯度方向 
    	float theta;
    	for(int i = 0;i< gradient_dir.rows;i++){
    		
    		float* dgr = gradient_dir.ptr<float>(i);
    		uchar* dca = canny.ptr<uchar>(i);
    		float* ddx = dx32.ptr<float>(i);
    
    		for(int j = 0;j < gradient_dir.cols;j++){ 
    
    			if(dca[j] != 0 && ddx[j] != 0){  
    				theta = dgr[j];  
    				theta = atanf(theta);  
    				dgr[j] = theta;
    				//TRACE("边缘方向第 %d 行第 %d 列的值为 %f\n",i,j,theta);
    
    			}else{  
    				dgr[j] = 0.0f;   
    			}  
    		}  
    	}
    	return gradient_dir;
    }
    颜色特征提取直接绘制颜色分布直方图即可;

    以下为三特征融合函数

    /**********************************
    
    函数功能:多特征融合直方图
    返回:反向投影直方图 Mat
    
    ***********************************/
    Mat fuseHist(Mat& backproja,Mat& backprojb,Mat& backprojc,double afa,double beta,double gama)
    {
    	Mat dst(backproja.size(),backproja.depth());
    	//TRACE("反向直方图深度为: %d\n",backproja.depth());
    	for (int i = 0;i < dst.rows;i++)
    	{
    		uchar* data = dst.ptr<uchar>(i);
    		uchar* dataa = backproja.ptr<uchar>(i);
    		uchar* datab = backprojb.ptr<uchar>(i);
    		uchar* datac = backprojc.ptr<uchar>(i);
    		for (int j = 0;j < dst.cols;j++)
    		{
    
    			data[j] = afa*dataa[j] + beta*datab[j] + gama*datac[j];
    		}
    	}
    	return dst;	
    }
    以下为跟踪函数,代码比较乱,仅供参考!由于跟踪只是项目的一部分,所以大家看到莫名其妙的代码,比如背景减除什么的,自动忽略,找到Camshift部分看下就可以了,不便之处,见谅!

    int img_count       = 0;//三帧差帧计数
    int realframe_count = 0;//实际帧数计数 控制帧采样间隔
    int ObjectCount = 0;//跟踪目标个数
    
    //int frame_count = 0;//过程测试专用,没有实际意义
    //int paoQi_count = 0;//过程测试专用
    //int store_count = 0;//过程测试专用
    
    Mat src,src_YCrCb,frame1,frame2,frame3;
    Mat gray1,gray2,gray3;
    Mat diff1,diff2;
    Mat result;
    Mat roi_Object1;
    Mat roi_Object2;
    Mat roi_Object3;
    Mat roi_Object4;
    
    list<Mat> frameQueue; 
    
    vector<vector<Point>> contours;//存储轮廓数据
    vector<vector<Point>> contoursPre;//存储轮廓数据
    //vector<vector<Point>> contours1;
    Mat image;  
    bool backprojMode = false; //表示是否要进入反向投影模式,ture表示准备进入反向投影模式  
    bool selectObject = false;//代表是否在选要跟踪的初始目标,true表示正在用鼠标选择  
    int trackObject = 0; //代表跟踪目标数目  
    bool showHist = true;//是否显示直方图  
    Point origin;//用于保存鼠标选择第一次单击时点的位置  
    Rect selection;//用于保存鼠标选择的矩形框  
    int vmin = 10, vmax = 256, smin = 30;  
    Rect trackWindow;  
    RotatedRect trackBox;//定义一个旋转的矩阵类对象
    Point point_last;
    Point point_predict;
    int hsize[] = {51};
    int ssize[] = {16};
    int edsize[] = {90};
    int tsize[] = {30};
    int lbpsize[] = {40};
    float hranges[] = {0,255};
    float sranges[] = {0,1};
    float edranges[] = {-PI/2,0};
    // float edranges1[] = {-PI/2,-PI/4};
    // float edranges2[] = {-PI/4,0};
    // float edranges3[] = {0,PI/4};
    // float edranges4[] = {PI/4,PI/2};
    float tranges[] = {0,255};
    float lbpranges[] = {0,255};
    const float* phranges[] = {hranges};
    const float* psranges[] = {sranges};
    //const float* pedranges[] = {edranges1,edranges2,edranges3,edranges4};
    const float* pedranges[] = {edranges};
    const float* ptranges[] = {tranges};
    const float* plbpranges[] = {lbpranges};
    int ch[] = {0};
    int ch1[] = {1};
    int size[] = {256,256};
    const float* pranges[] = {hranges,sranges};
    int ch2[] = {0,1};
    vector<Point> trajectory;
    /*********************************
    
    鼠标控制
    
    **********************************/
    void onMouse( int event, int x, int y, int, void* )  
    {  
    	if( selectObject )//只有当鼠标左键按下去时才有效,然后通过if里面代码就可以确定所选择的矩形区域selection了  
    	{  
    		selection.x = MIN(x, origin.x);//矩形左上角顶点坐标  
    		selection.y = MIN(y, origin.y);  
    		selection.width = std::abs(x - origin.x);//矩形宽  
    		selection.height = std::abs(y - origin.y);//矩形高  
    
    		selection &= Rect(0, 0, src.cols, src.rows);//用于确保所选的矩形区域在图片范围内
    		//rectangle(src,selection,Scalar(0,0,255),2);
    
    	}  
    
    	switch( event )  
    	{  
    	case CV_EVENT_LBUTTONDOWN:  
    		origin = Point(x,y);  
    		selection = Rect(x,y,0,0);//鼠标刚按下去时初始化了一个矩形区域  
    		selectObject = true;  
    		break;  
    	case CV_EVENT_LBUTTONUP:  
    		selectObject = false;  
    		if( selection.width > 0 && selection.height > 0 )  
    			trackObject = -1;  
    		break;  
    	}  
    }
    /****************************
    
    函数功能 显示轨迹
    
    *****************************/
    void displayTrajectory(Mat img, vector<Point> traj)
    {
    	if (!traj.empty())
    	{
    		for (size_t i = 0;i < traj.size()-1;i++)
    		{
    			line(img,traj[i],traj[i+1],Scalar(255,255,0),3,8,0);
    
    		}
    	}
    
    }
    /***********************************
    
    图像处理 目标跟踪 线程
    
    ***********************************/
    DWORD WINAPI dealFun(LPVOID lpParamter)   
    {  
    	BackgroundSubtractorMOG2 mog(150,25,false);
    	Mat foreground;
    	Mat background;
    
    	//初始化自适应系数为1/3
    	double a = 0;
    	double b = 0;
    	double c = 1.0;
    
    	Mat src_gray;
    	Mat hsv, hhist,hhist_pre,hhistImg, hbackproj,mask;
    	//Mat shist,shistImg,sbackproj;
    	Mat edst,ehist,ehist_pre,ehistImg,ebackproj;
    	Mat tdst,thist,thist_pre,thistImg,tbackproj;
    	Rect bRect;
    	
    	//Mat lbp_Img,lbp,lbp_mast,lbp_hist,lbp_histimg,lbp_backproj;
    	
    	double sigma = sqrt(5.0);//gabor滤波器参数初始化
    	double F = sqrt(2.0);
    	GaborFilter gabor(0,3,sigma,F);
    	
    	while(1)
    	{
    	  if(!frameQueue.empty()){
    		  WaitForSingleObject(hEvent,INFINITE);
    		  src = (Mat)(*(frameQueue.begin()));//frameQueue.front();
    		  //src_YCrCb = (Mat)(*(frameQueue.begin()));
    		  cvtColor(src,src_YCrCb,CV_BGR2YCrCb);
    		  frameQueue.pop_front();
    		  SetEvent(hEvent);
    #if NOAUTO
    		  if (selectObject)
    		  {
    			  rectangle(src,selection,Scalar(0,0,255),2);
    		  }
    		  mog(src_YCrCb,foreground,0.005);
    		  //threshold(foreground,foreground,128,255,THRESH_BINARY_INV);
    		  //mog.getBackgroundImage(background);
    		  dilate(foreground,foreground,Mat(),Point(-1,-1),3);
    		  erode(foreground,foreground,Mat(),Point(-1,-1),6);
    		  //erode(foreground,foreground,element_e1,Point(-1,-1),3);
    		  dilate(foreground,foreground,Mat(),Point(-1,-1),3);
    		  bitwise_not(foreground,foreground);
    		  cvtColor(src, hsv, CV_BGR2HSV_FULL);//转换后H值为0-255
    		  //colorReduce(hsv,64);
    		  cvtColor(src,src_gray,CV_BGR2GRAY);
    		  //imshow("result",hsv);
              Mat mat(src.size(),CV_8UC1,Scalar::all(255));//反转纹理反向投影直方图
    		  
    		  edst = getEdgeDirectionImage(src_gray);
    		  
    		  Mat tdst32F(src.size(),CV_32FC1);
    		  gabor.conv_img(src_gray,tdst32F,1);
    		  tdst32F.convertTo(tdst,CV_8UC1);
    
    		  if( trackObject )//trackObject初始化为0,当鼠标单击松开后为-1  
    		  {
    			  if( trackObject < 0 )//鼠标选择区域松开后,该函数内部又将其赋值1  
    			  {
    				  inRange(hsv, Scalar(0, 30, 10),Scalar(256, 256, 256), mask);
    				  Mat roi(hsv, selection); Mat maskroi(mask, selection);//mask保存的hsv的最小值
    				  Mat eroi(edst,selection);
    				  Mat troi(tdst,selection);
    				  
    				  calcHist(&roi,1,ch,maskroi,hhist,1,hsize,phranges,true,false);
    				  //normalize(hhist,hhist,0.0,255.0,NORM_MINMAX);
    				  calcHist(&eroi,1,0,Mat(),ehist,1,edsize,pedranges,true,false);
    				  //normalize(ehist,ehist,0.0,255.0,NORM_MINMAX);
    				  calcHist(&troi,1,0,Mat(),thist,1,tsize,ptranges,true,false);
    				  //normalize(thist,thist,0.0,255.0,NORM_MINMAX);
    				  trackWindow = selection;
    				  bRect = selection;
    				  point_last.x = trackWindow.x + trackWindow.width/2;
    				  point_last.y = trackWindow.y + trackWindow.height/2;
    				  trajectory.push_back(point_last);
    				  trackObject = 1;
                   }
    			 //Mat sh_3d[] = {hsv,eddst};
    			 calcBackProject(&hsv,1,ch,hhist,hbackproj,phranges,1,true);
    			 hbackproj &= mask;
    			 calcBackProject(&edst,1,0,ehist,ebackproj,pedranges,1,true);
    			 calcBackProject(&tdst,1,0,thist,tbackproj,ptranges,1,true);
    			 
    			 absdiff(mat,tbackproj,tbackproj);
    			 absdiff(mat,hbackproj,hbackproj);
    
    			 //局部可区分度更新系数
    // 			 if(bRect.area() != 0)
    // 			 {
    // 				 double dc = localDiffCounter(hbackproj,bRect,2);
    // 			     double de = localDiffCounter(ebackproj,bRect,2);
    // 			     double dt = localDiffCounter(tbackproj,bRect,2);
    // 
    // 			     double d = dc + de + dt;
    // 			     a = (dt + de)/(2 * d);
    // 			     b = (dc + dt)/(2 * d);
    // 			     c = (dc + de)/(2 * d);
    // 
    // 			    TRACE("a = %lf\n",a );
    // 			    TRACE("b = %lf\n",b );
    // 			    TRACE("c = %lf\n",c );
    // 			 }
    			 Mat backproj = fuseHist(hbackproj,ebackproj,tbackproj,a,b,c);//三特征融合
    			 //threshold(backproj,backproj,180,255,THRESH_BINARY);
    			 normalize(backproj,backproj,0,255,NORM_MINMAX);
    			 subtract(backproj,backproj,backproj,foreground);
    
    			 imshow("result",backproj);
    			 RotatedRect trackBox = CamShift(backproj, trackWindow,TermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 5, 1 ));
    //			 RotatedRect trackBox = CamShift(lbp_backproj, trackWindow,TermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ));
    			 
    			 if( trackWindow.area() <= 1 )                                                    
    			 { 
    				  //trackWindow = bRect;
    				  int cols = hbackproj.cols, rows = hbackproj.rows, r = (MIN(cols, rows) + 5)/6;
    			      trackWindow = Rect(trackWindow.x - r, trackWindow.y - r,  
    			      trackWindow.x + r, trackWindow.y + r) &  
    				  Rect(0, 0, cols, rows);//Rect函数为矩阵的偏移和大小,即第一二个参数为矩阵的左上角点坐标,第三四个参数为矩阵的宽和高  
    			 }
    
    			 /*-------------------------------------			 		  
    			 预测算法实现 -- 线性外推法
    			 预测位置更新搜索窗口
    
    			 --------------------------------------*/ 	
    			 Point point_current;
    			 bRect = trackBox.boundingRect();
    			 point_current = trackBox.center;
    			 point_predict.x = 2*point_current.x - point_last.x; 
    			 point_predict.y = 2*point_current.y - point_last.y;
    
    			 //Size size_current = trackBox.size;
    			 //trackWindow = Rect(point_predict.x - size_current.width/2, point_predict.y - size_current.height/2,  
    		   	  //size_current.width, size_current.height);
    			 
    			 trackWindow = Rect(point_predict.x -bRect.width/2, point_predict.y - bRect.height/2,  
    			 bRect.width,bRect.height);
    			 Point pu = trackWindow.tl();
    			 Point pd = trackWindow.br();
                 if((pu.x < 0)||(pu.y < 0)||(pd.x > src.cols)||(pd.y > src.rows))
    			 {
    			    trackWindow = bRect;
    			 }
    			 point_last.x = point_current.x;
    			 point_last.y = point_current.y;
    
    			 trajectory.push_back(point_current);
    			 //ellipse( src, trackBox, Scalar(0,0,255), 3, CV_AA );//跟踪的时候以椭圆为代表目标			 
    			 displayTrajectory(src,trajectory);//黄色轨迹线
    			 rectangle(src,trackWindow,Scalar(0,255,0),2);//绿色预测搜索框
    			 rectangle(src,bRect,Scalar(0,0,255),2);//红色当前目标框
                 putText(src,"ID:1",point_current,3,1,Scalar(255,0,0),3,8,false);
    			 /* ------------------------------------------------------
    			 自适应系数求取方法:
    			 
    			    求取当前目标的三特征统计直方图,与前一帧对应直方图求巴氏距离
    			     B(hhist,hhist_pre) B(edhist,edhist_pre) B(thist,thist_pre)
    			    初始化由鼠标手动框选
    
    			 ----------------------------------------------------------*/
    			 hhist.copyTo(hhist_pre);
    			 ehist.copyTo(ehist_pre);
    			 thist.copyTo(thist_pre);
     			 
    			 inRange(hsv, Scalar(0, 0, 10),Scalar(256, 256, 256), mask);
    			 Mat roi(hsv,bRect);Mat maskroi(mask,bRect);//mask保存的hsv的最小值
     			 Mat eroi(edst,bRect);
     			 Mat troi(tdst,bRect);
     
     			 calcHist(&roi,1,ch,maskroi,hhist,1,hsize,phranges,true,false);
    			 //normalize(hhist,hhist,0.0,255.0,NORM_MINMAX);
    			 calcHist(&eroi,1,0,Mat(),ehist,1,edsize,pedranges,true,false);
    			 //normalize(ehist,ehist,0.0,255.0,NORM_MINMAX);
     			 calcHist(&troi,1,0,Mat(),thist,1,tsize,ptranges,true,false);
    			 //normalize(thist,thist,0.0,255.0,NORM_MINMAX);
    			 //ehistImg = getHistImg(ehist);
    			 //imshow("result",ehistImg);
    
    			 double dc = compareHist(hhist,hhist_pre,CV_COMP_BHATTACHARYYA);
    			 double de = compareHist(ehist,ehist_pre,CV_COMP_BHATTACHARYYA);
    			 double dt = compareHist(thist,thist_pre,CV_COMP_BHATTACHARYYA);
    
    // 			 double d = de + dt;
    // 			 a = 0;//颜色直方图系数
    // 			 b = dt/d;//边缘方向直方图系数
    // 			 c = de/d;//纹理直方图系数
    
    			 double d = dc + de + dt;
    			 a = (dt + de)/(2 * d);
    		     b = (dc + dt)/(2 * d);
    			 c = (dc + de)/(2 * d);
    
    			 TRACE("a = %lf\n",a );
    			 TRACE("b = %lf\n",b );
    			 TRACE("c = %lf\n",c );
    		  }  	  
    		  
    		  //imshow("result",foreground);
    		  
    		  imshow("frame",src);
    		  waitKey(1);	 
    		  //Sleep(100);
    	  }
      	}
    	return 0;
    } 
           基本上自适应三特征融合之Camshift目标跟踪实现就弄完了,代码自己写的比较随意,没有整理,大神绕路吧!

           PS:哎,多次强调就是怕能力有限,被无脑喷,但是还是想贴出来给需要的人参考一下。想想自己初学时也是想在网上找到点东西给自己参考,也希望大神多写点好东西和大家分享,共同学习!







    展开全文
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • 两张图片或者多张图片的拼接最佳效果就是无缝,或者说没有明显的拼接痕迹,ps软件可以做到无痕拼接的功能和工具比较多,但很多手动的擦除、羽化边缘等等,都很难做到渐变工具那样的融合效果,所以本文重点讲解,在...
  • 原标题:Adobe Photoshop入门教程:零基础学会PS抠图拼贴小编本人喜欢用Adobe Photoshop进行图像细节调整和抠图这两个主要方面,调整细节和抠图是比较麻烦和困难的事情,但是有了这款软件后就变得容易了,它可以对...
  • PS讲义

    千次阅读 多人点赞 2013-01-26 21:38:42
    疯狂十天PS公开课课堂笔记分享   第一天: 界面构成   1 菜单栏 2 工具箱 3 工具属性栏 4 悬浮面板 5 画布     ctrl + N 新建对话框 (针对画布进行设置)   打开对话框: ctrl + O (字母)   ...
  • PS

    2017-07-26 12:05:52
    PS 1.快捷键  ctrl+N 新建画布 ctrl+O 打开文件 ctrl+W关闭窗口 ctrl+alt+W关闭所有窗口 2.新建画布  文档类型:国际标准纸张里有A4纸 分辨率{ 网页设计:72 平面设计(图书海报)300以上 } 背景内容{ ...
  • ps

    2020-06-07 18:11:19
    颜色替换工具 色相 可以涂抹颜色 用魔术橡皮擦也可以抠图 白色蒙版: 黑透(也就是橡皮擦) 白不透 灰半透,用来做图层间的融合。也就是把一个人放到风景里 黑色蒙版: 白透 黑不透 灰半透, 菜单栏:选择 ---- 色彩...
  • 2017年计算机一级PS练习题及答案PS软件提供的绘图工具让外来图像与创意很好地融合。下面是小编整理的计算机一级PS练习题,希望对大家复习有所帮助!1.当给一个制作标志的时候,大多存成矢量图,这是因为:()选择A...
  • 恩智车中soble算子边缘检测的用法: 1->获取原图像数组; ...图片选自论文:Sobel 与阈值相融合边缘检测算法 黄文举,陈卓佳,李健创,陈晓敏 (华南师范大学 物理与电信工程学院,广东 广...
  • ps技术

    2017-12-04 21:29:59
    导读:自从有了“PS(Photoshop)”以后,很多事情变成了可能,你可以上九天揽月,也可以下五洋捉鳖,照片中,你可以出现在任何你想在的地方。而最基本的美化照片的功能,我想是很多同学学习PS的初衷。当你掌握了这...
  • 学习PS微信公众号:xxps1979在摄影后期中:锐化的时候,经常会出现一些难看、尴尬的白边儿,非常的影响效果,相信每个人都有这样的经历;这个是和锐化的原理有关——锐化就是在细节边缘建立黑边儿、白边儿,增加局部...
  • ps去水印

    2016-10-10 09:50:00
    使用仿制图章工具去除使用仿制图章工具去除文字这...选择不同的笔刷直径会影响绘制的范围,而不同的笔刷硬度会影响绘制区域的边缘融合效果。 2 使用修补工具去除文字如果图片的背景色彩或图案比较一...
  • PS 图像滤镜— — USM 锐化

    万次阅读 2016-04-24 15:14:09
    这个算法的原理很简单,就是先用高斯模糊获取图像的低频信息,然后用原图减去高斯模糊之后的图,得到图像的高频信息,再将原图与高频信息融合,进一步增强原图的高频信息,看起来,图像的边缘显得特别的sharp。...
  • ps学习

    2019-09-10 10:57:20
    在完成复制遮盖的过程中,可以实现和背景之间颜色融合。 修补工具: 源: 从外面拿回来 目标: 从里面拿出去     第七天: 渐变工具: G 实现多种颜色柔和过渡 需要什么样的颜色来实现...
  • PS去水印

    2013-11-28 09:29:52
    一、使用仿制图章工具去除...选择不同的笔刷直径会影响绘制的范围,而不同的笔刷硬度会影响绘制区域的边缘融合效果。如下图:二、使用修补工具去除文字:如果图片的背景色彩或图案比较一致,使用修补工具就比较方...
  • ps笔记

    2018-06-16 15:28:05
    和图案图章工具的区别就是,图案图章工具是直接复制的采样点的像素颜色,而修复画笔工具可以根据选择位置来进行颜色的融合,修复效果更好   修补工具:选中一片区域,然后将这片区域拖到另一个区域,就会用另一片...
  • PS基础

    2021-02-03 18:45:15
    PS相关概念简介 PS由美国Adobe开发的一款用来处理图像的软件。Adobe开发另外一款软件Illustrator(AI),它是用来作图的,它主要跟加拿大开的CorelDRAW抢占市场。 PS是用来处理位图的,而AI是用来处理矢量图的。 ...
  • PS去掉图片中的文字

    万次阅读 2018-04-09 14:23:05
    操作步骤: 01.使用仿制图章工具去除文字 ...  然后在文字区域拖动鼠标复制以覆盖文字(鼠标为圆圈)。...选择不同的笔刷直径会影响绘制的范围,而不同的笔刷硬度会影响绘制区域的边缘融合效果。  ...
  • PS快捷键

    2019-04-15 09:53:00
    ps快捷键 打开文件:Ctrl + O 放大:Ctrl + + 缩小:Ctrl + - 关闭当前图像:Ctrl + W 满画布:FF 或 TAB 退出PS :Ctrl+ Q 新建文件夹:Ctrl + N 填充前景色:Alt + Delete Alt+退格键 背景色:Ctrl...
  • 我使用的 仿制图章工具 去除文字,效果比较好 ...选择不同的笔刷直径会影响绘制的范围,而不同的笔刷硬度会影响绘制区域的边缘融合效果。 还有其他问题的话,可以谷歌一下 →http://t.cn/AiOeQ4zO ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,848
精华内容 739
关键字:

ps边缘融合