<!DOCTYPE html> <!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> <!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>PIL.ImageFilter — Pillow (PIL Fork) 5.4.1 documentation</title> <script type="text/javascript" src="../../_static/js/modernizr.min.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script> <script type="text/javascript" src="../../_static/jquery.js"></script> <script type="text/javascript" src="../../_static/underscore.js"></script> <script type="text/javascript" src="../../_static/doctools.js"></script> <script type="text/javascript" src="../../_static/language_data.js"></script> <script type="text/javascript" src="../../_static/js/script.js"></script> <script type="text/javascript" src="../../_static/js/theme.js"></script> <link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" /> <link rel="author" title="About these documents" href="../../about.html" /> <link rel="index" title="Index" href="../../genindex.html" /> <link rel="search" title="Search" href="../../search.html" /> </head> <body class="wy-body-for-nav"> <div class="wy-grid-for-nav"> <nav data-toggle="wy-nav-shift" class="wy-nav-side"> <div class="wy-side-scroll"> <div class="wy-side-nav-search" > <a href="../../index.html" class="icon icon-home"> Pillow (PIL Fork) </a> <div class="version"> 5.4.1 </div> <div role="search"> <form id="rtd-search-form" class="wy-form" action="../../search.html" method="get"> <input type="text" name="q" placeholder="Search docs" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> </div> </div> <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> <ul> <li class="toctree-l1"><a class="reference internal" href="../../installation.html">Installation</a></li> <li class="toctree-l1"><a class="reference internal" href="../../handbook/index.html">Handbook</a></li> <li class="toctree-l1"><a class="reference internal" href="../../reference/index.html">Reference</a></li> <li class="toctree-l1"><a class="reference internal" href="../../porting.html">Porting</a></li> <li class="toctree-l1"><a class="reference internal" href="../../about.html">About</a></li> <li class="toctree-l1"><a class="reference internal" href="../../releasenotes/index.html">Release Notes</a></li> <li class="toctree-l1"><a class="reference internal" href="../../deprecations.html">Deprecations and removals</a></li> </ul> </div> </div> </nav> <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> <nav class="wy-nav-top" aria-label="top navigation"> <i data-toggle="wy-nav-top" class="fa fa-bars"></i> <a href="../../index.html">Pillow (PIL Fork)</a> </nav> <div class="wy-nav-content"> <div class="rst-content"> <div role="navigation" aria-label="breadcrumbs navigation"> <ul class="wy-breadcrumbs"> <li><a href="../../index.html">Docs</a> »</li> <li><a href="../index.html">Module code</a> »</li> <li>PIL.ImageFilter</li> <li class="wy-breadcrumbs-aside"> </li> </ul> <hr/> </div> <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div itemprop="articleBody"> <h1>Source code for PIL.ImageFilter</h1><div class="highlight"><pre> <span></span><span class="c1">#</span> <span class="c1"># The Python Imaging Library.</span> <span class="c1"># $Id$</span> <span class="c1">#</span> <span class="c1"># standard filters</span> <span class="c1">#</span> <span class="c1"># History:</span> <span class="c1"># 1995-11-27 fl Created</span> <span class="c1"># 2002-06-08 fl Added rank and mode filters</span> <span class="c1"># 2003-09-15 fl Fixed rank calculation in rank filter; added expand call</span> <span class="c1">#</span> <span class="c1"># Copyright (c) 1997-2003 by Secret Labs AB.</span> <span class="c1"># Copyright (c) 1995-2002 by Fredrik Lundh.</span> <span class="c1">#</span> <span class="c1"># See the README file for information on usage and redistribution.</span> <span class="c1">#</span> <span class="kn">from</span> <span class="nn">__future__</span> <span class="k">import</span> <span class="n">division</span> <span class="kn">import</span> <span class="nn">functools</span> <span class="k">try</span><span class="p">:</span> <span class="kn">import</span> <span class="nn">numpy</span> <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span> <span class="c1"># pragma: no cover</span> <span class="n">numpy</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">class</span> <span class="nc">Filter</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="k">pass</span> <span class="k">class</span> <span class="nc">MultibandFilter</span><span class="p">(</span><span class="n">Filter</span><span class="p">):</span> <span class="k">pass</span> <span class="k">class</span> <span class="nc">BuiltinFilter</span><span class="p">(</span><span class="n">MultibandFilter</span><span class="p">):</span> <span class="k">def</span> <span class="nf">filter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">image</span><span class="p">):</span> <span class="k">if</span> <span class="n">image</span><span class="o">.</span><span class="n">mode</span> <span class="o">==</span> <span class="s2">"P"</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"cannot filter palette images"</span><span class="p">)</span> <span class="k">return</span> <span class="n">image</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">filterargs</span><span class="p">)</span> <div class="viewcode-block" id="Kernel"><a class="viewcode-back" href="../../reference/ImageFilter.html#PIL.ImageFilter.Kernel">[docs]</a><span class="k">class</span> <span class="nc">Kernel</span><span class="p">(</span><span class="n">BuiltinFilter</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Create a convolution kernel. The current version only</span> <span class="sd"> supports 3x3 and 5x5 integer and floating point kernels.</span> <span class="sd"> In the current version, kernels can only be applied to</span> <span class="sd"> "L" and "RGB" images.</span> <span class="sd"> :param size: Kernel size, given as (width, height). In the current</span> <span class="sd"> version, this must be (3,3) or (5,5).</span> <span class="sd"> :param kernel: A sequence containing kernel weights.</span> <span class="sd"> :param scale: Scale factor. If given, the result for each pixel is</span> <span class="sd"> divided by this value. the default is the sum of the</span> <span class="sd"> kernel weights.</span> <span class="sd"> :param offset: Offset. If given, this value is added to the result,</span> <span class="sd"> after it has been divided by the scale factor.</span> <span class="sd"> """</span> <span class="n">name</span> <span class="o">=</span> <span class="s2">"Kernel"</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">kernel</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">offset</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span> <span class="k">if</span> <span class="n">scale</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="c1"># default scale is sum of kernel</span> <span class="n">scale</span> <span class="o">=</span> <span class="n">functools</span><span class="o">.</span><span class="n">reduce</span><span class="p">(</span><span class="k">lambda</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="n">a</span><span class="o">+</span><span class="n">b</span><span class="p">,</span> <span class="n">kernel</span><span class="p">)</span> <span class="k">if</span> <span class="n">size</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="n">size</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">kernel</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"not enough coefficients in kernel"</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">filterargs</span> <span class="o">=</span> <span class="n">size</span><span class="p">,</span> <span class="n">scale</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">kernel</span></div> <div class="viewcode-block" id="RankFilter"><a class="viewcode-back" href="../../reference/ImageFilter.html#PIL.ImageFilter.RankFilter">[docs]</a><span class="k">class</span> <span class="nc">RankFilter</span><span class="p">(</span><span class="n">Filter</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Create a rank filter. The rank filter sorts all pixels in</span> <span class="sd"> a window of the given size, and returns the **rank**'th value.</span> <span class="sd"> :param size: The kernel size, in pixels.</span> <span class="sd"> :param rank: What pixel value to pick. Use 0 for a min filter,</span> <span class="sd"> ``size * size / 2`` for a median filter, ``size * size - 1``</span> <span class="sd"> for a max filter, etc.</span> <span class="sd"> """</span> <span class="n">name</span> <span class="o">=</span> <span class="s2">"Rank"</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">rank</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="n">size</span> <span class="bp">self</span><span class="o">.</span><span class="n">rank</span> <span class="o">=</span> <span class="n">rank</span> <span class="k">def</span> <span class="nf">filter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">image</span><span class="p">):</span> <span class="k">if</span> <span class="n">image</span><span class="o">.</span><span class="n">mode</span> <span class="o">==</span> <span class="s2">"P"</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"cannot filter palette images"</span><span class="p">)</span> <span class="n">image</span> <span class="o">=</span> <span class="n">image</span><span class="o">.</span><span class="n">expand</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="o">//</span><span class="mi">2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="o">//</span><span class="mi">2</span><span class="p">)</span> <span class="k">return</span> <span class="n">image</span><span class="o">.</span><span class="n">rankfilter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rank</span><span class="p">)</span></div> <div class="viewcode-block" id="MedianFilter"><a class="viewcode-back" href="../../reference/ImageFilter.html#PIL.ImageFilter.MedianFilter">[docs]</a><span class="k">class</span> <span class="nc">MedianFilter</span><span class="p">(</span><span class="n">RankFilter</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Create a median filter. Picks the median pixel value in a window with the</span> <span class="sd"> given size.</span> <span class="sd"> :param size: The kernel size, in pixels.</span> <span class="sd"> """</span> <span class="n">name</span> <span class="o">=</span> <span class="s2">"Median"</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="mi">3</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="n">size</span> <span class="bp">self</span><span class="o">.</span><span class="n">rank</span> <span class="o">=</span> <span class="n">size</span><span class="o">*</span><span class="n">size</span><span class="o">//</span><span class="mi">2</span></div> <div class="viewcode-block" id="MinFilter"><a class="viewcode-back" href="../../reference/ImageFilter.html#PIL.ImageFilter.MinFilter">[docs]</a><span class="k">class</span> <span class="nc">MinFilter</span><span class="p">(</span><span class="n">RankFilter</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Create a min filter. Picks the lowest pixel value in a window with the</span> <span class="sd"> given size.</span> <span class="sd"> :param size: The kernel size, in pixels.</span> <span class="sd"> """</span> <span class="n">name</span> <span class="o">=</span> <span class="s2">"Min"</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="mi">3</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="n">size</span> <span class="bp">self</span><span class="o">.</span><span class="n">rank</span> <span class="o">=</span> <span class="mi">0</span></div> <div class="viewcode-block" id="MaxFilter"><a class="viewcode-back" href="../../reference/ImageFilter.html#PIL.ImageFilter.MaxFilter">[docs]</a><span class="k">class</span> <span class="nc">MaxFilter</span><span class="p">(</span><span class="n">RankFilter</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Create a max filter. Picks the largest pixel value in a window with the</span> <span class="sd"> given size.</span> <span class="sd"> :param size: The kernel size, in pixels.</span> <span class="sd"> """</span> <span class="n">name</span> <span class="o">=</span> <span class="s2">"Max"</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="mi">3</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="n">size</span> <span class="bp">self</span><span class="o">.</span><span class="n">rank</span> <span class="o">=</span> <span class="n">size</span><span class="o">*</span><span class="n">size</span><span class="o">-</span><span class="mi">1</span></div> <div class="viewcode-block" id="ModeFilter"><a class="viewcode-back" href="../../reference/ImageFilter.html#PIL.ImageFilter.ModeFilter">[docs]</a><span class="k">class</span> <span class="nc">ModeFilter</span><span class="p">(</span><span class="n">Filter</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Create a mode filter. Picks the most frequent pixel value in a box with the</span> <span class="sd"> given size. Pixel values that occur only once or twice are ignored; if no</span> <span class="sd"> pixel value occurs more than twice, the original pixel value is preserved.</span> <span class="sd"> :param size: The kernel size, in pixels.</span> <span class="sd"> """</span> <span class="n">name</span> <span class="o">=</span> <span class="s2">"Mode"</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="mi">3</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="n">size</span> <span class="k">def</span> <span class="nf">filter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">image</span><span class="p">):</span> <span class="k">return</span> <span class="n">image</span><span class="o">.</span><span class="n">modefilter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">)</span></div> <div class="viewcode-block" id="GaussianBlur"><a class="viewcode-back" href="../../reference/ImageFilter.html#PIL.ImageFilter.GaussianBlur">[docs]</a><span class="k">class</span> <span class="nc">GaussianBlur</span><span class="p">(</span><span class="n">MultibandFilter</span><span class="p">):</span> <span class="sd">"""Gaussian blur filter.</span> <span class="sd"> :param radius: Blur radius.</span> <span class="sd"> """</span> <span class="n">name</span> <span class="o">=</span> <span class="s2">"GaussianBlur"</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">radius</span><span class="o">=</span><span class="mi">2</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">radius</span> <span class="o">=</span> <span class="n">radius</span> <span class="k">def</span> <span class="nf">filter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">image</span><span class="p">):</span> <span class="k">return</span> <span class="n">image</span><span class="o">.</span><span class="n">gaussian_blur</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">radius</span><span class="p">)</span></div> <div class="viewcode-block" id="BoxBlur"><a class="viewcode-back" href="../../reference/ImageFilter.html#PIL.ImageFilter.BoxBlur">[docs]</a><span class="k">class</span> <span class="nc">BoxBlur</span><span class="p">(</span><span class="n">MultibandFilter</span><span class="p">):</span> <span class="sd">"""Blurs the image by setting each pixel to the average value of the pixels</span> <span class="sd"> in a square box extending radius pixels in each direction.</span> <span class="sd"> Supports float radius of arbitrary size. Uses an optimized implementation</span> <span class="sd"> which runs in linear time relative to the size of the image</span> <span class="sd"> for any radius value.</span> <span class="sd"> :param radius: Size of the box in one direction. Radius 0 does not blur,</span> <span class="sd"> returns an identical image. Radius 1 takes 1 pixel</span> <span class="sd"> in each direction, i.e. 9 pixels in total.</span> <span class="sd"> """</span> <span class="n">name</span> <span class="o">=</span> <span class="s2">"BoxBlur"</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">radius</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">radius</span> <span class="o">=</span> <span class="n">radius</span> <span class="k">def</span> <span class="nf">filter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">image</span><span class="p">):</span> <span class="k">return</span> <span class="n">image</span><span class="o">.</span><span class="n">box_blur</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">radius</span><span class="p">)</span></div> <div class="viewcode-block" id="UnsharpMask"><a class="viewcode-back" href="../../reference/ImageFilter.html#PIL.ImageFilter.UnsharpMask">[docs]</a><span class="k">class</span> <span class="nc">UnsharpMask</span><span class="p">(</span><span class="n">MultibandFilter</span><span class="p">):</span> <span class="sd">"""Unsharp mask filter.</span> <span class="sd"> See Wikipedia's entry on `digital unsharp masking`_ for an explanation of</span> <span class="sd"> the parameters.</span> <span class="sd"> :param radius: Blur Radius</span> <span class="sd"> :param percent: Unsharp strength, in percent</span> <span class="sd"> :param threshold: Threshold controls the minimum brightness change that</span> <span class="sd"> will be sharpened</span> <span class="sd"> .. _digital unsharp masking: https://en.wikipedia.org/wiki/Unsharp_masking#Digital_unsharp_masking</span> <span class="sd"> """</span> <span class="c1"># noqa: E501</span> <span class="n">name</span> <span class="o">=</span> <span class="s2">"UnsharpMask"</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">radius</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">percent</span><span class="o">=</span><span class="mi">150</span><span class="p">,</span> <span class="n">threshold</span><span class="o">=</span><span class="mi">3</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">radius</span> <span class="o">=</span> <span class="n">radius</span> <span class="bp">self</span><span class="o">.</span><span class="n">percent</span> <span class="o">=</span> <span class="n">percent</span> <span class="bp">self</span><span class="o">.</span><span class="n">threshold</span> <span class="o">=</span> <span class="n">threshold</span> <span class="k">def</span> <span class="nf">filter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">image</span><span class="p">):</span> <span class="k">return</span> <span class="n">image</span><span class="o">.</span><span class="n">unsharp_mask</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">radius</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">percent</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">threshold</span><span class="p">)</span></div> <span class="k">class</span> <span class="nc">BLUR</span><span class="p">(</span><span class="n">BuiltinFilter</span><span class="p">):</span> <span class="n">name</span> <span class="o">=</span> <span class="s2">"Blur"</span> <span class="n">filterargs</span> <span class="o">=</span> <span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span> <span class="p">)</span> <span class="k">class</span> <span class="nc">CONTOUR</span><span class="p">(</span><span class="n">BuiltinFilter</span><span class="p">):</span> <span class="n">name</span> <span class="o">=</span> <span class="s2">"Contour"</span> <span class="n">filterargs</span> <span class="o">=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="p">(</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span> <span class="p">)</span> <span class="k">class</span> <span class="nc">DETAIL</span><span class="p">(</span><span class="n">BuiltinFilter</span><span class="p">):</span> <span class="n">name</span> <span class="o">=</span> <span class="s2">"Detail"</span> <span class="n">filterargs</span> <span class="o">=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span> <span class="p">)</span> <span class="k">class</span> <span class="nc">EDGE_ENHANCE</span><span class="p">(</span><span class="n">BuiltinFilter</span><span class="p">):</span> <span class="n">name</span> <span class="o">=</span> <span class="s2">"Edge-enhance"</span> <span class="n">filterargs</span> <span class="o">=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span> <span class="p">)</span> <span class="k">class</span> <span class="nc">EDGE_ENHANCE_MORE</span><span class="p">(</span><span class="n">BuiltinFilter</span><span class="p">):</span> <span class="n">name</span> <span class="o">=</span> <span class="s2">"Edge-enhance More"</span> <span class="n">filterargs</span> <span class="o">=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span> <span class="p">)</span> <span class="k">class</span> <span class="nc">EMBOSS</span><span class="p">(</span><span class="n">BuiltinFilter</span><span class="p">):</span> <span class="n">name</span> <span class="o">=</span> <span class="s2">"Emboss"</span> <span class="n">filterargs</span> <span class="o">=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">128</span><span class="p">,</span> <span class="p">(</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span> <span class="p">)</span> <span class="k">class</span> <span class="nc">FIND_EDGES</span><span class="p">(</span><span class="n">BuiltinFilter</span><span class="p">):</span> <span class="n">name</span> <span class="o">=</span> <span class="s2">"Find Edges"</span> <span class="n">filterargs</span> <span class="o">=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span> <span class="p">)</span> <span class="k">class</span> <span class="nc">SHARPEN</span><span class="p">(</span><span class="n">BuiltinFilter</span><span class="p">):</span> <span class="n">name</span> <span class="o">=</span> <span class="s2">"Sharpen"</span> <span class="n">filterargs</span> <span class="o">=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span> <span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span> <span class="p">)</span> <span class="k">class</span> <span class="nc">SMOOTH</span><span class="p">(</span><span class="n">BuiltinFilter</span><span class="p">):</span> <span class="n">name</span> <span class="o">=</span> <span class="s2">"Smooth"</span> <span class="n">filterargs</span> <span class="o">=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="mi">13</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span> <span class="p">)</span> <span class="k">class</span> <span class="nc">SMOOTH_MORE</span><span class="p">(</span><span class="n">BuiltinFilter</span><span class="p">):</span> <span class="n">name</span> <span class="o">=</span> <span class="s2">"Smooth More"</span> <span class="n">filterargs</span> <span class="o">=</span> <span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">44</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span> <span class="p">)</span> <div class="viewcode-block" id="Color3DLUT"><a class="viewcode-back" href="../../reference/ImageFilter.html#PIL.ImageFilter.Color3DLUT">[docs]</a><span class="k">class</span> <span class="nc">Color3DLUT</span><span class="p">(</span><span class="n">MultibandFilter</span><span class="p">):</span> <span class="sd">"""Three-dimensional color lookup table.</span> <span class="sd"> Transforms 3-channel pixels using the values of the channels as coordinates</span> <span class="sd"> in the 3D lookup table and interpolating the nearest elements.</span> <span class="sd"> This method allows you to apply almost any color transformation</span> <span class="sd"> in constant time by using pre-calculated decimated tables.</span> <span class="sd"> .. versionadded:: 5.2.0</span> <span class="sd"> :param size: Size of the table. One int or tuple of (int, int, int).</span> <span class="sd"> Minimal size in any dimension is 2, maximum is 65.</span> <span class="sd"> :param table: Flat lookup table. A list of ``channels * size**3``</span> <span class="sd"> float elements or a list of ``size**3`` channels-sized</span> <span class="sd"> tuples with floats. Channels are changed first,</span> <span class="sd"> then first dimension, then second, then third.</span> <span class="sd"> Value 0.0 corresponds lowest value of output, 1.0 highest.</span> <span class="sd"> :param channels: Number of channels in the table. Could be 3 or 4.</span> <span class="sd"> Default is 3.</span> <span class="sd"> :param target_mode: A mode for the result image. Should have not less</span> <span class="sd"> than ``channels`` channels. Default is ``None``,</span> <span class="sd"> which means that mode wouldn't be changed.</span> <span class="sd"> """</span> <span class="n">name</span> <span class="o">=</span> <span class="s2">"Color 3D LUT"</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">table</span><span class="p">,</span> <span class="n">channels</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">target_mode</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="k">if</span> <span class="n">channels</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Only 3 or 4 output channels are supported"</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="n">size</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_check_size</span><span class="p">(</span><span class="n">size</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">channels</span> <span class="o">=</span> <span class="n">channels</span> <span class="bp">self</span><span class="o">.</span><span class="n">mode</span> <span class="o">=</span> <span class="n">target_mode</span> <span class="c1"># Hidden flag `_copy_table=False` could be used to avoid extra copying</span> <span class="c1"># of the table if the table is specially made for the constructor.</span> <span class="n">copy_table</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'_copy_table'</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span> <span class="n">items</span> <span class="o">=</span> <span class="n">size</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="n">size</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">*</span> <span class="n">size</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="n">wrong_size</span> <span class="o">=</span> <span class="kc">False</span> <span class="k">if</span> <span class="n">numpy</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">table</span><span class="p">,</span> <span class="n">numpy</span><span class="o">.</span><span class="n">ndarray</span><span class="p">):</span> <span class="k">if</span> <span class="n">copy_table</span><span class="p">:</span> <span class="n">table</span> <span class="o">=</span> <span class="n">table</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="k">if</span> <span class="n">table</span><span class="o">.</span><span class="n">shape</span> <span class="ow">in</span> <span class="p">[(</span><span class="n">items</span> <span class="o">*</span> <span class="n">channels</span><span class="p">,),</span> <span class="p">(</span><span class="n">items</span><span class="p">,</span> <span class="n">channels</span><span class="p">),</span> <span class="p">(</span><span class="n">size</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">size</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">size</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">channels</span><span class="p">)]:</span> <span class="n">table</span> <span class="o">=</span> <span class="n">table</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">items</span> <span class="o">*</span> <span class="n">channels</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">wrong_size</span> <span class="o">=</span> <span class="kc">True</span> <span class="k">else</span><span class="p">:</span> <span class="k">if</span> <span class="n">copy_table</span><span class="p">:</span> <span class="n">table</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">table</span><span class="p">)</span> <span class="c1"># Convert to a flat list</span> <span class="k">if</span> <span class="n">table</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">table</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)):</span> <span class="n">table</span><span class="p">,</span> <span class="n">raw_table</span> <span class="o">=</span> <span class="p">[],</span> <span class="n">table</span> <span class="k">for</span> <span class="n">pixel</span> <span class="ow">in</span> <span class="n">raw_table</span><span class="p">:</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">pixel</span><span class="p">)</span> <span class="o">!=</span> <span class="n">channels</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span> <span class="s2">"The elements of the table should "</span> <span class="s2">"have a length of </span><span class="si">{}</span><span class="s2">."</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">channels</span><span class="p">))</span> <span class="n">table</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">pixel</span><span class="p">)</span> <span class="k">if</span> <span class="n">wrong_size</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">table</span><span class="p">)</span> <span class="o">!=</span> <span class="n">items</span> <span class="o">*</span> <span class="n">channels</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span> <span class="s2">"The table should have either channels * size**3 float items "</span> <span class="s2">"or size**3 items of channels-sized tuples with floats. "</span> <span class="s2">"Table should be: </span><span class="si">{}</span><span class="s2">x</span><span class="si">{}</span><span class="s2">x</span><span class="si">{}</span><span class="s2">x</span><span class="si">{}</span><span class="s2">. Actual length: </span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span> <span class="n">channels</span><span class="p">,</span> <span class="n">size</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">size</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">size</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="nb">len</span><span class="p">(</span><span class="n">table</span><span class="p">)))</span> <span class="bp">self</span><span class="o">.</span><span class="n">table</span> <span class="o">=</span> <span class="n">table</span> <span class="nd">@staticmethod</span> <span class="k">def</span> <span class="nf">_check_size</span><span class="p">(</span><span class="n">size</span><span class="p">):</span> <span class="k">try</span><span class="p">:</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">size</span> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Size should be either an integer or "</span> <span class="s2">"a tuple of three integers."</span><span class="p">)</span> <span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span> <span class="n">size</span> <span class="o">=</span> <span class="p">(</span><span class="n">size</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span> <span class="n">size</span> <span class="o">=</span> <span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">size</span><span class="p">]</span> <span class="k">for</span> <span class="n">size1D</span> <span class="ow">in</span> <span class="n">size</span><span class="p">:</span> <span class="k">if</span> <span class="ow">not</span> <span class="mi">2</span> <span class="o"><=</span> <span class="n">size1D</span> <span class="o"><=</span> <span class="mi">65</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Size should be in [2, 65] range."</span><span class="p">)</span> <span class="k">return</span> <span class="n">size</span> <span class="nd">@classmethod</span> <span class="k">def</span> <span class="nf">generate</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">channels</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">target_mode</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="sd">"""Generates new LUT using provided callback.</span> <span class="sd"> :param size: Size of the table. Passed to the constructor.</span> <span class="sd"> :param callback: Function with three parameters which correspond</span> <span class="sd"> three color channels. Will be called ``size**3``</span> <span class="sd"> times with values from 0.0 to 1.0 and should return</span> <span class="sd"> a tuple with ``channels`` elements.</span> <span class="sd"> :param channels: The number of channels which should return callback.</span> <span class="sd"> :param target_mode: Passed to the constructor of the resulting</span> <span class="sd"> lookup table.</span> <span class="sd"> """</span> <span class="n">size1D</span><span class="p">,</span> <span class="n">size2D</span><span class="p">,</span> <span class="n">size3D</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_check_size</span><span class="p">(</span><span class="n">size</span><span class="p">)</span> <span class="k">if</span> <span class="n">channels</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Only 3 or 4 output channels are supported"</span><span class="p">)</span> <span class="n">table</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="n">size1D</span> <span class="o">*</span> <span class="n">size2D</span> <span class="o">*</span> <span class="n">size3D</span> <span class="o">*</span> <span class="n">channels</span><span class="p">)</span> <span class="n">idx_out</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">size3D</span><span class="p">):</span> <span class="k">for</span> <span class="n">g</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">size2D</span><span class="p">):</span> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">size1D</span><span class="p">):</span> <span class="n">table</span><span class="p">[</span><span class="n">idx_out</span><span class="p">:</span><span class="n">idx_out</span> <span class="o">+</span> <span class="n">channels</span><span class="p">]</span> <span class="o">=</span> <span class="n">callback</span><span class="p">(</span> <span class="n">r</span> <span class="o">/</span> <span class="p">(</span><span class="n">size1D</span><span class="o">-</span><span class="mi">1</span><span class="p">),</span> <span class="n">g</span> <span class="o">/</span> <span class="p">(</span><span class="n">size2D</span><span class="o">-</span><span class="mi">1</span><span class="p">),</span> <span class="n">b</span> <span class="o">/</span> <span class="p">(</span><span class="n">size3D</span><span class="o">-</span><span class="mi">1</span><span class="p">))</span> <span class="n">idx_out</span> <span class="o">+=</span> <span class="n">channels</span> <span class="k">return</span> <span class="bp">cls</span><span class="p">((</span><span class="n">size1D</span><span class="p">,</span> <span class="n">size2D</span><span class="p">,</span> <span class="n">size3D</span><span class="p">),</span> <span class="n">table</span><span class="p">,</span> <span class="n">channels</span><span class="o">=</span><span class="n">channels</span><span class="p">,</span> <span class="n">target_mode</span><span class="o">=</span><span class="n">target_mode</span><span class="p">,</span> <span class="n">_copy_table</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> <span class="k">def</span> <span class="nf">transform</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">with_normals</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">channels</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">target_mode</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="sd">"""Transforms the table values using provided callback and returns</span> <span class="sd"> a new LUT with altered values.</span> <span class="sd"> :param callback: A function which takes old lookup table values</span> <span class="sd"> and returns a new set of values. The number</span> <span class="sd"> of arguments which function should take is</span> <span class="sd"> ``self.channels`` or ``3 + self.channels``</span> <span class="sd"> if ``with_normals`` flag is set.</span> <span class="sd"> Should return a tuple of ``self.channels`` or</span> <span class="sd"> ``channels`` elements if it is set.</span> <span class="sd"> :param with_normals: If true, ``callback`` will be called with</span> <span class="sd"> coordinates in the color cube as the first</span> <span class="sd"> three arguments. Otherwise, ``callback``</span> <span class="sd"> will be called only with actual color values.</span> <span class="sd"> :param channels: The number of channels in the resulting lookup table.</span> <span class="sd"> :param target_mode: Passed to the constructor of the resulting</span> <span class="sd"> lookup table.</span> <span class="sd"> """</span> <span class="k">if</span> <span class="n">channels</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Only 3 or 4 output channels are supported"</span><span class="p">)</span> <span class="n">ch_in</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">channels</span> <span class="n">ch_out</span> <span class="o">=</span> <span class="n">channels</span> <span class="ow">or</span> <span class="n">ch_in</span> <span class="n">size1D</span><span class="p">,</span> <span class="n">size2D</span><span class="p">,</span> <span class="n">size3D</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="n">table</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="n">size1D</span> <span class="o">*</span> <span class="n">size2D</span> <span class="o">*</span> <span class="n">size3D</span> <span class="o">*</span> <span class="n">ch_out</span><span class="p">)</span> <span class="n">idx_in</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">idx_out</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">size3D</span><span class="p">):</span> <span class="k">for</span> <span class="n">g</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">size2D</span><span class="p">):</span> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">size1D</span><span class="p">):</span> <span class="n">values</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">table</span><span class="p">[</span><span class="n">idx_in</span><span class="p">:</span><span class="n">idx_in</span> <span class="o">+</span> <span class="n">ch_in</span><span class="p">]</span> <span class="k">if</span> <span class="n">with_normals</span><span class="p">:</span> <span class="n">values</span> <span class="o">=</span> <span class="n">callback</span><span class="p">(</span><span class="n">r</span> <span class="o">/</span> <span class="p">(</span><span class="n">size1D</span><span class="o">-</span><span class="mi">1</span><span class="p">),</span> <span class="n">g</span> <span class="o">/</span> <span class="p">(</span><span class="n">size2D</span><span class="o">-</span><span class="mi">1</span><span class="p">),</span> <span class="n">b</span> <span class="o">/</span> <span class="p">(</span><span class="n">size3D</span><span class="o">-</span><span class="mi">1</span><span class="p">),</span> <span class="o">*</span><span class="n">values</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">values</span> <span class="o">=</span> <span class="n">callback</span><span class="p">(</span><span class="o">*</span><span class="n">values</span><span class="p">)</span> <span class="n">table</span><span class="p">[</span><span class="n">idx_out</span><span class="p">:</span><span class="n">idx_out</span> <span class="o">+</span> <span class="n">ch_out</span><span class="p">]</span> <span class="o">=</span> <span class="n">values</span> <span class="n">idx_in</span> <span class="o">+=</span> <span class="n">ch_in</span> <span class="n">idx_out</span> <span class="o">+=</span> <span class="n">ch_out</span> <span class="k">return</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)(</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">,</span> <span class="n">table</span><span class="p">,</span> <span class="n">channels</span><span class="o">=</span><span class="n">ch_out</span><span class="p">,</span> <span class="n">target_mode</span><span class="o">=</span><span class="n">target_mode</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">mode</span><span class="p">,</span> <span class="n">_copy_table</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">r</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">"</span><span class="si">{}</span><span class="s2"> from </span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">table</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">),</span> <span class="s2">"size=</span><span class="si">{:d}</span><span class="s2">x</span><span class="si">{:d}</span><span class="s2">x</span><span class="si">{:d}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">),</span> <span class="s2">"channels=</span><span class="si">{:d}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">channels</span><span class="p">),</span> <span class="p">]</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">mode</span><span class="p">:</span> <span class="n">r</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"target_mode=</span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mode</span><span class="p">))</span> <span class="k">return</span> <span class="s2">"<</span><span class="si">{}</span><span class="s2">>"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s2">" "</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">r</span><span class="p">))</span> <span class="k">def</span> <span class="nf">filter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">image</span><span class="p">):</span> <span class="kn">from</span> <span class="nn">.</span> <span class="k">import</span> <span class="n">Image</span> <span class="k">return</span> <span class="n">image</span><span class="o">.</span><span class="n">color_lut_3d</span><span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">mode</span> <span class="ow">or</span> <span class="n">image</span><span class="o">.</span><span class="n">mode</span><span class="p">,</span> <span class="n">Image</span><span class="o">.</span><span class="n">LINEAR</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">channels</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">table</span><span class="p">)</span></div> </pre></div> </div> </div> <footer> <hr/> <div role="contentinfo"> <p> © Copyright 1995-2011 Fredrik Lundh, 2010-2018 Alex Clark and Contributors </p> </div> Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. </footer> </div> </div> </section> </div> <script type="text/javascript"> jQuery(function () { SphinxRtdTheme.Navigation.enable(true); }); </script> </body> </html>