<p>I am trying to replace an arbitrary color in a video with another arbitrary color. In this case I want to replace #72f3f2 (rgb(114,243,242)) with #7ccbd4 (rgb(124,203,212)) in a video file using ffmpeg.</p>

<p>I have tried using the <code>lutrgb</code> filter below which I derived <a href="https://video.stackexchange.com/questions/19696/how-to-change-every-black-pixel-to-a-special-color">from this question</a>, but it seems to have no effect.</p>

<p>How can I only replace the entire set of one RGB value with another?</p>

<pre class="lang-sh prettyprint-override"><code>$ ffmpeg -i in.mp4 -vf "format=rgb24,lutrgb=r='if(eq(val,45),49,val)':g='if(eq(val,95),80,val)':b='if(eq(val,95),83,val)'" -vcodec libx265 out.mp4
ffmpeg version 4.2.2-static https://johnvansickle.com/ffmpeg/  Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 8 (Debian 8.3.0-6)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gmp --enable-libgme --enable-gray --enable-libaom --enable-libfribidi --enable-libass --enable-libvmaf --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libdav1d --enable-libxvid --enable-libzvbi --enable-libzimg
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'in.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2mp41
    encoder         : Lavf58.29.100
  Duration: 00:00:30.00, start: 0.020000, bitrate: 2400 kb/s
    Stream #0:0(und): Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv, bt709), 2000x1126 [SAR 1:1 DAR 1000:563], 2324 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 29.97 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 143 kb/s (default)
    Metadata:
      handler_name    : Stereo
File 'out.mp4' already exists. Overwrite ? [y/N] y
Stream mapping:
  Stream #0:0 -&gt; #0:0 (hevc (native) -&gt; hevc (libx265))
  Stream #0:1 -&gt; #0:1 (aac (native) -&gt; aac (native))
Press [q] to stop, [?] for help
x265 [info]: HEVC encoder version 3.3+2-dd2464df2f40
x265 [info]: build info [Linux][GCC 8.3.0][64 bit] 8bit+10bit+12bit
x265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
x265 [warning]: halving the quality when psy-rd is enabled for 444 input. Setting cbQpOffset = 6 and crQpOffset = 6
x265 [info]: Main 4:4:4 profile, Level-5 (Main tier)
x265 [info]: Thread pool created using 8 threads
x265 [info]: Slices                              : 1
x265 [info]: frame threads / pool features       : 3 / wpp(18 rows)
x265 [info]: Coding QT: max CU size, min CU size : 64 / 8
x265 [info]: Residual QT: max TU size, max depth : 32 / 1 inter / 1 intra
x265 [info]: ME / range / subpel / merge         : hex / 57 / 2 / 3
x265 [info]: Keyframe min / max / scenecut / bias  : 25 / 250 / 40 / 5.00 
x265 [info]: Cb/Cr QP Offset                     : 6 / 6
x265 [info]: Lookahead / bframes / badapt        : 20 / 4 / 2
x265 [info]: b-pyramid / weightp / weightb       : 1 / 1 / 0
x265 [info]: References / ref-limit  cu / depth  : 3 / off / on
x265 [info]: AQ: mode / str / qg-size / cu-tree  : 2 / 1.0 / 32 / 1
x265 [info]: Rate Control / qCompress            : CRF-28.0 / 0.60
x265 [info]: tools: rd=3 psy-rd=2.00 early-skip rskip signhide tmvp b-intra
x265 [info]: tools: strong-intra-smoothing lslices=7 deblock sao
Output #0, mp4, to 'out.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2mp41
    encoder         : Lavf58.29.100
    Stream #0:0(und): Video: hevc (libx265) (hev1 / 0x31766568), gbrp, 2000x1126 [SAR 1:1 DAR 1000:563], q=2-31, 29.97 fps, 30k tbn, 29.97 tbc (default)
    Metadata:
      handler_name    : VideoHandler
      encoder         : Lavc58.54.100 libx265
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : Stereo
      encoder         : Lavc58.54.100 aac
frame=  901 fps= 15 q=-0.0 Lsize=    6979kB time=00:00:29.99 bitrate=1906.1kbits/s dup=32 drop=0 speed=0.492x    
video:6470kB audio:472kB subtitle:0kB other streams:0kB global headers:2kB muxing overhead: 0.524252%
x265 [info]: frame I:      6, Avg QP:27.55  kb/s: 9044.56 
x265 [info]: frame P:    222, Avg QP:29.70  kb/s: 5202.73 
x265 [info]: frame B:    673, Avg QP:35.37  kb/s: 562.33  
x265 [info]: Weighted P-Frames: Y:6.8% UV:6.8%
x265 [info]: consecutive B-frames: 4.8% 4.4% 3.5% 65.4% 21.9% 

encoded 901 frames in 60.78s (14.82 fps), 1762.18 kb/s, Avg QP:33.93
[aac @ 0x62b24c0] Qavg: 260.747

</code></pre>

<p>I've tried using RGB percent values (0-100) and RGB decimal values, as well as <code>lutyuv</code> filter to no avail.</p>

CC BY-SA 4.0
2020-04-15T05:45:55.970Z
How did you identify the source color values?
Gyan
CC BY-SA 4.0
2020-04-15T17:05:59.153Z
@Gyan taking a screenshot of one of the frames from `in.mp4` and then using the color picker in e.g. Photoshop
Jeff Mixon
CC BY-SA 4.0
2022-09-29T20:19:55.047Z
Try lutyuv filter instead of lutrgb?
Refer to:
https://ffmpeg.org/ffmpeg-filters.html#toc-lut_002c-lutrgb_002c-lutyuv
Bijou Smith
<ffmpeg>
How to use ffmpeg to replace a specific color with another color
Jeff Mixon
# How to use ffmpeg to replace a specific color with another color

(Asked by: username_0 on 2020-04-14)

I am trying to replace an arbitrary color in a video with another arbitrary color. In this case I want to replace #72f3f2 (rgb(114,243,242)) with #7ccbd4 (rgb(124,203,212)) in a video file using ffmpeg.
I have tried using the lutrgb filter below which I derived from this question, but it seems to have no effect.
How can I only replace the entire set of one RGB value with another?
$ ffmpeg -i in.mp4 -vf "format=rgb24,lutrgb=r='if(eq(val,45),49,val)':g='if(eq(val,95),80,val)':b='if(eq(val,95),83,val)'" -vcodec libx265 out.mp4
ffmpeg version 4.2.2-static https://johnvansickle.com/ffmpeg/  Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 8 (Debian 8.3.0-6)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gmp --enable-libgme --enable-gray --enable-libaom --enable-libfribidi --enable-libass --enable-libvmaf --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libdav1d --enable-libxvid --enable-libzvbi --enable-libzimg
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'in.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2mp41
    encoder         : Lavf58.29.100
  Duration: 00:00:30.00, start: 0.020000, bitrate: 2400 kb/s
    Stream #0:0(und): Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv, bt709), 2000x1126 [SAR 1:1 DAR 1000:563], 2324 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 29.97 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 143 kb/s (default)
    Metadata:
      handler_name    : Stereo
File 'out.mp4' already exists. Overwrite ? [y/N] y
Stream mapping:
  Stream #0:0 -> #0:0 (hevc (native) -> hevc (libx265))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
x265 [info]: HEVC encoder version 3.3+2-dd2464df2f40
x265 [info]: build info [Linux][GCC 8.3.0][64 bit] 8bit+10bit+12bit
x265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
x265 [warning]: halving the quality when psy-rd is enabled for 444 input. Setting cbQpOffset = 6 and crQpOffset = 6
x265 [info]: Main 4:4:4 profile, Level-5 (Main tier)
x265 [info]: Thread pool created using 8 threads
x265 [info]: Slices                              : 1
x265 [info]: frame threads / pool features       : 3 / wpp(18 rows)
x265 [info]: Coding QT: max CU size, min CU size : 64 / 8
x265 [info]: Residual QT: max TU size, max depth : 32 / 1 inter / 1 intra
x265 [info]: ME / range / subpel / merge         : hex / 57 / 2 / 3
x265 [info]: Keyframe min / max / scenecut / bias  : 25 / 250 / 40 / 5.00 
x265 [info]: Cb/Cr QP Offset                     : 6 / 6
x265 [info]: Lookahead / bframes / badapt        : 20 / 4 / 2
x265 [info]: b-pyramid / weightp / weightb       : 1 / 1 / 0
x265 [info]: References / ref-limit  cu / depth  : 3 / off / on
x265 [info]: AQ: mode / str / qg-size / cu-tree  : 2 / 1.0 / 32 / 1
x265 [info]: Rate Control / qCompress            : CRF-28.0 / 0.60
x265 [info]: tools: rd=3 psy-rd=2.00 early-skip rskip signhide tmvp b-intra
x265 [info]: tools: strong-intra-smoothing lslices=7 deblock sao
Output #0, mp4, to 'out.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2mp41
    encoder         : Lavf58.29.100
    Stream #0:0(und): Video: hevc (libx265) (hev1 / 0x31766568), gbrp, 2000x1126 [SAR 1:1 DAR 1000:563], q=2-31, 29.97 fps, 30k tbn, 29.97 tbc (default)
    Metadata:
      handler_name    : VideoHandler
      encoder         : Lavc58.54.100 libx265
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : Stereo
      encoder         : Lavc58.54.100 aac
frame=  901 fps= 15 q=-0.0 Lsize=    6979kB time=00:00:29.99 bitrate=1906.1kbits/s dup=32 drop=0 speed=0.492x    
video:6470kB audio:472kB subtitle:0kB other streams:0kB global headers:2kB muxing overhead: 0.524252%
x265 [info]: frame I:      6, Avg QP:27.55  kb/s: 9044.56 
x265 [info]: frame P:    222, Avg QP:29.70  kb/s: 5202.73 
x265 [info]: frame B:    673, Avg QP:35.37  kb/s: 562.33  
x265 [info]: Weighted P-Frames: Y:6.8% UV:6.8%
x265 [info]: consecutive B-frames: 4.8% 4.4% 3.5% 65.4% 21.9% 

encoded 901 frames in 60.78s (14.82 fps), 1762.18 kb/s, Avg QP:33.93
[aac @ 0x62b24c0] Qavg: 260.747


I've tried using RGB percent values (0-100) and RGB decimal values, as well as lutyuv filter to no avail.

**Tags:** ffmpeg

> **Comments:**
> **username_1**: How did you identify the source color values?  
> **username_0**: @username_1 taking a screenshot of one of the frames from `in.mp4` and then using the color picker in e.g. Photoshop  
> **username_2**: Try lutyuv filter instead of lutrgb? Refer to: https://ffmpeg.org/ffmpeg-filters.html#toc-lut_002c-lutrgb_002c-lutyuv  

---

## 0 answers

