数字图像的点采样与古董马赛克风格绘制

在数字艺术和图像处理领域,将现代图像转换为具有古董马赛克风格的视觉效果是一种有趣的技术挑战。本文介绍一种简单的方法,通过计算基于密度的核大小,从数字图像中重新采样点,并绘制出类似古董马赛克、点(点描)和Voronoi细胞的视觉效果。在继续之前,强烈建议读者查阅参考文献部分的相关文章。

目标与方法概述

通常,解释一种方法及其逻辑背景的常见方式是首先展示想要实现的目标。第一步是获取重新采样的点,第二步是使用这些采样点绘制想要的视觉效果。

首先,需要一个输入图像及其像素。然后,将按照以下步骤扫描图像中的所有像素:

  1. 将图像转换为灰度。
  2. 获取每个像素的灰度值。
  3. 基于灰度值(即密度)计算圆形核的半径。
  4. 在圆形核(窗口)内消除剩余的邻近像素。
  5. 结果,得到了重新采样的像素和其他白色像素。

如果对每个像素重复这些步骤,就得到了所有重新采样的像素。这样,第一步就完成了。

接下来,将基于这些采样点的颜色和之前计算的相关半径值绘制一些形状。这些步骤更简单,不需要解释。

技术细节

从技术上讲,重新采样数字图像被称为“空间采样”。在实践中使用了许多采样方法,如规则网格、不规则网格、六边形网格、三角网格、泊松盘采样、随机采样、准随机采样等。这些采样方法中的一些与统计分布有很深的关系。主要目标是获得一个平衡的分布(即,采样点)在数学上是统计的,在艺术风格化上是审美的。在这里,将解释另一种基于密度的采样方法。对于数字图像,接受“密度”是图像的亮度(即,像素的灰度级)。

以下是详细的步骤:

  1. 将图像转换为灰度。
  2. 获取每个像素的灰度值。
  3. 基于灰度值计算圆形核的半径(即,密度)。
  4. 在圆形核(窗口)内消除剩余的邻近像素。
  5. 结果,得到了重新采样的像素和其他白色像素。

如果对每个像素重复这些步骤,就得到了所有重新采样的像素。这样,第一步就完成了。

代码实现

计算核半径的公式是一个计算公式,是所有财产。

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;
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485