Nodes/ComfyUI Channel Ops/Filter Ops (live-preview)
ComfyUI Node

Filter Ops (live-preview)

Eleven classic filters in one node — including a halftone and a real unsharp mask

By L33chKing·Created 10 months ago·Updated 2 months ago· 5
Filter Ops (live-preview)
  • image
  • mask
  • image
effectBlur
radius8
sourceRGB
blend_modeNormal
halftone_shapeDot
halftone_inversefalse
halftone_size12
halftone_angle15.0
halftone_contrast0
halftone_brightness0
halftone_quality2
halftone_dither100
color_hue0
color_density128
color_preserve_highlights50
color_saturation1.000
sharpen_amount50
sharpen_radius2
sharpen_threshold0
pixelate_size16
pixelate_modePixelate
posterize_levels4
vignette_amount50
vignette_size50
vignette_feather30
vignette_roundness0
levels_channelRGB
levels_in_black0
levels_in_white255
levels_gamma1.00
levels_out_black0
levels_out_white255
cb_shadow_red0
cb_shadow_green0
cb_shadow_blue0
cb_midtone_red0
cb_midtone_green0
cb_midtone_blue0
cb_highlight_red0
cb_highlight_green0
cb_highlight_blue0
blur_modeGaussian
posterize_modeRGB
posterize_dither0
vignette_center_x50
vignette_center_y50
posterize_dither_modeNone
laplacian_amount1.00
laplacian_kernel3x3 (8-neighbor)
usm_amount1.00
usm_radius3
usm_threshold0
preview_idA

Filter Ops is the grab-bag node of the ComfyUI Channel Ops pack: eleven classic image effects behind one node - Blur, Halftone, Color Filter, Sharpen, Pixelate, Posterize, Vignette, Levels, Color Balance, Laplacian Sharpen, and Unsharp Masking. The pitch is that instead of installing six different post-processing packs, you get the effects that actually get used in one dropdown.

The genuinely useful part isn't the list, though - it's the UI. The node's widgets are adaptive: pick "Vignette" and only the vignette controls appear; pick "Levels" and you get a histogram widget with black/white/gamma handles you can drag. The node author built custom JS widgets (color wheels for Color Filter and Color Balance, a draggable center for the vignette, that histogram) that mirror the underlying numeric values in both directions. So you get the ergonomics of a mini image editor without leaving the graph.

How it works

Like the rest of the pack, everything is pure tensor math - no models, no downloads. The core inputs every effect shares are effect, source, radius, and blend_mode. The pattern is: apply the effect to the channels chosen by source (same RGB/HSV/Oklab channel menu as the pack's Channel Ops node), then optionally blend the result over the original using blend_mode and a mask to restrict the effect to a region.

The effects worth singling out, because they're better than the usual custom-node fare:

  • Halftone - 12 shape patterns (Dot, Line, Cross Cut, Random Dots…), Bayer-dithered, with size, angle (plus an angle wheel widget), contrast, brightness, and an inverse toggle. This is the one people search for a dedicated pack to get; it's here.
  • Unsharp Masking - the classic amount / radius / threshold triplet, where amount is a multiplier and the radius is Gaussian. The threshold input is the key to avoiding halo artifacts: it stops the effect from firing on low-contrast areas.
  • Levels - per-channel (levels_channel RGB/R/G/B) in/out black/white plus gamma, with the histogram widget. That's a real photo-editing control, not a toy.
  • Color Balance - three-way shadows/midtones/highlights color wheels. Hue picks the tint direction, how far you drag sets the intensity.

The inputs that matter

You'll set effect and blend_mode (always visible), and the node shows the relevant widgets for your chosen effect automatically. radius is the shared spatial control (blur radius, etc.). The effect-specific widgets - halftone_shape, posterize_levels, vignette_amount, levels_in_black, cb_highlight_red, and friends - are all optional and hidden unless the matching effect is active. mask restricts the effect to a region and is auto-resized to your image.

Output is a single image, straight into Save Image or back into the graph.

Installing

Part of the ComfyUI Channel Ops pack:

  • ComfyUI Manager → Install Custom Nodes → search "ComfyUI Channel Ops" → install → restart.
  • Or manually: cd ComfyUI/custom_nodes && git clone https://github.com/L33chKing/ComfyUI_Channel_Ops, then restart.

No extra dependencies (torch/NumPy/PIL - already in ComfyUI), no model files, MIT licensed. Runs fine on CPU.

Gotchas

  • The widget-hiding UI means a node can look near-empty on some effects and packed on others - that's intentional, not a bug. If you load an old workflow and see fewer widgets than expected, it's the adaptive UI hiding controls for the currently selected effect.
  • sharpen_amount goes negative - negative values soften instead of sharpening. That's a feature (one slider for both directions) that reads as a bug until you know.
  • Posterize's real dither modes (dither_mode: Bayer / Random / Floyd-Steinberg / Atkinson) are a nice touch that most post-processing nodes skip - worth using on big flat areas to avoid banding.
  • Because this is the newest and least-searched node in the pack, its widget set changes between releases faster than the others. If a workflow you downloaded complains about a missing widget, update the pack and re-load.
Categoryimage/processing

Inputs (55)

NameTypeDefaultDescription
imageIMAGE
effectCOMBOBlur11 options: Blur, Halftone, Color Filter, Sharpen, Pixelate, Posterize, +5
radiusINT80–200
sourceCOMBORGB12 options: Red, Green, Blue, Red+Green, Red+Blue, Green+Blue, +6
blend_modeCOMBONormal21 options: Normal, Multiply, Screen, Overlay, Soft Light, Hard Light, +15
halftone_shapeoptCOMBODot12 options: Random Dots, Cross Cut, Dot, Line Scalloped, Line, Line Centered, +6
halftone_inverseoptBOOLEANfalse
halftone_sizeoptINT121–100
halftone_angleoptFLOAT15.0-180–180
halftone_contrastoptINT0-100–100
halftone_brightnessoptINT0-100–100
halftone_qualityoptINT21–5
halftone_ditheroptINT1000–100
color_hueoptINT00–360
color_densityoptINT1280–255
color_preserve_highlightsoptINT500–100
color_saturationoptFLOAT1.0000–1
sharpen_amountoptINT50-200–200
sharpen_radiusoptINT21–20
sharpen_thresholdoptINT00–50
pixelate_sizeoptINT161–200
pixelate_modeoptCOMBOPixelate2 options: Pixelate, Mosaic
posterize_levelsoptINT42–32
vignette_amountoptINT50-100–100
vignette_sizeoptINT500–100
vignette_featheroptINT300–100
vignette_roundnessoptINT0-100–100
levels_channeloptCOMBORGB4 options: RGB, Red, Green, Blue
levels_in_blackoptINT00–254
levels_in_whiteoptINT2551–255
levels_gammaoptFLOAT1.000.01–9.99
levels_out_blackoptINT00–254
levels_out_whiteoptINT2551–255
cb_shadow_redoptINT0-100–100
cb_shadow_greenoptINT0-100–100
cb_shadow_blueoptINT0-100–100
cb_midtone_redoptINT0-100–100
cb_midtone_greenoptINT0-100–100
cb_midtone_blueoptINT0-100–100
cb_highlight_redoptINT0-100–100
cb_highlight_greenoptINT0-100–100
cb_highlight_blueoptINT0-100–100
blur_modeoptCOMBOGaussian3 options: Gaussian, Average, Edge Average
posterize_modeoptCOMBORGB2 options: RGB, Luminance
posterize_ditheroptINT00–100
vignette_center_xoptINT500–100
vignette_center_yoptINT500–100
posterize_dither_modeoptCOMBONone5 options: None, Bayer, Random, Floyd-Steinberg, Atkinson
laplacian_amountoptFLOAT1.000–5
laplacian_kerneloptCOMBO3x3 (8-neighbor)2 options: 3x3 (4-neighbor), 3x3 (8-neighbor)
usm_amountoptFLOAT1.000–5
usm_radiusoptINT31–50
usm_thresholdoptINT00–255
maskoptMASK
preview_idoptSTRINGA

Outputs (1)

NameTypeDescription
imageIMAGE