在数字艺术和图像处理领域,将现代图像转换为具有古董马赛克风格的视觉效果是一种有趣的技术挑战。本文介绍一种简单的方法,通过计算基于密度的核大小,从数字图像中重新采样点,并绘制出类似古董马赛克、点(点描)和Voronoi细胞的视觉效果。在继续之前,强烈建议读者查阅参考文献部分的相关文章。
通常,解释一种方法及其逻辑背景的常见方式是首先展示想要实现的目标。第一步是获取重新采样的点,第二步是使用这些采样点绘制想要的视觉效果。
首先,需要一个输入图像及其像素。然后,将按照以下步骤扫描图像中的所有像素:
如果对每个像素重复这些步骤,就得到了所有重新采样的像素。这样,第一步就完成了。
接下来,将基于这些采样点的颜色和之前计算的相关半径值绘制一些形状。这些步骤更简单,不需要解释。
从技术上讲,重新采样数字图像被称为“空间采样”。在实践中使用了许多采样方法,如规则网格、不规则网格、六边形网格、三角网格、泊松盘采样、随机采样、准随机采样等。这些采样方法中的一些与统计分布有很深的关系。主要目标是获得一个平衡的分布(即,采样点)在数学上是统计的,在艺术风格化上是审美的。在这里,将解释另一种基于密度的采样方法。对于数字图像,接受“密度”是图像的亮度(即,像素的灰度级)。
以下是详细的步骤:
如果对每个像素重复这些步骤,就得到了所有重新采样的像素。这样,第一步就完成了。
计算核半径的公式是一个计算公式,是所有财产。
kernelRadius := (256 div density) - (gray div density);
典型的参数值是密度为20,阈值为192。
以下是核心代码片段:
type
TCDots =
record
Cx, Cy: integer;
CRadius: integer;
CColor: TColor;
end;
var
dots: array of TCDots;
...
SetLength(dots, nSize);
...
for y:=0 to H-1 do
begin
for x:=0 to W-1 do
begin
c := imgWork.Canvas.Pixels[x, y];
r := GetRValue(c);
g := GetGValue(c);
b := GetBValue(c);
gray := trunc(r * 0.2989 + g * 0.5866 + b * 0.1145 + 0.5);
kernelRadius := (256 div density) - (gray div density);
if chkFixedDensity.Checked then
kernelRadius := 16 - (gray div 32);
if (kernelRadius < 5) then
kernelRadius := 5;
radii2 := kernelRadius * kernelRadius;
if (gray > threshold) then
begin
c1 := clWhite;
imgWork.Canvas.Pixels[x, y] := c1;
continue;
end;
for ky:=-kernelRadius to +kernelRadius do
begin
yy := y + ky;
if (yy < 0) then yy := 0;
if (yy > H-1) then yy := H-1;
for kx:=-kernelRadius to +kernelRadius do
begin
xx := x + kx;
if (xx < 0) then xx := 0;
if (xx > W-1) then xx := W-1;
if ((ky = 0) and (kx = 0)) then
c1 := c
else
c1 := clWhite;
if (kx*kx + ky*ky < radii2) then
begin
imgWork.Canvas.Pixels[xx, yy] := c1;
if (c1 <> clWhite) then
with dots[nCount] do
begin
Cx := xx;
Cy := yy;
CRadius := kernelRadius;
CColor := c1;
end;
end;
end;
end;
end;
end;