Body: <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>
  
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2020-04-15T05:45:55.970Z
Comments.Text: How did you identify the source color values?
Comments.UserDisplayName: Gyan
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2020-04-15T17:05:59.153Z
Comments.Text: @Gyan taking a screenshot of one of the frames from `in.mp4` and then using the color picker in e.g. Photoshop
Comments.UserDisplayName: Jeff Mixon
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2022-09-29T20:19:55.047Z
Comments.Text: Try lutyuv filter instead of lutrgb?
  Refer to:
  https://ffmpeg.org/ffmpeg-filters.html#toc-lut_002c-lutrgb_002c-lutyuv
Comments.UserDisplayName: Bijou Smith
Tags: <ffmpeg>
Title: How to use ffmpeg to replace a specific color with another color
UserDisplayName: Jeff Mixon
ThreadText: # 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](https://video.stackexchange.com/questions/19696/how-to-change-every-black-pixel-to-a-special-color), but it seems to have no effect.
  
  How can I only replace the entire set of one RGB value with another?
  
  ```sh
  $ 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
  
  