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






4.81/5 (22投票s)
使用多通道双边滤波器和边缘检测对图像进行漫画化。

引言
该工具允许您通过使用双边滤波,然后进行边缘检测,将绘画/卡通效果应用于图像。
背景
这不是我的原创作品。这是从 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) 提供修复