今天来介绍水彩画滤镜效果的原理。
水彩画的特点就是颜料元素有限,表达的颜色也是有限的。还有一个就是笔触的原因造成一些团块和颜料块干了之后的效果。
所以,根据水彩画的特点,我们要想模拟水彩画的特点,有了下面的算法思路:
该算法中我们将设定两个变量来调整我们的最终效果。一个为油桶数目 N。另一个是滑窗半径 R。我们设定一个 N 代表油桶(颜料桶)的数目,这个颜料桶是用于离散化不同的像素值的。但是离散化总有一个标准,所以这里我们通过像素的灰度值做为一个标准。而彩色图像一般有三个颜色通道的灰度值,因此该算法选择灰度化图片像素值后作为离散化的标准。
算法步骤如下:
1,先将原始图像F(x,y)灰度化得到G(x,y);
2,构建一个边长为 2 * R + 1 的滑窗;
3,用滑窗扫过图像,计算每次滑窗中心点对应的像素值:
因为我们的离散化标准为灰度图像的灰度值。而灰度值介于 0 到 255 之间。所以 N 的数目要小于 255。我们把将 0 到 255 这个灰度区间等间距分到 N 个油桶中。
首先,对于滑窗内的元素,我们要判断其对应的灰度图像的像素值位于哪个油桶区间中。然后将该像素归于这个油桶中。
其次,统计找出含有最多个像素的油桶。该油桶的每个元素对应原图的每个像素的平局值就是该滑窗中心点对应的像素的像素值。
下面是我自己写的c++代码实现效果图:
水彩画效果图1.png
水彩画效果图2.png