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 12 months ago·Updated 3 months ago· 6
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—