[FFmpeg-user] Remove everything but a single color (range)

Hans Carlson forbyta at gmx.com
Sun Mar 15 22:47:11 EET 2020


On Sun, 15 Mar 2020, Ted Park wrote:

> I think colorkey filter can still do this. Basically you want the 
> converse of what color keying does right? It should work the same (that 
> is the opposite) way, and you just have to invert the alpha value.

I'm not quite sure what you mean by invert the alpha value.  I think you 
mean invert the color I'm using... ie, if want to KEEP colors very close 
to e6e65c (I've refined the color since my first post), then the "invert" 
of that would be 1919A3 (at least according to an "opposite color tool" I 
found).

So... after some experimenting...

colorkey sort of works if I use the "invert" color and max similarity and 
blend values:

   colorkey=color=0x1919A3:similarity=1:blend=1

But the yellow box is pretty faint and there's still too much of the video 
still visible.  NOTE: this ONLY works if I use ffplay, not ffmpeg (see 
below).

> try using colorkey or colorhold with higher similarity values first.

colorhold does seem to work, but as Dan Bridges points out...

On Sun, 15 Mar 2020, Dan Bridges wrote:

> Note, this filter will only make the discriminated stuff gray, not black
> or transparent.  Perhaps someone else will be able to help.

Yes... that's what I see.  If I use this:

   colorhold=color=0xe6e65c:similarity=0.25:blend=0.5

Then the "yellow box" stays yellow and everything else becomes gray scale... 
like I'm watching a black and white video.  But I don't want ANY video... 
I ONLY want the yellow box floating around the screen.

Now I did find something that works (colorhold + chromakey)

   colorhold=color=0xe6e65c:similarity=0.25:blend=0.0,chromakey=color=black:similarity=.1

but this ONLY works if I use ffplay, so perhaps I'm not using it 
correctly.

**IF** I use ffplay, then this does (mostly) what I want:

   ffplay -i test.mkv -vf "colorhold=color=0xe6e65c:similarity=0.25:blend=0.0,chromakey=color=black:similarity=.1"

I ONLY see the yellow box (although it's a bit spotty), but pretty much 
all of the rest of the video is completely black.  That's what I want.

BUT, if I use ffmpeg:

   ffmpeg -i test.mkv -vf "colorhold=color=0xe6e65c:similarity=0.25:blend=0.0,chromakey=color=black:similarity=.1" test-highlight.mkv

Then it behaves as if the chromakey filter isn't used at all.  If fact, 
the above produces the same output (as far as I can tell) as this:

   ffmpeg -i test.mkv -vf "colorhold=color=0xe6e65c:similarity=0.25:blend=0.0" test-highlight.mkv

How can I get the same results with ffmpeg that I see with ffplay?

I have similar results using only colorkey with the inverted color.  ie, 
using this (sort of) works:

   ffplay -i test.mkv -vf "colorkey=color=0x1919A3:similarity=1:blend=1"

but this doesn't seem to do anything (at least visibly):

   ffmpeg -i test.mkv -vf "colorkey=color=0x1919A3:similarity=1:blend=1" test-highlight.mkv


Here's the complete output for ffmpeg colorhold,chromakey:

$ ffmpeg -i test.mkv -vf "colorhold=color=0xe6e65c:similarity=0.25:blend=0.0,chromakey=color=black:similarity=.1" test-highlight.mkv
ffmpeg version N-96974-g425b6a9a2c Copyright (c) 2000-2020 the FFmpeg developers
   built with gcc 9 (GCC)
   configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-static --disable-shared --disable-debug --enable-libass --enable-libfdk-aac --enable-libfontconfig --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-openssl --enable-libbluray --enable-libcdio
   libavutil      56. 42.100 / 56. 42.100
   libavcodec     58. 75.100 / 58. 75.100
   libavformat    58. 41.100 / 58. 41.100
   libavdevice    58.  9.103 / 58.  9.103
   libavfilter     7. 77.100 /  7. 77.100
   libswscale      5.  6.101 /  5.  6.101
   libswresample   3.  6.100 /  3.  6.100
   libpostproc    55.  6.100 / 55.  6.100
Input #0, matroska,webm, from 'test.mkv':
   Metadata:
     ENCODER         : Lavf58.29.100
   Duration: 00:01:27.36, start: 0.000000, bitrate: 2479 kb/s
     Stream #0:0: Video: h264 (High), yuv420p(progressive), 720x480 [SAR 32:27 DAR 16:9], 30 fps, 30 tbr, 1k tbn, 60 tbc (default)
     Metadata:
       ENCODER         : Lavc58.54.100 libx264
       DURATION        : 00:01:27.333000000
     Stream #0:1: Audio: ac3, 48000 Hz, stereo, fltp, 192 kb/s (default)
     Metadata:
       ENCODER         : Lavc58.54.100 ac3
       DURATION        : 00:01:27.356000000
Stream mapping:
   Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
   Stream #0:1 -> #0:1 (ac3 (native) -> vorbis (libvorbis))
Press [q] to stop, [?] for help
[swscaler @ 0x2447600] No accelerated colorspace conversion found from yuv420p to argb.
[libx264 @ 0x21ea280] using SAR=32/27
[libx264 @ 0x21ea280] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
[libx264 @ 0x21ea280] profile High 4:4:4 Predictive, level 3.0, 4:4:4, 8-bit
[libx264 @ 0x21ea280] 264 - core 157 r2980 34c06d1 - H.264/MPEG-4 AVC codec - Copyleft 2003-2019 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=4 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, matroska, to 'test-highlight.mkv':
   Metadata:
     encoder         : Lavf58.41.100
     Stream #0:0: Video: h264 (libx264) (H264 / 0x34363248), yuv444p, 720x480 [SAR 32:27 DAR 16:9], q=-1--1, 30 fps, 1k tbn, 30 tbc (default)
     Metadata:
       DURATION        : 00:01:27.333000000
       encoder         : Lavc58.75.100 libx264
     Side data:
       cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
     Stream #0:1: Audio: vorbis (libvorbis) (oV[0][0] / 0x566F), 48000 Hz, stereo, fltp (default)
     Metadata:
       DURATION        : 00:01:27.356000000
       encoder         : Lavc58.75.100 libvorbis
frame= 2620 fps= 45 q=-1.0 Lsize=    6972kB time=00:01:27.35 bitrate= 653.9kbits/s speed= 1.5x 
video:5839kB audio:1076kB subtitle:0kB other streams:0kB global headers:4kB muxing overhead: 0.828422%
[libx264 @ 0x21ea280] frame I:11    Avg QP:20.07  size: 12820
[libx264 @ 0x21ea280] frame P:665   Avg QP:23.54  size:  6011
[libx264 @ 0x21ea280] frame B:1944  Avg QP:28.26  size:   946
[libx264 @ 0x21ea280] consecutive B-frames:  0.6%  1.1%  0.6% 97.7%
[libx264 @ 0x21ea280] mb I  I16..4:  6.1% 79.0% 14.9%
[libx264 @ 0x21ea280] mb P  I16..4:  1.0%  3.7%  1.3%  P16..4: 15.8% 11.1%  6.7%  0.0%  0.0%    skip:60.4%
[libx264 @ 0x21ea280] mb B  I16..4:  0.1%  0.4%  0.0%  B16..8: 17.4%  2.3%  0.4%  direct: 1.0%  skip:78.4%  L0:48.7% L1:43.0% BI: 8.3%
[libx264 @ 0x21ea280] 8x8 transform intra:66.9% inter:68.0%
[libx264 @ 0x21ea280] coded y,u,v intra: 45.1% 0.9% 0.3% inter: 8.8% 0.1% 0.0%
[libx264 @ 0x21ea280] i16 v,h,dc,p: 61% 31%  4%  4%
[libx264 @ 0x21ea280] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 31% 13% 29%  4%  4%  6%  3%  6%  4%
[libx264 @ 0x21ea280] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 29% 27% 12%  4%  6%  7%  5%  6%  4%
[libx264 @ 0x21ea280] Weighted P-Frames: Y:0.3% UV:0.2%
[libx264 @ 0x21ea280] ref P L0: 39.3% 13.3% 36.0% 11.3%  0.1%
[libx264 @ 0x21ea280] ref B L0: 68.3% 25.3%  6.4%
[libx264 @ 0x21ea280] ref B L1: 90.3%  9.7%
[libx264 @ 0x21ea280] kb/s:547.63


More information about the ffmpeg-user mailing list