Silverlight 用于减去背景图像的HLSL着色器
我正在尝试使用Silverlight的HLSL像素着色器从视频图像中减去背景图像。有谁能建议一个比我现在使用的更复杂的算法,因为我的算法做得不正确Silverlight 用于减去背景图像的HLSL着色器,silverlight,silverlight-4.0,hlsl,pixel-shader,Silverlight,Silverlight 4.0,Hlsl,Pixel Shader,我正在尝试使用Silverlight的HLSL像素着色器从视频图像中减去背景图像。有谁能建议一个比我现在使用的更复杂的算法,因为我的算法做得不正确 float Tolerance : register(C1); SamplerState ImageSampler : register(S0); SamplerState BackgroundSampler : register(S1); struct VS_INPUT { float4 Position : POSITION;
float Tolerance : register(C1);
SamplerState ImageSampler : register(S0);
SamplerState BackgroundSampler : register(S1);
struct VS_INPUT
{
float4 Position : POSITION;
float4 Diffuse : COLOR0;
float2 UV0 : TEXCOORD0;
float2 UV1 : TEXCOORD1;
};
struct VS_OUTPUT
{
float4 Position : POSITION;
float4 Color : COLOR0;
float2 UV : TEXCOORD0;
};
float4 PS( VS_OUTPUT input ) : SV_Target
{
float4 color = tex2D( ImageSampler, input.UV );
float4 background = tex2D( BackgroundSampler, input.UV);
if (abs(background.r - color.r) <= Tolerance &&
abs(background.g - color.g) <= Tolerance &&
abs(background.b - color.b) <= Tolerance)
{
color.rgba = 0;
}
return color;
}
浮动公差:寄存器(C1);
采样器状态图像采样器:寄存器(S0);
采样器状态背景采样器:寄存器(S1);
结构与输入
{
浮动位置4:位置;
float4漫反射:COLOR0;
浮动2 UV0:TEXCOORD0;
浮动2 UV1:TEXCOORD1;
};
结构与输出
{
浮动位置4:位置;
float4颜色:COLOR0;
float2uv:TEXCOORD0;
};
浮动4 PS(VS_输出输入):SV_目标
{
float4 color=tex2D(ImageSampler,input.UV);
float4 background=tex2D(BackgroundSampler,input.UV);
如果(abs(background.r-color.r)编辑
由于噪声的影响,单个像素对于此类任务没有用处。因此,算法的本质应该是测量像素块之间的相似性。配方伪代码(基于测量):
将图像划分为N x M网格
对于网格中的每个N,M单元:
相关性=(N,M)的(信号像素)之间的相关性,
背景像素(N,M)
);
如果(相关性>阈值)
显示背景单元格(N,M)
其他的
显示信号单元(N,M)
这是顺序伪代码,但很容易转换为HLSL着色器。只需每个像素检测它所属的像素块,然后测量相应块之间的相关性。并根据该相关性显示或隐藏当前像素
试试这个办法,,
祝你好运!你能解释一下它到底是如何“做得不正确”的吗?我不得不说,我很惊讶你的着色器能正常工作。看看这个HLSL中自适应背景减法的例子:
Divide image into N x M grid
For each N,M cell in grid:
correlation = correlation_between(signal_pixels_of(N,M),
background_pixels_of(N,M)
);
if (correlation > threshold)
show_background_cell(N,M)
else
show_signal_cell(N,M)