在网上没有看到有关SwsFilter的讨论,看FFMpeg代码,总结下面的分析结果。
typedef struct SwsFilter {
SwsVector *lumH; // 亮度水平处理
SwsVector *lumV; // 亮度垂直处理
SwsVector *chrH; // 色度水平处理
SwsVector *chrV; // 色度垂直处理
} SwsFilter;
一般都是2维水平和垂直按照相同的处理系数来滤波。
typedef struct SwsVector {
double *coeff; // 滤波器系数
int length; // 滤波器长度
} SwsVector;
一般滤波器具有归一化:length个coeff之和等于1;
1. 高斯模糊 Gaussian Blur
SwsVector *sws_getGaussianVec(double variance, double quality);
//variance就是σ。quality=3.0。
const int length = (int)(variance * quality + 0.5) | 1;
double middle = (length - 1) * 0.5;
for (i = 0; i < length; i++) {
double dist = i - middle;
vec->coeff[i] = exp(-dist * dist / (2 * variance * variance)) / sqrt(2 * variance * M_PI);
}
然后再归一化vec->coeff[i]。
// 这个公式和标准高斯公式不一样,标准高斯函数公式如下
vec->coeff[i] = exp(-dist * dist / (2 * variance * variance)) / (variance*sqrt(2 * M_PI));
if (lumaSharpen != 0.0) {
SwsVector *id = sws_getIdentityVec();
sws_scaleVec(filter->lumH, -lumaSharpen); // 所有点矢量乘 -lumaSharpen
sws_addVec(filter->lumH, id); // 矢量加
}
coeff[i] = i==(length-1)/2 ? 1 - lumaSharpen*coeff[i] : - lumaSharpen*coeff[i];
中心点设为1-lumaSharpen*coeff[i],其他点设为 -lumaSharpen*coeff[i].
SwsFilter *sws_getDefaultFilter(float lumaGBlur, float chromaGBlur,
float lumaSharpen, float chromaSharpen,
float chromaHShift, float chromaVShift,
int verbose);
参数float lumaGBlur, float chromaGBlur分别设置亮度和色度的高斯模糊参数。一般亮度做模糊,色度不做。