65.9K
CodeProject 正在变化。 阅读更多。
Home

漫画化器 -将照片转换为卡通风格的图像

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.81/5 (22投票s)

2011年1月6日

GPL3

1分钟阅读

viewsIcon

98334

downloadIcon

6075

使用多通道双边滤波器和边缘检测对图像进行漫画化。

引言

该工具允许您通过使用双边滤波,然后进行边缘检测,将绘画/卡通效果应用于图像。

背景

这不是我的原创作品。这是从 VB6 移植到 VB.NET 的版本。在网上广泛搜索了不错的卡通效果后,我找到了 Roberto Mior 的这个 VB6 项目,并希望保存它,防止它因使用 VB6 编写而逐渐消失。

Using the Code

大于 600x800 的图像和更大的半径设置会使滤波器处理更多的像素,从而使其变慢。

主要工作流程是

GetBytesFromImage --> MultiPassBilateralFilter --> SobelEdgeDetectionFilter --> LuminanceSegmentationFIlter --> PutBytesIntoImage

这里使用的所有算法都可以在互联网上轻松找到。

示例工作流程

#Region "Cartoonize"

  Private Sub btCartoonize_Click(ByVal sender As System.Object, _
	ByVal e As System.EventArgs) Handles btCartoonize.Click
    PictureBox1.Image = mBitmap
    PictureBox1.Refresh()
    Cartoonize()
  End Sub

  Private Sub DoPreEffect()
    Select Case cbPreEffect.SelectedIndex
      Case 0
      Case 1
        FX.MagneKleverHistogramEQU(0.3)
      Case 2
        FX.MagneKleverExposure(tbExposure.Value)
      Case 3
        FX.MagneKleverBCS(tbBrightness.Value, tbContrast.Value, tbSaturation.Value)
    End Select
  End Sub

  Private Sub DoContour()
    If tbContourAmount.Value > 0 Then
      Select Case cbContourMethod.SelectedIndex
        Case 0
          FX.zEFF_Contour(tbContourAmount.Value, tbLumHue.Value / 100)
        Case 1
          FX.zEFF_ContourbyDOG(tbContourAmount.Value, tbContourThreshold.Value / 1000)
      End Select
    End If
  End Sub

  Private Sub ApplyContour()
    If tbContourAmount.Value > 0 Then
      FX.zEFF_Contour_Apply()
    End If
  End Sub

  Private Sub DoBilateral()
    FX.zEFF_BilateralFilter(tbRadius.Value, tbSpatialIntensity.Value / 10000, _
	tbSpatialSigma.Value / 100, tbIterations.Value, cbIntensityMode.SelectedIndex, _
	cbColorMode.SelectedIndex = 0)
  End Sub

  Private Sub DoQuantizeLuminance()
    FX.zEFF_QuantizeLuminance(tbSegments.Value, tbPresence.Value / 100, _
	tbRadius.Value, False)
  End Sub

  'Private Sub InitDomains()
  '  FX.zInit_IntensityDomain(tbSpatialIntensity.Value / 10000, 
  '  cbIntensityMode.SelectedIndex)
  '  FX.zInit_SpatialDomain(tbSpatialSigma.Value / 100)
  'End Sub

  Public Sub Cartoonize()
    Dim bm As Bitmap = mBitmap.Clone()
    FX.zSet_Source(bm)
    DoPreEffect()
    'Uncomment this if you want to call this without the UI
    'InitDomains
    DoBilateral()
    DoContour()
    DoQuantizeLuminance()
    ApplyContour()

    FX.zGet_Effect(bm)
    PictureBox1.Image = bm
    PictureBox1.Refresh()
    FX_PercDONE("", 0, 0)
  End Sub

#End Region		

关注点

移植代码的主要挑战是了解 VB6 代码中隐式转换的影响。VB6 代码比 VB.NET 代码更快。为了加快速度,效果处理需要用 C++ 编写,以处理字节数组。

历史

  • 2011 年 1 月 6 日:1.0 - VB6 移植的初始版本
  • 2011 年 4 月 18 日:修复了位图字节访问代码 - 由 gilchinger (bauer) 提供修复
© . All rights reserved.