真 · 小白向卷积内核滤镜各种设置解析 [2018.12更]

NAZOrip@A
NAZOrip@A 2018年07月11日
  • 在其它设备中阅读本文章

在VS, AVS, Premiere的滤镜里都能见到卷积内核这个东西,这个东西的神奇之处在于只需要一个3x3像素的格子我们就可以实现模糊, 锐化, 纹理检测等等(额好像就这三个哈哈)功能, 而且我们还可以自己创造滤镜. 那要怎么用呢?
in2white-square.jpg

首先要知道Convolution Kernal是怎么运作的:

convolution-calculate.png
图中就是一个3x3的滤镜, 其每一个来自原图的像素值都会被乘以对应格子上对应位置的数字,然后相加到中心点形成一个新的图像.
这一步骤完成后卷积矩阵Matrix就会右移一个像素, 当移到边上时就从下一行开始.

重点:

1.这个新生成的图像是完全独立的,即在矩阵输出完成再右移后不会加进图片里,更不会被右移或下行扫过的矩阵用到。
2.当矩阵移动到边缘、角落上时,可以让矩阵中心遇到边缘前,露出图像外的部分不参与计算,从而让输出的图片没有大小的变化

那么像素值又是什么?简单讲就是颜色和亮度说到一块,在黑白图像上还可以说是灰度,见下图:
解释.png

这样滤镜基本的工作原理就科普完了,下面就科普这些滤镜是怎么利用这个特性发挥作用的:

以下是原图加上5x5的矩阵,当中心是1的时候, 图片没有被进行任何处理,因为矩阵中心的像素值倍数是1x,而且除中心外的倍数都是0x:
2018-07-09_155458.png

这是一开始提到的矩阵,它可以将整张图像下移一个像素,因为当矩阵扫过整张图像时,所有的中心往上一格的像素都被移动到了中心(即下移)。如果遇到了平面,那么这个滤镜就不起作用,而如果遇到了纹理或斜面,它就会很明显的被会被下移一个像素:
2018-07-09_155726.png

这是纹理检测矩阵,矩阵的设定是

{-1,-1,-1
 -1, 8,-1
 -1,-1,-1}

中间一个8x(8倍)加上边上所有的-8x,共0倍。当扫过像素值都一样的平面,或者就算-1碰到了颜色差异大的地方,输出都会被划为最小值0(黑色),但要是8碰到了颜色变化的地方,颜色就会立马被提亮,从而形成了纹理被高亮,而平面是黑色的状态

另一种纹理检测矩阵是这样,不过检测出的纹理要淡一些:

{ 0,-1, 0
 -1, 4,-1
  0,-1, 0}

然后是降噪模糊矩阵, 它的策略是降低像素差别, 当然为了在平面上不造成变化,这9个格子的相加之和是1, 若是0那么输出的图像就和前个滤镜一样黑一片了:

{0.0625,0.125,0.0625
 0.125 ,0.25 ,0.125
 0.0625,0.125,0.0625}

通过降低中心像素的像素值(会使像素变黑),在掺入临近像素的部分值(会重新使像素变白)从而达到降噪的目的。如果临近像素遇到了纹理,那么中心像素的颜色就会被掺入临近像素的纹理

然后是有名(但我没听说过哈哈哈)的sobel边缘检测算子,分为上下左右四种,上sobel可以找出上方颜色差异大的横线和横向纹理, 下sobel可以找出与下方颜色差异大的横线和横向纹理,以此类推
sobel.png

{ 1, 0,-1   {-1, 0, 1   { 1, 2, 1   { -1,-2,-1
  2, 0,-2    -2, 0, 2     0, 0, 0      0, 0, 0
  1, 0,-1}   -1, 0, 1}   -1,-2,-1}     1, 2, 1}
    左          右           上           下

在5x5的矩阵大小下,我们还可以做出更niuBee的左上,左下,右上和右下Sobel算子哦~

然后是锐化滤镜,这次整个矩阵的和是1:

{ 0,-1, 0
 -1, 5,-1
  0,-1, 0}

这个滤镜在平面上不会造成变化,但细节纹理上会明显提高像素值的差异,如果下图是黑色背景,那么红色就会变亮:
2018-07-09_172337.png

Premiere里还细分出了卷积内核锐化边缘,卷积内核锐化和卷积内核高斯锐化:

{ 1, 1, 1    {-1,-2,-1     {-1,-2,-1
  1,-7, 1     -2,16,-2      -2,13,-2
  1, 1, 1}    -1,-2,-1}÷4  -1,-2,-1}
卷积内核锐化边缘,卷积内核锐化, 卷积内核高斯锐化

实际上它们差别不大, 而且卷积内核锐化还可以写成这样, 数写的那么大只是因为Premiere写不进小数哈哈哈:

{-0.25,-0.5,-0.25
 -0.5,  4,  -0.5
 -0.25,-0.5,-0.25}

剩下的就好说了,在premiere里除了这些值,还能遇到offset偏移,Divisor缩放(翻译错误,应该是除数). 其中offset是在你输出了太亮/太暗的图像后用来改到正常亮度的功能,Divisor上面也说了是因为写不进小数去才有的东西

在GIMP中除了以上还有Alpha-weighting透明通道权重以及Normalise标准化两个选项,勾选透明通道权重可以让透明通道的值参与计算从而避免一些锐化模糊上会出现的瑕疵。
当Normalize勾选后,一旦有输出是0那么就给结果的值+128,一旦有输出是负值就给结果的值+255

总结:

1.遇到平面时,矩阵内数值相加等于0的会生成黑色平面,相加等于1的不变
2.遇到斜面时,矩阵内数值相加等于0的会生成黑~灰色杂色噪点,相加等于1的不变
3.遇到纹理时,矩阵内数值相加等于0的可以检测边缘棱角,等于1的可以让图像移动N个像素,生成原图,模糊/锐化图像
4.视频使用的是YCbCr色彩空间,也就是说压缩了色度后,和在图片上使用同样滤镜出现的颜色差别属于正常现象

以上就是卷积内核各种滤镜的原理了。从现在开始你可以自己尝试制作滤镜,未来我有扩充这一部分内容的打算,但现在有点忙所以木有时间搞啦,那么就这样~