精华内容
下载资源
问答
  • 通道随机混合
    千次阅读 多人点赞
    2019-07-17 16:38:04

    通道随机混合操作(Channel Shuffle Operation)可以看成“重塑-转置-重塑”(“reshapetranspose-
    reshape”)操作。这里假设把4个Feature Maps级联后,共1024个Channels。现在我们想把这个1024个Channels随机打乱混合。首先把Channels重塑为(g, c),其中  g 表示分组数目,c=1024/g。然后把它转置一下为(c, g)。然后把它重塑为1024个通道。

    具体代码如下:

    import torch
    
    
    def channel_shuffle(x, groups):
        batchsize, num_channels, height, width = x.data.size()
    
        channels_per_group = num_channels // groups
    
        # reshape
        x = x.view(batchsize, groups,
                   channels_per_group, height, width)
    
        # transpose
        # - contiguous() required if transpose() is used before view().
        #   See https://github.com/pytorch/pytorch/issues/764
        x = torch.transpose(x, 1, 2).contiguous()
    
        # flatten
        x = x.view(batchsize, -1, height, width)
    
    
        return x

    如果您觉得我的文章对您有所帮助,欢迎扫码进行赞赏!

     

    参考:

    1. ShuffleNet

    更多相关内容
  • 针对非合作接收的单通道同频数字调制混合信号,提出一种基于Gibbs采样的分离算法。该算法利用统计的方法获得未知符号序列概率密度的随机样本,运算复杂度随信道阶数的增加不呈指数增长。重点研究了基于单符号对、多...
  • 最后,在每个网络模块中的组卷积之后加入通道随机混合模块来解决组卷积导致的精度下降问题,并使用加权Tversky损失函数替代Dice损失函数,提高了小目标的分割精度。所提模型的平均Dice_ET、Dice_WT和Dice_TC均优于3D-...
  • 常规的混合效应模型在解决在线拉曼光谱的多通道轮廓检测问题时有几个局限性,例如无法从随机效应中分离缺陷信息,计算效率低下以及无法处理高维提取系数。 为了解决拉曼光谱中的多通道轮廓检测问题,提出了一种新的...
  • 文章目录十一、通道的分离与合并11.1 quickopencv.h11.2 QuickDemo.cpp11.3 test.cpp十二、图像色彩空间转换12.1 quickopencv.h12.2 QuickDemo.cpp12.3 test.cpp十三、图像像素值统计13.1 quickopencv.h13.2 Quick...


    知识来源:哔哩哔哩。以下内容仅为学习笔记,不做其他用途。

    续前节OpenCV(C++版本)基础相关(3):滚动条操作、滚动条-传递参数、键盘响应操作、自带颜色操作、图像像素的逻辑操作

    十一、通道的分离与合并

    知识点:

    • split(image, mv);//通道分离。image图片,mv要拆分的单通道。
    • merge(mv, dst);//通道合并。mv要合并的通道,dst图片。
    • mixChannels(&image, 1, &dst, 1, from_to, 3);//图像通道处理有关的一个函数,能够实现复杂通道的组合。image输入矩阵;1输入矩阵数量;dst输出矩阵;1输出矩阵数量;被复制通道与要复制到的位置组成的索引对;3表示fromTo中索引对的数目,即3个通道。

    11.1 quickopencv.h

    #include<opencv2/opencv.hpp>
    using namespace cv;
    
    class QuickDemo //QuickDemo对象
    {
    public:
    	void channels_demo(Mat &imge);
    };
    

    11.2 QuickDemo.cpp

    #include<quickopencv.h>
    #include<iostream>
    
    
    void QuickDemo::channels_demo(Mat &image)
    {
    	std::vector<Mat>mv;
    	split(image, mv);
    	//imshow("蓝色", mv[0]);
    	//imshow("绿色", mv[1]);
    	//imshow("红色", mv[2]);
    	Mat dst;
    	mv[1] = 0;
    	mv[2] = 0;
    	merge(mv, dst);
    
    	namedWindow("蓝色", WINDOW_KEEPRATIO);
    	imshow("蓝色", dst);					//在窗口显示图像
    	resizeWindow("蓝色", 320, 480);
    
    	int from_to[] = {0,2,1,1,2,0 };
    	mixChannels(&image, 1, &dst, 1, from_to, 3);//3表示3个通道
    
    	namedWindow("通道混合", WINDOW_KEEPRATIO);
    	imshow("通道混合", dst);					//在窗口显示图像
    	resizeWindow("通道混合", 320, 480);
    
    }
    
    

    11.3 test.cpp

    #include<opencv2/opencv.hpp>
    #include<iostream>
    #include<quickopencv.h>
    
    using namespace std;
    using namespace cv;
    int main(int argc,char **argv)
    {
    
    	Mat src = imread("D:/opencv/pictures/11 (8).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
    	
    	if (src.empty())
    	{
    		printf("could not load image");			//如果路径不正确,则显示无法导入图片。
    		return -1;
    	}
    	
    	namedWindow("输入窗口", WINDOW_KEEPRATIO);	
    	imshow("输入窗口", src);					//在窗口显示图像
    	resizeWindow("输入窗口", 320, 480);
    	QuickDemo qd;								//调用之前创建的类对象	
    	qd.channels_demo(src);
    	waitKey(0);									//暂停程序,等待一个按键输入,单位ms
    	destroyAllWindows();						//销毁所有创建的窗口
    	return 0;
    }
    
    

    在这里插入图片描述

    十二、图像色彩空间转换

    知识点:

    • inRange(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), mask);
      参数1:输入要处理的图像,可以为单通道或多通道。
      参数2:包含下边界的数组或标量。
      参数3:包含上边界数组或标量。
      参数4:输出图像,与输入图像src 尺寸相同且为CV_8U 类型。

    12.1 quickopencv.h

    #include<opencv2/opencv.hpp>
    using namespace cv;
    
    class QuickDemo //QuickDemo对象
    {
    public:
    	void inrange_demo(Mat &imge);
    };
    
    

    12.2 QuickDemo.cpp

    #include<quickopencv.h>
    #include<iostream>
    
    
    void QuickDemo::inrange_demo(Mat &image)
    {
    	Mat hsv;
    	cvtColor(image, hsv, COLOR_BGR2HSV);
    	Mat mask;
    	inRange(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), mask);
    
    	namedWindow("mask", WINDOW_KEEPRATIO);
    	imshow("mask", hsv);					//在窗口显示图像
    	resizeWindow("mask", 320, 480);
    
    	//Mat redback = Mat::zeros(image.size(), image.type());
    	//redback = Scalar(40, 40, 200);//
    	//bitwise_not(mask, mask);
    
    	//namedWindow("mask", WINDOW_KEEPRATIO);
    	//imshow("mask", mask);					//在窗口显示图像
    	//resizeWindow("mask", 320, 480);
    
    	//image.copyTo(redback, mask);//把redback复制到mask,mask通过inRange得到。
    
    	//namedWindow("roi区域提取", WINDOW_KEEPRATIO);
    	//imshow("roi区域提取", redback);					//在窗口显示图像
    	//resizeWindow("roi区域提取", 320, 480);
    }
    
    
    

    12.3 test.cpp

    #include<opencv2/opencv.hpp>
    #include<iostream>
    #include<quickopencv.h>
    
    using namespace std;
    using namespace cv;
    int main(int argc,char **argv)
    {
    
    	Mat src = imread("D:/opencv/pictures/11 (8).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
    	
    	if (src.empty())
    	{
    		printf("could not load image");			//如果路径不正确,则显示无法导入图片。
    		return -1;
    	}
    	
    	namedWindow("输入窗口", WINDOW_KEEPRATIO);	
    	imshow("输入窗口", src);					//在窗口显示图像
    	resizeWindow("输入窗口", 320, 480);
    	QuickDemo qd;								//调用之前创建的类对象	
    	qd.inrange_demo(src);
    	waitKey(0);									//暂停程序,等待一个按键输入,单位ms
    	destroyAllWindows();						//销毁所有创建的窗口
    	return 0;
    }
    
    

    在这里插入图片描述

    十三、图像像素值统计

    知识点:

    • minMaxLoc(mv[i], &minv, &maxv, &minLoc, &maxLoc, Mat());//求出图像的最大值和最小值。
    • meanStdDev(image, mean, stddev);//求图像的均值和方差

    13.1 quickopencv.h

    #include<opencv2/opencv.hpp>
    using namespace cv;
    
    class QuickDemo //QuickDemo对象
    {
    public:
    	void pixel_statistic_demo(Mat &imge);
    };
    
    

    13.2 QuickDemo.cpp

    #include<quickopencv.h>
    #include<iostream>
    
    
    void QuickDemo::pixel_statistic_demo(Mat &image)
    {
    	double minv, maxv;//定义最小、最大值
    	Point minLoc, maxLoc;//定义最小、最大值的地址
    	std::vector<Mat>mv;//定义一个Mat类型的数组容器:mv
    	split(image, mv);//对通道分割
    	for (int i = 0; i < mv.size(); i++)
    	{
    		//遍历
    		minMaxLoc(mv[i], &minv, &maxv, &minLoc, &maxLoc, Mat());//求出图像的最大值和最小值。
    		std::cout << "No.channels:" << i << " minvalue:" << minv << " maxvalue:" << maxv << std::endl;//打印各个通道的数值
    	}
    	Mat mean, stddev;//定义均值和方差
    	meanStdDev(image, mean, stddev);//求图像的均值和方差
    	std::cout << "mean:" << mean << std::endl;//打印均值
    	std::cout << "stddev:" << stddev << std::endl;//打印方差
    }
    
    
    

    13.3 test.cpp

    #include<opencv2/opencv.hpp>
    #include<iostream>
    #include<quickopencv.h>
    
    using namespace std;
    using namespace cv;
    int main(int argc,char **argv)
    {
    
    	Mat src = imread("D:/opencv/pictures/11 (8).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
    	
    	if (src.empty())
    	{
    		printf("could not load image");			//如果路径不正确,则显示无法导入图片。
    		return -1;
    	}
    	
    	namedWindow("输入窗口", WINDOW_KEEPRATIO);	
    	imshow("输入窗口", src);					//在窗口显示图像
    	resizeWindow("输入窗口", 320, 480);
    	QuickDemo qd;								//调用之前创建的类对象	
    	qd.pixel_statistic_demo(src);
    	waitKey(0);									//暂停程序,等待一个按键输入,单位ms
    	destroyAllWindows();						//销毁所有创建的窗口
    	return 0;
    }
    
    

    在这里插入图片描述

    十四、图像几何形状的绘制

    知识点:

    • Rect rect;//定义一个对象rect,用来存储一个矩形框的左上角坐标、宽度和高度

    • rectangle(image, rect, Scalar(0, 0, 255), -1, 8, 0);//image代表待处理的图片,rect代表矩形坐标和宽高;Scalar(0, 0, 255)代表颜色;-1代表填充;8代表8连接;0为默认。

    • circle(bg, Point(350, 400), 15, Scalar(0, 255, 0), -1, 8, 0);//bg代表图像;Point(350, 400)代表圆心坐标;15半径;Scalar(0, 255, 0)代表颜色;-1为填充;8为领域填充;0为默认;

    • line(bg, Point(100, 100), Point(350, 400), Scalar(0, 0, 255), 8, LINE_AA, 0);//bg代表图像;Point(350, 400)代表起点坐标;Point(350, 400)为终点坐标;Scalar(0, 255, 0)代表颜色;LINE_AA为抗锯齿线。

    • RotatedRect rtt;//定义一个对象,用于存储旋转矩形。包括矩形中心,矩形长宽,旋转角度。

    • ellipse(bg, rtt, Scalar(0, 0, 255), 2, 8);//椭圆函数。

    14.1 quickopencv.h

    #include<opencv2/opencv.hpp>
    using namespace cv;
    
    class QuickDemo //QuickDemo对象
    {
    public:
    	void drawing_demo(Mat &imge);
    };
    
    

    14.2 QuickDemo.cpp

    #include<quickopencv.h>
    #include<iostream>
    
    
    void QuickDemo::drawing_demo(Mat &image)
    {
    	/*绘图演示1*/
    	Rect rect;
    	rect.x = 100;
    	rect.y = 100;
    	rect.width = 250;
    	rect.height = 300;
    	Mat bg = Mat::zeros(image.size(), image.type());
    	rectangle(image, rect, Scalar(0, 0, 255), -1, 8, 0);
    	circle(bg, Point(350, 400), 15, Scalar(0, 255, 0), -1, 8, 0);
    	line(bg, Point(100, 100), Point(350, 400), Scalar(0, 0, 255), 8, LINE_AA, 0);
    	Mat dst;
    	addWeighted(image, 0.7, bg, 0.3, 0, dst);
    	namedWindow("绘图演示1", WINDOW_KEEPRATIO);
    	imshow("绘图演示1", dst);					//在窗口显示图像
    	resizeWindow("绘图演示1", 320, 480);
    
    
    	/*绘图演示2*/
    	//Rect rect;
    	//rect.x = 100;
    	//rect.y = 100;
    	//rect.width = 250;
    	//rect.height = 300;
    	//Mat bg = Mat::zeros(image.size(), image.type());
    	//rectangle(image, rect, Scalar(0, 0, 255), -1, 8, 0);
    	//circle(bg, Point(350, 400), 15, Scalar(0, 255, 0), -1, 8, 0);
    	//line(bg, Point(100, 100), Point(350, 400), Scalar(0, 0, 255), 8, LINE_AA, 0);
    	//RotatedRect rtt;
    	//rtt.center = Point(200, 200);
    	//rtt.size = Size(100, 200);
    	//rtt.angle = 0.0;
    	//line(bg, Point(100, 100), Point(350, 400), Scalar(0, 0, 255), 8, LINE_AA, 0);
    	//ellipse(bg, rtt, Scalar(0, 0, 255), 2, 8);
    	//Mat dst;
    	//addWeighted(image, 0.7, bg, 0.3, 0, dst);
    	//namedWindow("绘图演示2", WINDOW_KEEPRATIO);
    	//imshow("绘图演示2", dst);					//在窗口显示图像
    	//resizeWindow("绘图演示2", 320, 480);
    	
    }
    
    

    14.3 test.cpp

    #include<opencv2/opencv.hpp>
    #include<iostream>
    #include<quickopencv.h>
    
    using namespace std;
    using namespace cv;
    
    int main(int argc,char **argv)
    {
    
    	Mat src = imread("D:/opencv/pictures/11 (8).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
    	
    	if (src.empty())
    	{
    		printf("could not load image");			//如果路径不正确,则显示无法导入图片。
    		return -1;
    	}
    	
    	namedWindow("输入窗口", WINDOW_KEEPRATIO);	
    	imshow("输入窗口", src);					//在窗口显示图像
    	resizeWindow("输入窗口", 320, 480);
    	QuickDemo qd;								//调用之前创建的类对象	
    	qd.drawing_demo(src);
    	waitKey(0);									//暂停程序,等待一个按键输入,单位ms
    	destroyAllWindows();						//销毁所有创建的窗口
    	return 0;
    }
    
    

    在这里插入图片描述

    在这里插入图片描述

    十五、随机数与随机颜色

    知识点:

    • RNG rng(12345);//RNG为随机生成函数,用于产生随机数,12345为随机种子。对于一个伪随机数生成器,从相同的随机数种子出发,可以得到相同的随机数序列。
    • int b = rng.uniform(0, 255);//在(0,255)区间,随机生成一个整数

    15.1 quickopencv.h

    #include<opencv2/opencv.hpp>
    using namespace cv;
    
    class QuickDemo //QuickDemo对象
    {
    public:
    	void random_drawing();
    };
    
    

    15.2 QuickDemo.cpp

    #include<quickopencv.h>
    #include<iostream>
    
    
    void QuickDemo::random_drawing()
    {
    	Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);//创建底图画布
    	int w = canvas.cols;
    	int h = canvas.rows;
    	RNG rng(12345);//产生随机数
    	while (true)
    	{
    		int c = waitKey(10);
    		if (c == 27)
    		{
    			break;//退出
    		}
    		int x1 = rng.uniform(0, canvas.cols);//坐标点1
    		int y1 = rng.uniform(0, h);
    		int x2 = rng.uniform(0, canvas.cols);// 坐标点2
    		int y2 = rng.uniform(0, h); 
    		int b = rng.uniform(0, 255);// 随机颜色
    		int g = rng.uniform(0, 255);
    		int r = rng.uniform(0, 255);
    		//canvas = Scalar(0, 0, 0);//每次清零
    		line(canvas, Point(x1, y1), Point(x2, y2), Scalar(b, g, r), 1, LINE_AA, 0);//绘制线段	
    		imshow("随机绘制演示", canvas);
    	}
    }
    
    
    

    15.3 test.cpp

    #include<opencv2/opencv.hpp>
    #include<iostream>
    #include<quickopencv.h>
    
    using namespace std;
    using namespace cv;
    
    int main(int argc,char **argv)
    {
    
    	Mat src = imread("D:/opencv/pictures/11 (8).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
    	
    	if (src.empty())
    	{
    		printf("could not load image");			//如果路径不正确,则显示无法导入图片。
    		return -1;
    	}
    	
    	namedWindow("输入窗口", WINDOW_KEEPRATIO);	
    	imshow("输入窗口", src);					//在窗口显示图像
    	resizeWindow("输入窗口", 320, 480);
    	QuickDemo qd;								//调用之前创建的类对象	
    	qd.random_drawing();
    	waitKey(0);									//暂停程序,等待一个按键输入,单位ms
    	destroyAllWindows();						//销毁所有创建的窗口
    	return 0;
    }
    
    

    在这里插入图片描述

    展开全文
  • 该算法以三个判断双通道数据拟合优度的评价函数为优化目标, 通过NSGA-II获得评价函数的Pareto最优解集, 进而利用NRS训练数据样本得到的权重进行线性规划, 实现了最优拟合范围内的全局随机搜索。实验结果表明, 所提...
  • 本文介绍了小型办公室和入口大厅... 基于这些结果,不仅针对复合参数和聚类特征,而且针对第一跳和最后一跳散射体的位置,方向及其色散统计量,建立了室内随机通道模型。 该模型可用于生成合理空间一致性的通道实现。
  • 导弹在大攻角飞行过程中,通道间存在严重的气动耦合。工程设计上,通常把较小的耦合项作为随机干扰来处理,但当耦合影响较大时,容易使控制系统丧失稳定性,因此必须考虑通道间的耦合效应,并对其解耦。
  • Blend 混合模式

    千次阅读 2021-11-02 16:22:42
    混合 常见的混合类型 ShaderLab的混合命令 当片元着色器产生一个颜色时,可以选择与颜色缓冲中的颜色进行混合混合与两个参数有关:源颜色(source color) 和 目标颜色(destination color)。源颜色用S表示,指的...

    参考
    韩世麟 把 PS 图层混合模式理解到这个程度,就算是入门了
    Wiki Blend_modes
    冯乐乐 《Unity Shader入门精要》
    Ps混合模式的计算原理,宇宙最穷的进阶笔记

    混合

    在这里插入图片描述

    图层混合模式规则

    1. 0 - 255要换算到0 - 1区间
    2. 逐像素,分通道

    常见的混合类型

    为叙述方便,定义原图或下层的颜色为底色A,画笔或上层颜色为绘图色B,混合之后的颜色为最终色C

    各种模式

    正常透明度混合(Normal)

    默认状态,最终色与绘图色相同。当上层有透明度时混合方式如下:

    C = A ∗ ( 1 − B . a l p h a ) + B ∗ B . a l p h a C = A *(1 - B.alpha) + B * B.alpha C=A(1B.alpha)+BB.alpha

    溶解(Dissolve)

    从两个图层中随机取得像素,上层图像的不透明度越高所占权重越高
    在这里插入图片描述

    变暗系

    变暗(Darken)

    选取两个颜色中较暗的颜色作为最终色

    C = m i n ( A , B ) C = min(A, B) C=min(A,B)

    正片叠底(Multiply)

    将两种颜色相乘

    C = A B C = A B C=AB

    • 去白留黑
    • 满足交换律,上下不影响结果
    • 可使用黑白线稿与原图相乘来获得描边
    • 模拟暗房中两张正片(所见即所得的底片)重叠的效果

    颜色加深(Color Burn)

    将底层反相后除以顶层,再反相

    C = A − ( 1 − A ) ( 1 − B ) / B = 1 − ( 1 − A ) / B C = A - (1 - A) (1 - B) / B=1-(1-A)/B C=A(1A)(1B)/B=1(1A)/B

    • 将纯黑图层至于上方时,图像不会变成全黑,会出现失真现象(分母不能出现0,ps中的输入值最大为251,因此底图的过曝部分不会受到影响)
      在这里插入图片描述

    线性加深

    将两个图层相加后减去1,等价于两个图层取反相加再取反(线性减淡各项取反)

    C = A + B − 1 = 1 − ( ( 1 − A ) + ( 1 − B ) ) C = A + B - 1=1-((1-A)+(1-B)) C=A+B1=1((1A)+(1B))

    变亮系

    变亮(Lighten)

    选取两个颜色中较亮的作为最终色

    C = m a x ( A , B ) C = max(A, B) C=max(A,B)

    滤色(Screen)

    将两种颜色取反之后相乘,再取反
    C = 1 − ( 1 − A ) ( 1 − B ) C = 1 - (1 - A) (1 - B) C=1(1A)(1B)

    • 去黑留白

    • 滤色之后的图像会提亮且绝对不会过曝(结果必小于1),能够保留更多细节

    • A的反相与B的反相相乘等于C的反相,可看作是正片叠底的逆运算(各项均取反) ( 1 − C ) = ( 1 − A ) ( 1 − B ) (1-C)=(1-A)(1-B) (1C)=(1A)(1B)

    • 两张相同的图片进行滤色约等于将中间亮度提高到75%的曲线
      在这里插入图片描述

    • 模拟在暗房中将两张负片重叠后进行曝光的效果

    颜色减淡(Color Dodge)

    底层除以反相后的顶层

    C = A + ( A ∗ B ) / ( 1 − B ) = A / ( 1 − B ) C = A + (A * B) / (1 - B)=A/(1-B) C=A+(AB)/(1B)=A/(1B)

    • 将纯白图层至于顶层后不会变成全白,会出现失真
      在这里插入图片描述

    线性减淡(Linear Dodge / Additive)

    两图层相加

    C = A + B C = A + B C=A+B

    饱和度系

    叠加(overlay)

    根据底色是否大于50%中灰来决定使用正片叠底滤色,使暗的变暗、亮的变亮,提高对比度

    { C = 2 A B , i f A < 0.5 C = 1 − 2 ( 1 − A ) ( 1 − B ) , o t h e r w i s e \begin{cases} C=2AB, & ifA<0.5\\ C=1-2(1-A)(1-B),&otherwise\\ \end{cases} {C=2AB,C=12(1A)(1B),ifA<0.5otherwise

    • 抠中灰,留黑白
    • 对应函数曲线如下图,可以看出当图片叠加它自己时等效于如下图的曲线,亮部变亮、暗部变暗以提高对比度
      在这里插入图片描述

    强光(Hard Light)

    公式与叠加模式相同,但是叠加是根据底色来判断,强光则是根据绘图色与50%中灰的关系来判断使用正片叠底还是滤色

    { C = 2 A B , i f B < 0.5 C = 1 − 2 ( 1 − A ) ( 1 − B ) , o t h e r w i s e \begin{cases} C=2AB, & ifB<0.5\\ C=1-2(1-A)(1-B),&otherwise\\ \end{cases} {C=2AB,C=12(1A)(1B),ifB<0.5otherwise

    柔光(Soft Light)

    根据绘图色的明暗来决定提亮还是变暗,原理与强光相同,曲线相比于强光更加柔和

    { C = 2 A B + A 2 ( 1 − 2 B ) , i f B < 0.5 C = 2 A ( 1 − B ) + A ( 2 B − 1 ) , o t h e r w i s e \begin{cases} C=2AB+A^2(1-2B), & ifB<0.5\\ C=2A(1-B)+\sqrt{A}(2B-1),&otherwise\\ \end{cases} {C=2AB+A2(12B),C=2A(1B)+A (2B1),ifB<0.5otherwise

    • 柔光与叠加的曲线对比
      在这里插入图片描述

    叠加的上下图层*

    ps中对混合模式常用的操作是在原图上方增加一个图层作为控制图层,从直觉上来判断是对上方图层的操作影响了下方图层。

    在这种方式下,使用黑色笔刷在控制图层上进行涂抹时,混合之后的图像并不会变成纯黑色,与公式中两倍的正片叠底/两倍的滤色不匹配。
    在这里插入图片描述
    分析公式可以得知,叠加的控制层应该在下方,即下方颜色与中灰的关系决定最终图像是变亮还是变暗。

    将控制图层至于下方时,可以看到最终效果符合公式定义。
    在这里插入图片描述
    因此许多人对图层混合的理解其实是错误的。使用传统的操作方法可能会出现灰度突变的问题。

    下图中使用上方图层作为控制层,用黑色笔刷进行加深之后,能看到中间有一道明显的分界线。因为实际上的控制层在下方,因此下图中接近中灰的位置会进行判断,左侧使用的正片叠底而右侧使用了滤色。
    而上方的图层是被改变的图层,左侧的纯黑经过正片叠底运算之后依旧是纯黑,并不会受影响。但是右边的纯黑会受到滤色的影响而迅速变亮。这就形成了中灰位置的分界线。
    在这里插入图片描述但是反过来,这种特性也能够起到保留边界的作用。

    下图中左侧的墙壁亮度小于50%,右侧亮度大于50%,因此中间的分界线得到了非常清晰的保留。
    在这里插入图片描述
    将调整图层至于上方的传统做法虽然与实际原理不符,但是不代表一定是错误的用法。毕竟根据只要它看起来是对的那么它就是对的的原则,能够得到想要的效果的方法就是最好的方法。实际应用中应当根据实际的需求来决定,切忌教条化。

    Unity中的颜色混合

    混合操作发生于光栅化阶段最后的逐片元操作中,透明度测试之后
    在这里插入图片描述

    渲染顺序

    在开启深度写入的情况下,物体背后的其他物体会在深度测试中被剔除,导致无法通过半透明表面看到后边的物体,因此半透明物体的渲染需要关闭深度写入。
    因为半透明物体的渲染需要关闭深度写入,所以半透明物体的渲染顺序非常重要。

    渲染引擎一般都会先对物体进行排序,再渲染。常用的方法为:

    1. 先渲染所有不透明物体,并开启它们的深度测试与深度写入。
    2. 把半透明物体按它们距离摄像机的远近进行排序,然后按照从后往前的顺序渲染这些半透明物体,并开启它们的深度测试,关闭深度写入。

    但是以上面的方法进行渲染还是会出现一些问题。由于深度缓冲区中的值是像素级别的,排序时却是对物体进行排序,这就会导致有些物体之间出现穿插产生了循环重叠的现象时无法得到正确的渲染结果。
    在这里插入图片描述

    上图中三个循环重叠的物体无法得到正确的渲染结果。这种情况需要通过分割网格的方法来解决。

    Unity中解决渲染顺序问题提供的方案是渲染队列(render queue)。使用SubShader的Queue标签来决定模型归属于哪个队列。Unity内部使用一系列整数索引来表示每个渲染队列,且索引号越小表示越早被渲染。

    名称队列索引号描述
    Background1000这个渲染队列会在任何其他队列之前被渲染,通常使用该队列来渲染那些需要绘制在背景上的物体
    Geometry2000默认的渲染队列,大多数物体包括不透明物体使用这个队列。
    AlphaTest2450需要透明度测试的物体使用这个队列。在Unity 5中它从Geometry队列中被单独分离出来,这是因为在所有不透明物体渲染之后再渲染它们会更加高效
    Transparent3000这个队列中的物体会在所有 Geometry 和 AlphaTest 物体渲染后再按从后往前的顺序进行渲染。任何使用了透明度混合的物体都应该使用该队列
    Overlay4000该队列用于实现一些叠加效果。任何需要在最后渲染的物体都应使用该队列

    ShaderLab的混合命令

    当片元着色器产生一个颜色时,可以选择与颜色缓冲中的颜色进行混合。混合与两个参数有关:源颜色(source color)目标颜色(destination color)。源颜色用S表示,指的是片元着色器生成的颜色值;目标颜色用D表示,指的是颜色缓冲中读取到的颜色值。将它们混合之后得到的输出颜色O会重新写入颜色缓冲区。

    混合是一个逐片元的操作,不可编程但是高度可配置。将源颜色S和目标颜色D通过混合等式(blend equation) 进行混合后得到输出颜色O。进行混合时需要使用两个混合等式:一个用于混合RGB通道,一个用于混合A通道。

    设置混合状态状态实际上设置的是混合等式中的操作因子。默认状态下的操作为加操作,因此通常需要设置的是混合因子。设置2个因子,RGB和A将以相同的方式进行混合;设置4种因子,RGB和A将以各自的方式进行混合。

    命令描述
    Blend SrcFactor DstFactor开启混合,设置混合因子,源颜色乘以SrcFactor,目标颜色乘以DstFactor,之后将两者相加再存入颜色缓冲中
    Blend SrcFactor DstFactor,
    SrcFactorA DstFactorA
    除使用不同的因子来混合透明通道外其余与上边相同

    混合公式:

    O r g b = S r c F a c t o r × S r g b + D s t F a c t o r × D r g b O a = S r c F a c t o r A × S a + D s t F a c t o r A × D a O_{rgb}=SrcFactor\times S_{rgb}+DstFactor\times D_{rgb} \\ O_{a}=SrcFactorA\times S_{a}+DstFactorA\times D_{a} Orgb=SrcFactor×Srgb+DstFactor×DrgbOa=SrcFactorA×Sa+DstFactorA×Da

    ShaderLab 中的混合因子

    参数描述
    One因子为1
    Zero因子为0
    SrcColor因子为源颜色值。当用于混合RGB的混合等式时,使用SrcColor的RGB分量作为混合因子;当用于混合A的混合等式时,使用SrcColor的A分量作为混合因子
    SrcAlpha因子为源颜色的透明度值(A通道)
    DstColor因子为目标颜色值。当用于混合RGB的混合等式时,使用DstColor的RGB分量作为混合因子;当用于混合A的混合等式时,使用DstColor的A分量作为混合因子
    DstAlpha因子为目标颜色的透明度值(A通道)
    OneMinusSrcColor因子为(1-源颜色)。当用于混合RGB的混合等式时,使用结果的RGB分量作为混合因子;当用于混合A的混合等式时,使用结果的A分量作为混合因子
    OneMinusSrcAlpha因子为(1-源颜色的透明度值)
    OneMinusDstColor因子为(1-目标颜色)。当用于混合RGB的混合等式时,使用结果的RGB分量作为混合因子;当用于混合A的混合等式时,使用结果的A分量作为混合因子
    OneMinusDstAlpha因子为(1-目标颜色的透明度值)

    使用上边的指令进行设置时,RGB通道的混合因子和A通道的混合因子都是一样的。有时我们希望可以使用不同的参数混合A通道,这时就可以利用Blend SrcFactor DstFactor,SrcFactorA DstFactorA 指令。例如,如果我们想要在混合后输出颜色的透明度就是源颜色的透明度,可以使用下面的命令:

    Blend SrcAlpha OneMinusSrcAlpha, One Zero
    

    混合操作

    上面涉及的混合等式都是将源颜色和目标颜色与对应的混合因子相乘后的结果相加作为输出颜色。使用ShaderLab的BlendOp BlendOperation命令可以设置其他的混合操作。

    操作描述
    Add将混合后的源颜色与目标颜色相加。默认的混合操作。等式为:
    O r g b = S r c F a c t o r × S r g b + D s t F a c t o r × D r g b O_{rgb}=SrcFactor\times S_{rgb}+DstFactor\times D_{rgb} Orgb=SrcFactor×Srgb+DstFactor×Drgb
    O a = S r c F a c t o r A × S a + D s t F a c t o r A × D a O_{a}=SrcFactorA\times S_{a}+DstFactorA\times D_{a} Oa=SrcFactorA×Sa+DstFactorA×Da
    Sub用混合后的源颜色减去混合后的目标颜色。等式为:
    O r g b = S r c F a c t o r × S r g b − D s t F a c t o r × D r g b O_{rgb}=SrcFactor\times S_{rgb}-DstFactor\times D_{rgb} Orgb=SrcFactor×SrgbDstFactor×Drgb
    O a = S r c F a c t o r A × S a − D s t F a c t o r A × D a O_{a}=SrcFactorA\times S_{a}-DstFactorA\times D_{a} Oa=SrcFactorA×SaDstFactorA×Da
    RevSub用混合后的目标颜色减去混合后的源颜色。等式为:
    O r g b = D s t F a c t o r × S r g b − S r c F a c t o r × D r g b O_{rgb}=DstFactor\times S_{rgb}-SrcFactor\times D_{rgb} Orgb=DstFactor×SrgbSrcFactor×Drgb
    O a = D s t F a c t o r A × S a − S r c F a c t o r A × D a O_{a}=DstFactorA\times S_{a}-SrcFactorA\times D_{a} Oa=DstFactorA×SaSrcFactorA×Da
    Min使用源颜色和目标颜色中较小的值作为最终结果,逐分量比较。等式为:
    O r g b a = ( m i n ( S r , D r ) , m i n ( S g , D g ) , m i n ( S b , D b ) , m i n ( S a , D a ) ) O_{rgba}=(min(S_r, D_r),min(S_g, D_g),min(S_b, D_b),min(S_a, D_a)) Orgba=(min(Sr,Dr),min(Sg,Dg),min(Sb,Db),min(Sa,Da))
    Max使用源颜色和目标颜色中较大的值作为最终结果,逐分量比较。等式为:
    O r g b a = ( m a x ( S r , D r ) , m a x ( S g , D g ) , m a x ( S b , D b ) , m a x ( S a , D a ) ) O_{rgba}=(max(S_r, D_r),max(S_g, D_g),max(S_b, D_b),max(S_a, D_a)) Orgba=(max(Sr,Dr),max(Sg,Dg),max(Sb,Db),max(Sa,Da))
    其他逻辑操作仅支持D3D11.1,详见官方文档

    常见的混合类型

    通过混合操作和混合类型的组合,可以得到一些类似Photoshop混合模式中的混合效果

    //正常(Normal),即透明度混合
    Blend SrcAlpha OneMinusSrcAlpha
    
    //柔和相加(Soft Additive)
    Blend OneMinusDstColor One
    
    //正片叠底(Multiply)
    Blend DstColor Zero
    
    //变暗(Darken)
    BlendOp Min
    Blend One One
    
    //变亮(Lighten)
    BlendOp Max
    Blend One One
    
    //滤色(Screen)			C = 1-(1-A)(1-B) = A+B-AB = A+B(1-A) = A(1-B)+B
    Blend OneMinusDstColor One
    //等同于
    Blend One OneMinusSrcColor 
    
    //线性减淡
    Blend One One
    

    在这里插入图片描述

    展开全文
  • PS27种图层混合模式

    千次阅读 2021-10-05 14:39:33
    PS图层混合模式 混合模式的主要功能就是将对象图层与底层图层的颜色进行混合,对象图层与底层图层都可以看到混合后的效果。 理解混合模式前首先要明白三个概念:基色、混合色、结果色。 基色——底层图层的颜色 ...

    混合模式的主要功能就是将对象图层与底层图层的颜色进行混合,对象图层与底层图层都可以看到混合后的效果。

    理解混合模式前首先要明白三个概念:基色、混合色、结果色。

    基色——底层图层的颜色   混合色——对象图层的颜色    结果色——混合后加在一起的颜色

    图层混合模式位置在图层面板的下方,同时一个单一图层是在锁定情况下无法进行混合模式的,即使单一图层解锁后可以进行混合模式也是没有任何变化的,所以想要进行混合模式必须要有两个及以上的图层。

      混合模式主要分为六大类: 基础模式、变暗模式、变亮模式、融合模式、差集模式、颜色模式。见下图:

    1. 正常模式可以看出对象图层对底层图层没有产生任何效果,只是系统默认的上方图层遮盖下方图层,想要显示下方图层可以调节图层混合模式右方的不透明度和填充度。

    2. 溶解模式就使用结果色随机的取代基色和混合色,取代的结果由不透明度来决定,不透明越大溶解的效果就越明显。

     3.变暗模式取两个图层的最暗的的颜色为结果色,对象图层的颜色亮于基色的颜色被替换掉,而暗于基色的颜色则被保留下来。

    4. 正片叠底模式把基色和混合色的颜色像素值相乘然后除以255所得到的颜色像素值就是结果色,在一般情况下,正片叠底模式都会变得比原来的两种颜色更暗,任何颜色和黑色正片叠底得到的仍然是黑色,任何颜色和白色执行正片叠底则保持原来的颜色不变,和其他颜色执行正片叠底得到的颜色会比原来更暗。

    5. 颜色加深模式是查看每个通道的颜色通过增加对比度使基色变暗,从而来反应混合色,与黑色和白色执行颜色加深模式图像则不会发生变化。

    6.线性加深模式通过查看各个通道颜色信息,通过降低底色的亮度使底色变暗从而反应混合色,与白色执行线性加深模式没有任何变化。

     7.深色模式通过查看各个通道的颜色的混合结果进行对比然后产生最暗的颜色成为结果色。

     8.变亮模式与变暗模式正好相反,通过查看各个通道的颜色信息,混合色亮于底色的颜色被保留,暗于底色的颜色被替换。也就是说两个图层中最亮的颜色被保留。

    9.滤色模式和正片叠底模式刚好相反,它是将两个颜色的互补色的像素值相乘,然后除以255的像素值为结果色,通常执行滤色模式后的颜色都较浅。任何颜色和黑色执行滤色,原色不受影响;任何颜色和白色执行滤色得到的是白色;而与其他颜色执行滤色会产生漂白的效果。10. 颜色减淡模式与颜色加深模式相反,通过查看各个通道的颜色信息,通过降低对比度使底色变亮来反映混合色,与黑色执行颜色减淡模式没有任何变化

     11.线性减淡模式与线性加深模式正好相反,通过查看各个通道的颜色信息通过增加亮度使底色颜色变亮来反映混合色。与黑色执行线性减淡模式没有任何变化。

     12.浅色模式正好与深色模式相反,通过查看各个通道的颜色的混合结果进行对比然后产生最亮的颜色成为结果色。

    13. 叠加模式实际上是正片叠底模式和滤色模式的一种混合模式。这种模式是将混合色与基色相互叠加,也就是说底层图像控制着上面的图层,可以使之变亮或变暗。比50%暗的区域将采用正片叠底模式变暗,比50%亮的区域则采用滤色模式变亮。

     14.柔光模式根据混合色的明暗程度来决定结果色是变亮还是变暗,当混合色比50%的灰要亮时,则基色图像变亮。当混合色比50%的灰要暗时,则基色图像就变暗。如果混合色有纯黑色或纯白色,结果色不是黑色或白色,而是稍微变暗或变亮。如果基色是纯白色或纯黑色,不产生任何效果。这个效果与发散的聚光灯照在图像上相似。

     15.强光模式根据混合色来决定是执行“正片叠底”还是“滤色”模式。当混合色比50%的灰要亮时,则基色变亮,就执行“滤色”模式一样,这对增加图像的高光非常有帮助;当混合色比50%的灰要暗时,则基色变暗,就执行“正片叠底”模式一样,可增加图像的暗部。当混合色是纯白色或黑色时得到的是纯白色和黑色。此效果与耀眼的聚光灯照在图像上相似。像亮则更亮,暗则更暗。

     16.亮光模式根据混合色通过增加或降低“对比度”,加深或减淡颜色。如果混合色比50%的灰亮,图像通过降低对比度被照亮,如果混合色比50%的灰暗,图像通过增加对比度变暗。

     17.线性光模式根混合图色通过增加或降低“亮度”,加深或减淡颜色。如果混合色比50%的灰亮,图像通过增加亮度被照亮,如果混合色比50%的灰暗,图像通过降低亮度变暗。

     18.点光模式根据混合色替换颜色。如果混合色比50%的灰要亮,混合色被替换,比混合色亮的像素不变化。如果混合色比50%的灰要暗比混合色亮的像素被替换,比混合色暗的像素不变化,点光模式对图像增加特殊效果非常有用

     19.实色混合模式根据混合颜色与基色颜色的颜色数值相加,当相加的颜色数值大于该y=颜色数值的最大值,混合颜色为最大值;当相加的颜色数值小于该颜色模式颜色数值的最大值,混合颜色为0;当相加的颜色数值等于该颜色模式颜色数值的最大值,混合颜色由底图颜色决定,底图颜色值比绘图颜色的颜色值大,则混合颜色为最大值,相反则为0.实色混合能产生颜色较少、边缘较硬的图像效果

    20.差值模式查看各个通道中的颜色信息,比较基色和混合色,用较亮的像素点的像素值减去较暗的像素点的像素值。与白色混合将使底色反相;与黑色混合则不产生变化。

    21. 排除模式可生成和差值模式相似的效果,但比差值的模式生成颜色对比度较小,因而颜色较柔和。与白色混合将使底色反相;与黑色混合则不产生变化。

     22.减去模式是将基色与混合色相对应的像素提取出来并将它们相减。

     23.划分模式是查看各个通道的颜色信息,并用基色分割混合色。基色数值大于或等于混合色数值,混合出的颜色为白色。基色数值小于混合色,结果色比基色更暗。因此结果色对比非常强。白色与基色混合得到基色,黑色与基色混合得到白色。

    24.色相模式是选择基色的亮度和饱和度值与混合色进行混合而创建的效果,混合后的亮度及饱和度取决于基色,但色相取决于混合色。

     25.饱和度模式是采用基色的亮度、色相以及混合色的饱和度来创建结果色。如果混合色的饱和度为0,则原图没有变化。

     26.颜色模式颜色混合模式引用基色的明度和混合色的色相与饱和度创建结果色。它能够使用混合色的饱和度和色相同时进行着色,这样可以保护图像的灰色色调,但结果色的颜色由混合色决定。颜色模式可以看作是饱和度模式和色相模式的综合效果,一般用于为图像添加单色效果。

     27.明度模式明度混合模式使用混合色的亮度值进行表现,而采用的是基色中的饱和度和色相。与颜色模式的效果意义恰恰相反。

    展开全文
  • 用于研究插入稳定边界层通道流中的分散剂行为的蒙特卡罗方法。 该方法是单粒子分析,其中在给定的时间间隔内模拟单个粒子通过流的随机路径。 粒子以一种单向耦合方式受到流动机制的影响,包括垂直湍流扩散、喷射和...
  • 云计算技术 — 混合云 — 技术架构

    千次阅读 2022-08-18 16:32:49
    :管理通是指云管控平台的互通,基于开放 API 所提供的自动化管理能力,如云资源管理、编排、告警、监控、账单统一管理等,最终实现通过混合云管理平台管理所有混合云资源,包括公共云资源、专有云资源和私有云资源...
  • Ae:图层混合模式

    千次阅读 2021-03-09 00:26:01
    Ae 的图层混合模式与 Ps 中的混合模式从原理和应用上来讲大同小异。本文主要解释了 Ae 中独有的一些混合模式,与 Ps 相同的混合模式可参阅相关链接。◆◆◆正常组只有当像素的不...
  • 根据存储介质的不同,可以将数据库分为基于磁盘的数据库系统、基于内存的数据库系统,以及混合型数据库系统。基于磁盘的数据库系统(disk-base database)是最为常见的一种关系型数据库,比如MySQL、Oracle、SQL ...
  • UE4Material_Lerp混合三个颜色

    千次阅读 2019-08-27 17:45:03
    1.用线性插值先混合Red ,Green,在随便拖入一张贴图连接Alpha。 2.再给贴图乘2,并且将值限制在01(黑白)连接到Alpha,同时在从乘2处减一并将值限制在0~1。 3.左键+L添加Lerp把*2-1连接到Alpha,并且连接L...
  • 公式宝典之颜色混合模式公式

    千次阅读 2017-10-10 16:03:42
    正常模式(Normal) 是默认的状态,其最终色和绘图色...在基色存在透明度a%时,混合的运算方式是:最终色=基色*a% + 混合色*(1-a%)。 溶解模式(Dissolve) 最终色和绘图色相同,只是根据每个像素
  • 手把手教你Photoshop中的图层混合模式(一)

    千次阅读 多人点赞 2017-01-03 22:51:17
    实例演示Photoshop中的图层混合模式
  • 通道卷积神经网络(multi_channel_CNN) 深度卷积神经网络(deep_CNN) 基于字符的卷积神经网络(Char_CNN) 循环与卷积神经网络并用网络(LSTM_CNN) 树状循环神经网络(Tree-LST...
  • DIY混合BCI刺激系统:SSVEP-P300 LED刺激

    千次阅读 2020-07-10 10:07:47
    图1.4 占空比为85%时的7 Hz和8 Hz刺激频率 图1.5 占空比为85%时的9 Hz和10 Hz激励频率 图1.6 混合刺激LED放置 为了诱发P300成分,使用红色LED生成了4次随机闪光,并将闪光事件时间标记分别发送到数据记录软件...
  • Shader 中的颜色混合模式(Blend Mode)

    千次阅读 2018-10-22 12:47:50
    在之前的文章中提及了 Shader 中的颜色计算,介绍了一些基本的颜色混合计算,然而在实际的 Shader 滤镜中,简单到加减乘除并不能很好地还原出我们想要的效果,mix()也只是其中一个选择。 回顾一下,平时拿到设计师...
  • 通道语音增强

    千次阅读 2020-10-19 18:05:36
    通道语音增强技术 单通道语音增强算法主要可以分为两大类: 基于数字信号处理的传统增强算法和基于数据驱动的学习类增强算法。 一、传统语音增强 基本是基于时域分析或频域分析。频域主要是基于增益函数设计,但...
  • 运动目标检测_混合高斯背景建模

    万次阅读 多人点赞 2017-03-09 22:09:27
    1.混合搞死背景建模理论 混合高斯背景建模是基于像素样本统计信息的背景表示方法,利用像素在较长时间内大量样本值的概率密度等统计信息(如模式数量、每个模式的均值和标准差)表示背景,然后使用统计差分(如3σ原则...
  • Photoshop图层混合模式的计算公式

    千次阅读 2019-06-07 21:18:58
    嗨,PS也是有算法的,感性认识一下上升到理性认识了 :) 其中:正片叠底和滤色是一对逆运算。...1.混合模式的数学计算公式,另外还介绍了不透明度。 2.这些公式仅适用于RGB图像,对于Lab颜色图像而言,这些...
  • 犀思云关于混合云概况解读混合云是公有云和私有云的融合。是近年来云计算的主要模式和发展方向。企业出于安全考虑,一般更愿意将数据存放在私有云中,但是同时又考虑到成本问题以及希望获得公有云的计算资源,在这种...
  • 高斯混合背景建模

    千次阅读 2017-07-06 15:03:50
    1、高斯混合背景建模原理混合高斯背景建模是基于像素样本统计信息的背景表示方法,利用像素在较长时间内大量样本值的概率密度等统计信息(如模式数量、每个模式的均值和标准差)表示背景,然后使用统计差分(如3σ原则)...
  • PS中图层混合模式的Blend公式

    千次阅读 2016-04-07 15:21:55
    // 混合模式的代入式:// 颜色的数据类型,里头分另有(RGBA/XYZW)的分量组合在, // 与单个标量的运算时:未指定分量运算时 // 默认是 float4(RGBA/XYZW)// 旧的已绘制出来的图层颜色 // 也叫:DESTINATION ...
  • 摘要 本文针对可见光红外识别问题,提出了一种强大的信道增强联合学习策略。...对于跨模态度量学习,我们设计了一种增强的通道混合学习策略,以同时处理具有平方差的跨模态和跨模态变化,从而获得更强的可
  • 大家好,今天和各位分享一下如何使用 Tensorflow 构建 CNN卷积神经网络和 LSTM 循环神经网络相结合的混合神经网络模型,完成对多特征的时间序列预测。 本文预测模型的主要结构由 CNN 和 LSTM 神经网络构成。气温的...
  • 背景建模之高斯混合模型

    万次阅读 多人点赞 2015-06-29 17:57:20
    将像素点所呈现的颜色X认为是随机变量,则在每时刻t=1,…,T所得到视频帧图像的像素值只是随机变量X的采样值(观值)。 在进行前景检测前,先对背景进行训练,对每一帧图像中每个背景采用一个混合高斯模型进行模拟...
  • ps中的混合模式

    2017-02-07 22:59:09
    要理解混合模式,首先得知道什么是基色,混合色,结果色 基色是图像中的原稿颜色。 混合色是通过绘画或编辑工具应用的颜色。 结果色是混合后得到的颜色。 两个相邻图层A和B,A在上方,B在下方,A与B混合,A是混合色,B...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,014
精华内容 7,205
热门标签
关键字:

通道随机混合