Parcourir la source

Merge branch 'feature/FR_IQA' into develop

Jérôme BUISINE il y a 5 ans
Parent
commit
bb0867cec8

BIN
docs/build/doctrees/environment.pickle


BIN
docs/build/doctrees/ipfml.doctree


+ 30 - 1
docs/build/html/_sources/ipfml.rst.txt

@@ -1,6 +1,7 @@
 Documentation
 =============
 
+
 ipfml.metrics
 ---------------------------
 
@@ -8,6 +9,7 @@ ipfml.metrics
     :members:
     :show-inheritance:
 
+
 ipfml.processing
 ---------------------------
 
@@ -25,4 +27,31 @@ ipfml.filters.noise
 .. automodule:: ipfml.filters.noise
     :members:
     :show-inheritance:
- 
+
+
+ipfml.iqa
+---------------------------
+
+ipfml.iqa.fr
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: ipfml.iqa.fr
+    :members:
+    :show-inheritance:
+
+
+ipfml.utils
+---------------------------
+
+.. automodule:: ipfml.utils
+    :members:
+    :show-inheritance:
+
+
+ipfml.exceptions
+---------------------------
+
+.. automodule:: ipfml.exceptions
+    :members:
+    :show-inheritance:
+

+ 41 - 3
docs/build/html/genindex.html

@@ -164,8 +164,10 @@
  | <a href="#L"><strong>L</strong></a>
  | <a href="#M"><strong>M</strong></a>
  | <a href="#N"><strong>N</strong></a>
+ | <a href="#P"><strong>P</strong></a>
  | <a href="#R"><strong>R</strong></a>
  | <a href="#S"><strong>S</strong></a>
+ | <a href="#V"><strong>V</strong></a>
  | <a href="#W"><strong>W</strong></a>
  
 </div>
@@ -236,13 +238,19 @@
 <h2 id="I">I</h2>
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="ipfml.html#module-ipfml.exceptions">ipfml.exceptions (module)</a>
+</li>
       <li><a href="ipfml.html#module-ipfml.filters.noise">ipfml.filters.noise (module)</a>
+</li>
+      <li><a href="ipfml.html#module-ipfml.iqa.fr">ipfml.iqa.fr (module)</a>
 </li>
   </ul></td>
   <td style="width: 33%; vertical-align: top;"><ul>
       <li><a href="ipfml.html#module-ipfml.metrics">ipfml.metrics (module)</a>
 </li>
       <li><a href="ipfml.html#module-ipfml.processing">ipfml.processing (module)</a>
+</li>
+      <li><a href="ipfml.html#module-ipfml.utils">ipfml.utils (module)</a>
 </li>
   </ul></td>
 </tr></table>
@@ -262,6 +270,14 @@
 <h2 id="M">M</h2>
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="ipfml.html#ipfml.iqa.fr.mae">mae() (in module ipfml.iqa.fr)</a>
+</li>
+      <li><a href="ipfml.html#ipfml.iqa.fr.ms_ssim">ms_ssim() (in module ipfml.iqa.fr)</a>
+</li>
+  </ul></td>
+  <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="ipfml.html#ipfml.iqa.fr.mse">mse() (in module ipfml.iqa.fr)</a>
+</li>
       <li><a href="ipfml.html#ipfml.filters.noise.mut_white_noise">mut_white_noise() (in module ipfml.filters.noise)</a>
 </li>
   </ul></td>
@@ -270,13 +286,25 @@
 <h2 id="N">N</h2>
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%; vertical-align: top;"><ul>
-      <li><a href="ipfml.html#ipfml.processing.normalize_2D_arr">normalize_2D_arr() (in module ipfml.processing)</a>
+      <li><a href="ipfml.html#ipfml.utils.normalize_2D_arr">normalize_2D_arr() (in module ipfml.utils)</a>
+</li>
+      <li><a href="ipfml.html#ipfml.utils.normalize_arr">normalize_arr() (in module ipfml.utils)</a>
 </li>
   </ul></td>
   <td style="width: 33%; vertical-align: top;"><ul>
-      <li><a href="ipfml.html#ipfml.processing.normalize_arr">normalize_arr() (in module ipfml.processing)</a>
+      <li><a href="ipfml.html#ipfml.utils.normalize_arr_with_range">normalize_arr_with_range() (in module ipfml.utils)</a>
 </li>
-      <li><a href="ipfml.html#ipfml.processing.normalize_arr_with_range">normalize_arr_with_range() (in module ipfml.processing)</a>
+      <li><a href="ipfml.html#ipfml.exceptions.NumpyDimensionComparisonException">NumpyDimensionComparisonException</a>
+</li>
+      <li><a href="ipfml.html#ipfml.exceptions.NumpyShapeComparisonException">NumpyShapeComparisonException</a>
+</li>
+  </ul></td>
+</tr></table>
+
+<h2 id="P">P</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+  <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="ipfml.html#ipfml.iqa.fr.pnsr">pnsr() (in module ipfml.iqa.fr)</a>
 </li>
   </ul></td>
 </tr></table>
@@ -293,6 +321,8 @@
       <li><a href="ipfml.html#ipfml.processing.rgb_to_LAB_L_low_bits">rgb_to_LAB_L_low_bits() (in module ipfml.processing)</a>
 </li>
       <li><a href="ipfml.html#ipfml.processing.rgb_to_mscn">rgb_to_mscn() (in module ipfml.processing)</a>
+</li>
+      <li><a href="ipfml.html#ipfml.iqa.fr.rmse">rmse() (in module ipfml.iqa.fr)</a>
 </li>
   </ul></td>
 </tr></table>
@@ -305,6 +335,14 @@
   </ul></td>
 </tr></table>
 
+<h2 id="V">V</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+  <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="ipfml.html#ipfml.iqa.fr.vif">vif() (in module ipfml.iqa.fr)</a>
+</li>
+  </ul></td>
+</tr></table>
+
 <h2 id="W">W</h2>
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%; vertical-align: top;"><ul>

+ 3 - 0
docs/build/html/index.html

@@ -172,6 +172,9 @@
 <li class="toctree-l2"><a class="reference internal" href="ipfml.html#module-ipfml.metrics">ipfml.metrics</a></li>
 <li class="toctree-l2"><a class="reference internal" href="ipfml.html#module-ipfml.processing">ipfml.processing</a></li>
 <li class="toctree-l2"><a class="reference internal" href="ipfml.html#ipfml-filters">ipfml.filters</a></li>
+<li class="toctree-l2"><a class="reference internal" href="ipfml.html#ipfml-iqa">ipfml.iqa</a></li>
+<li class="toctree-l2"><a class="reference internal" href="ipfml.html#module-ipfml.utils">ipfml.utils</a></li>
+<li class="toctree-l2"><a class="reference internal" href="ipfml.html#module-ipfml.exceptions">ipfml.exceptions</a></li>
 </ul>
 </li>
 <li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a><ul>

+ 245 - 77
docs/build/html/ipfml.html

@@ -92,6 +92,12 @@
 <li class="toctree-l3"><a class="reference internal" href="#module-ipfml.filters.noise">ipfml.filters.noise</a></li>
 </ul>
 </li>
+<li class="toctree-l2"><a class="reference internal" href="#ipfml-iqa">ipfml.iqa</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#module-ipfml.iqa.fr">ipfml.iqa.fr</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="#module-ipfml.utils">ipfml.utils</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#module-ipfml.exceptions">ipfml.exceptions</a></li>
 </ul>
 </li>
 <li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
@@ -716,82 +722,6 @@
 </div>
 </dd></dl>
 
-<dl class="function">
-<dt id="ipfml.processing.normalize_2D_arr">
-<code class="descclassname">ipfml.processing.</code><code class="descname">normalize_2D_arr</code><span class="sig-paren">(</span><em>arr</em><span class="sig-paren">)</span><a class="headerlink" href="#ipfml.processing.normalize_2D_arr" title="Permalink to this definition">¶</a></dt>
-<dd><p>Return array normalize from its min and max values</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>arr</strong> – 2D Numpy array</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">Normalized 2D Numpy array</td>
-</tr>
-</tbody>
-</table>
-<p>Example:</p>
-<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">PIL</span> <span class="k">import</span> <span class="n">Image</span>
-<span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">ipfml</span> <span class="k">import</span> <span class="n">processing</span>
-<span class="gp">&gt;&gt;&gt; </span><span class="n">img</span> <span class="o">=</span> <span class="n">Image</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">&#39;./images/test_img.png&#39;</span><span class="p">)</span>
-<span class="gp">&gt;&gt;&gt; </span><span class="n">img_mscn</span> <span class="o">=</span> <span class="n">processing</span><span class="o">.</span><span class="n">rgb_to_mscn</span><span class="p">(</span><span class="n">img</span><span class="p">)</span>
-<span class="gp">&gt;&gt;&gt; </span><span class="n">img_normalized</span> <span class="o">=</span> <span class="n">processing</span><span class="o">.</span><span class="n">normalize_2D_arr</span><span class="p">(</span><span class="n">img_mscn</span><span class="p">)</span>
-<span class="gp">&gt;&gt;&gt; </span><span class="n">img_normalized</span><span class="o">.</span><span class="n">shape</span>
-<span class="go">(200, 200)</span>
-</pre></div>
-</div>
-</dd></dl>
-
-<dl class="function">
-<dt id="ipfml.processing.normalize_arr">
-<code class="descclassname">ipfml.processing.</code><code class="descname">normalize_arr</code><span class="sig-paren">(</span><em>arr</em><span class="sig-paren">)</span><a class="headerlink" href="#ipfml.processing.normalize_arr" title="Permalink to this definition">¶</a></dt>
-<dd><p>Normalize data of 1D array shape</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>arr</strong> – array data of 1D shape</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">Normalized 1D array</td>
-</tr>
-</tbody>
-</table>
-<p>Example:</p>
-<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">ipfml</span> <span class="k">import</span> <span class="n">processing</span>
-<span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
-<span class="gp">&gt;&gt;&gt; </span><span class="n">arr</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">11</span><span class="p">)</span>
-<span class="gp">&gt;&gt;&gt; </span><span class="n">arr_normalized</span> <span class="o">=</span> <span class="n">processing</span><span class="o">.</span><span class="n">normalize_arr</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span>
-<span class="gp">&gt;&gt;&gt; </span><span class="n">arr_normalized</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
-<span class="go">0.1</span>
-</pre></div>
-</div>
-</dd></dl>
-
-<dl class="function">
-<dt id="ipfml.processing.normalize_arr_with_range">
-<code class="descclassname">ipfml.processing.</code><code class="descname">normalize_arr_with_range</code><span class="sig-paren">(</span><em>arr</em>, <em>min</em>, <em>max</em><span class="sig-paren">)</span><a class="headerlink" href="#ipfml.processing.normalize_arr_with_range" title="Permalink to this definition">¶</a></dt>
-<dd><p>Normalize data of 1D array shape</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>arr</strong> – array data of 1D shape</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">Normalized 1D Numpy array</td>
-</tr>
-</tbody>
-</table>
-<p>Example:</p>
-<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">ipfml</span> <span class="k">import</span> <span class="n">processing</span>
-<span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
-<span class="gp">&gt;&gt;&gt; </span><span class="n">arr</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">11</span><span class="p">)</span>
-<span class="gp">&gt;&gt;&gt; </span><span class="n">arr_normalized</span> <span class="o">=</span> <span class="n">processing</span><span class="o">.</span><span class="n">normalize_arr_with_range</span><span class="p">(</span><span class="n">arr</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">20</span><span class="p">)</span>
-<span class="gp">&gt;&gt;&gt; </span><span class="n">arr_normalized</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
-<span class="go">0.05</span>
-</pre></div>
-</div>
-</dd></dl>
-
 <dl class="function">
 <dt id="ipfml.processing.rgb_to_LAB_L_bits">
 <code class="descclassname">ipfml.processing.</code><code class="descname">rgb_to_LAB_L_bits</code><span class="sig-paren">(</span><em>image</em>, <em>interval</em><span class="sig-paren">)</span><a class="headerlink" href="#ipfml.processing.rgb_to_LAB_L_bits" title="Permalink to this definition">¶</a></dt>
@@ -1055,7 +985,7 @@
 <li><strong>image</strong> – image used as input (2D or 3D image representation)</li>
 <li><strong>n</strong> – used to set importance of noise [1, 999]</li>
 <li><strong>identical</strong> – keep or not identical noise distribution for each canal if RGB Image (default False)</li>
-<li><strong>distribution_interval</strong> – set the distribution interval of normal law distribution (default (-0.5, 0.5))</li>
+<li><strong>distribution_interval</strong> – set the distribution interval of normal law distribution (default (0, 1))</li>
 <li><strong>k</strong> – variable that specifies the amount of noise to be taken into account in the output image (default 0.002)</li>
 </ul>
 </td>
@@ -1143,6 +1073,244 @@
 </dd></dl>
 
 </div>
+</div>
+<div class="section" id="ipfml-iqa">
+<h2>ipfml.iqa<a class="headerlink" href="#ipfml-iqa" title="Permalink to this headline">¶</a></h2>
+<div class="section" id="module-ipfml.iqa.fr">
+<span id="ipfml-iqa-fr"></span><h3>ipfml.iqa.fr<a class="headerlink" href="#module-ipfml.iqa.fr" title="Permalink to this headline">¶</a></h3>
+<dl class="function">
+<dt id="ipfml.iqa.fr.mae">
+<code class="descclassname">ipfml.iqa.fr.</code><code class="descname">mae</code><span class="sig-paren">(</span><em>img_true</em>, <em>img_test</em><span class="sig-paren">)</span><a class="headerlink" href="#ipfml.iqa.fr.mae" title="Permalink to this definition">¶</a></dt>
+<dd><p>Returns Mean-Squared Error between two Numpy arrays</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>img_true</strong> – Image, numpy array of any dimension</li>
+<li><strong>img_test</strong> – Image, numpy array of any dimension</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first">Computed MSE score</p>
+</td>
+</tr>
+<tr class="field-odd field"><th class="field-name">Raises:</th><td class="field-body"><p class="first last"><code class="xref py py-exc docutils literal notranslate"><span class="pre">NumpyShapeComparisonException</span></code> – if shape of images are not the same</p>
+</td>
+</tr>
+</tbody>
+</table>
+<p class="rubric">Example</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">ipfml</span> <span class="k">import</span> <span class="n">utils</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">arr1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">arr2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">mse</span> <span class="o">=</span> <span class="n">utils</span><span class="o">.</span><span class="n">mse</span><span class="p">(</span><span class="n">arr1</span><span class="p">,</span> <span class="n">arr2</span><span class="p">)</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">mse</span>
+<span class="go">100</span>
+</pre></div>
+</div>
+</dd></dl>
+
+<dl class="function">
+<dt id="ipfml.iqa.fr.ms_ssim">
+<code class="descclassname">ipfml.iqa.fr.</code><code class="descname">ms_ssim</code><span class="sig-paren">(</span><em>img_true</em>, <em>img_test</em><span class="sig-paren">)</span><a class="headerlink" href="#ipfml.iqa.fr.ms_ssim" title="Permalink to this definition">¶</a></dt>
+<dd><p>Implemented later..</p>
+</dd></dl>
+
+<dl class="function">
+<dt id="ipfml.iqa.fr.mse">
+<code class="descclassname">ipfml.iqa.fr.</code><code class="descname">mse</code><span class="sig-paren">(</span><em>img_true</em>, <em>img_test</em><span class="sig-paren">)</span><a class="headerlink" href="#ipfml.iqa.fr.mse" title="Permalink to this definition">¶</a></dt>
+<dd><p>Returns Mean-Squared Error between two Numpy arrays</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>img_true</strong> – Image, numpy array of any dimension</li>
+<li><strong>img_test</strong> – Image, numpy array of any dimension</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first">Computed MSE score</p>
+</td>
+</tr>
+<tr class="field-odd field"><th class="field-name">Raises:</th><td class="field-body"><p class="first last"><code class="xref py py-exc docutils literal notranslate"><span class="pre">NumpyShapeComparisonException</span></code> – if shape of images are not the same</p>
+</td>
+</tr>
+</tbody>
+</table>
+<p class="rubric">Example</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">ipfml</span> <span class="k">import</span> <span class="n">utils</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">arr1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">arr2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">mse</span> <span class="o">=</span> <span class="n">utils</span><span class="o">.</span><span class="n">mse</span><span class="p">(</span><span class="n">arr1</span><span class="p">,</span> <span class="n">arr2</span><span class="p">)</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">mse</span>
+<span class="go">100</span>
+</pre></div>
+</div>
+</dd></dl>
+
+<dl class="function">
+<dt id="ipfml.iqa.fr.pnsr">
+<code class="descclassname">ipfml.iqa.fr.</code><code class="descname">pnsr</code><span class="sig-paren">(</span><em>img_true</em>, <em>img_test</em><span class="sig-paren">)</span><a class="headerlink" href="#ipfml.iqa.fr.pnsr" title="Permalink to this definition">¶</a></dt>
+<dd><p>Returns the computed Peak Signal to Noise Ratio (PSNR) between two images</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>img_true</strong> – Image, numpy array of any dimension</li>
+<li><strong>img_test</strong> – Image, numpy array of any dimension</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">Computed PSNR score</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="ipfml.iqa.fr.rmse">
+<code class="descclassname">ipfml.iqa.fr.</code><code class="descname">rmse</code><span class="sig-paren">(</span><em>img_true</em>, <em>img_test</em><span class="sig-paren">)</span><a class="headerlink" href="#ipfml.iqa.fr.rmse" title="Permalink to this definition">¶</a></dt>
+<dd><p>Returns Mean-Squared Error between two Numpy arrays</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>img_true</strong> – Image, numpy array of any dimension</li>
+<li><strong>img_test</strong> – Image, numpy array of any dimension</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first">Computed MSE score</p>
+</td>
+</tr>
+<tr class="field-odd field"><th class="field-name">Raises:</th><td class="field-body"><p class="first last"><code class="xref py py-exc docutils literal notranslate"><span class="pre">NumpyShapeComparisonException</span></code> – if shape of images are not the same</p>
+</td>
+</tr>
+</tbody>
+</table>
+<p class="rubric">Example</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">ipfml</span> <span class="k">import</span> <span class="n">utils</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">arr1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">arr2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">rmse</span> <span class="o">=</span> <span class="n">utils</span><span class="o">.</span><span class="n">rmse</span><span class="p">(</span><span class="n">arr1</span><span class="p">,</span> <span class="n">arr2</span><span class="p">)</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">rmse</span>
+<span class="go">100</span>
+</pre></div>
+</div>
+</dd></dl>
+
+<dl class="function">
+<dt id="ipfml.iqa.fr.vif">
+<code class="descclassname">ipfml.iqa.fr.</code><code class="descname">vif</code><span class="sig-paren">(</span><em>img_true</em>, <em>img_test</em><span class="sig-paren">)</span><a class="headerlink" href="#ipfml.iqa.fr.vif" title="Permalink to this definition">¶</a></dt>
+<dd><p>Implemented later..</p>
+</dd></dl>
+
+</div>
+</div>
+<div class="section" id="module-ipfml.utils">
+<span id="ipfml-utils"></span><h2>ipfml.utils<a class="headerlink" href="#module-ipfml.utils" title="Permalink to this headline">¶</a></h2>
+<dl class="function">
+<dt id="ipfml.utils.normalize_2D_arr">
+<code class="descclassname">ipfml.utils.</code><code class="descname">normalize_2D_arr</code><span class="sig-paren">(</span><em>arr</em><span class="sig-paren">)</span><a class="headerlink" href="#ipfml.utils.normalize_2D_arr" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return array normalize from its min and max values</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>arr</strong> – 2D Numpy array</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">Normalized 2D Numpy array</td>
+</tr>
+</tbody>
+</table>
+<p>Example:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">PIL</span> <span class="k">import</span> <span class="n">Image</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">ipfml</span> <span class="k">import</span> <span class="n">utils</span><span class="p">,</span> <span class="n">processing</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">img</span> <span class="o">=</span> <span class="n">Image</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">&#39;./images/test_img.png&#39;</span><span class="p">)</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">img_mscn</span> <span class="o">=</span> <span class="n">processing</span><span class="o">.</span><span class="n">rgb_to_mscn</span><span class="p">(</span><span class="n">img</span><span class="p">)</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">img_normalized</span> <span class="o">=</span> <span class="n">utils</span><span class="o">.</span><span class="n">normalize_2D_arr</span><span class="p">(</span><span class="n">img_mscn</span><span class="p">)</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">img_normalized</span><span class="o">.</span><span class="n">shape</span>
+<span class="go">(200, 200)</span>
+</pre></div>
+</div>
+</dd></dl>
+
+<dl class="function">
+<dt id="ipfml.utils.normalize_arr">
+<code class="descclassname">ipfml.utils.</code><code class="descname">normalize_arr</code><span class="sig-paren">(</span><em>arr</em><span class="sig-paren">)</span><a class="headerlink" href="#ipfml.utils.normalize_arr" title="Permalink to this definition">¶</a></dt>
+<dd><p>Normalize data of 1D array shape</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>arr</strong> – array data of 1D shape</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">Normalized 1D array</td>
+</tr>
+</tbody>
+</table>
+<p>Example:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">ipfml</span> <span class="k">import</span> <span class="n">utils</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">arr</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">11</span><span class="p">)</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">arr_normalized</span> <span class="o">=</span> <span class="n">utils</span><span class="o">.</span><span class="n">normalize_arr</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">arr_normalized</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
+<span class="go">0.1</span>
+</pre></div>
+</div>
+</dd></dl>
+
+<dl class="function">
+<dt id="ipfml.utils.normalize_arr_with_range">
+<code class="descclassname">ipfml.utils.</code><code class="descname">normalize_arr_with_range</code><span class="sig-paren">(</span><em>arr</em>, <em>min</em>, <em>max</em><span class="sig-paren">)</span><a class="headerlink" href="#ipfml.utils.normalize_arr_with_range" title="Permalink to this definition">¶</a></dt>
+<dd><p>Normalize data of 1D array shape</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>arr</strong> – array data of 1D shape</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">Normalized 1D Numpy array</td>
+</tr>
+</tbody>
+</table>
+<p>Example:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">ipfml</span> <span class="k">import</span> <span class="n">processing</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">arr</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">11</span><span class="p">)</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">arr_normalized</span> <span class="o">=</span> <span class="n">processing</span><span class="o">.</span><span class="n">normalize_arr_with_range</span><span class="p">(</span><span class="n">arr</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">20</span><span class="p">)</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">arr_normalized</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
+<span class="go">0.05</span>
+</pre></div>
+</div>
+</dd></dl>
+
+</div>
+<div class="section" id="module-ipfml.exceptions">
+<span id="ipfml-exceptions"></span><h2>ipfml.exceptions<a class="headerlink" href="#module-ipfml.exceptions" title="Permalink to this headline">¶</a></h2>
+<p>Module which contains all customs Exceptions</p>
+<dl class="exception">
+<dt id="ipfml.exceptions.NumpyDimensionComparisonException">
+<em class="property">exception </em><code class="descclassname">ipfml.exceptions.</code><code class="descname">NumpyDimensionComparisonException</code><a class="headerlink" href="#ipfml.exceptions.NumpyDimensionComparisonException" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">Exception</span></code></p>
+<p>Numpy dimensions comparison Exception raised if two numpy arrays provided do not have same dimensions</p>
+</dd></dl>
+
+<dl class="exception">
+<dt id="ipfml.exceptions.NumpyShapeComparisonException">
+<em class="property">exception </em><code class="descclassname">ipfml.exceptions.</code><code class="descname">NumpyShapeComparisonException</code><a class="headerlink" href="#ipfml.exceptions.NumpyShapeComparisonException" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">Exception</span></code></p>
+<p>Numpy shape comparison Exception raised if two numpy arrays provided do not have same shape extactly</p>
+</dd></dl>
+
 </div>
 </div>
 

BIN
docs/build/html/objects.inv


+ 15 - 0
docs/build/html/py-modindex.html

@@ -166,11 +166,21 @@
        <td>
        <code class="xref">ipfml</code></td><td>
        <em></em></td></tr>
+     <tr class="cg-1">
+       <td></td>
+       <td>&#160;&#160;&#160;
+       <a href="ipfml.html#module-ipfml.exceptions"><code class="xref">ipfml.exceptions</code></a></td><td>
+       <em></em></td></tr>
      <tr class="cg-1">
        <td></td>
        <td>&#160;&#160;&#160;
        <a href="ipfml.html#module-ipfml.filters.noise"><code class="xref">ipfml.filters.noise</code></a></td><td>
        <em></em></td></tr>
+     <tr class="cg-1">
+       <td></td>
+       <td>&#160;&#160;&#160;
+       <a href="ipfml.html#module-ipfml.iqa.fr"><code class="xref">ipfml.iqa.fr</code></a></td><td>
+       <em></em></td></tr>
      <tr class="cg-1">
        <td></td>
        <td>&#160;&#160;&#160;
@@ -181,6 +191,11 @@
        <td>&#160;&#160;&#160;
        <a href="ipfml.html#module-ipfml.processing"><code class="xref">ipfml.processing</code></a></td><td>
        <em></em></td></tr>
+     <tr class="cg-1">
+       <td></td>
+       <td>&#160;&#160;&#160;
+       <a href="ipfml.html#module-ipfml.utils"><code class="xref">ipfml.utils</code></a></td><td>
+       <em></em></td></tr>
    </table>
 
 

Fichier diff supprimé car celui-ci est trop grand
+ 1 - 1
docs/build/html/searchindex.js


+ 30 - 1
docs/source/ipfml.rst

@@ -1,6 +1,7 @@
 Documentation
 =============
 
+
 ipfml.metrics
 ---------------------------
 
@@ -8,6 +9,7 @@ ipfml.metrics
     :members:
     :show-inheritance:
 
+
 ipfml.processing
 ---------------------------
 
@@ -25,4 +27,31 @@ ipfml.filters.noise
 .. automodule:: ipfml.filters.noise
     :members:
     :show-inheritance:
- 
+
+
+ipfml.iqa
+---------------------------
+
+ipfml.iqa.fr
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: ipfml.iqa.fr
+    :members:
+    :show-inheritance:
+
+
+ipfml.utils
+---------------------------
+
+.. automodule:: ipfml.utils
+    :members:
+    :show-inheritance:
+
+
+ipfml.exceptions
+---------------------------
+
+.. automodule:: ipfml.exceptions
+    :members:
+    :show-inheritance:
+

+ 17 - 0
ipfml/exceptions.py

@@ -0,0 +1,17 @@
+"""
+Module which contains all customs Exceptions
+"""
+
+class NumpyDimensionComparisonException(Exception):
+    """
+    Numpy dimensions comparison Exception raised if two numpy arrays provided do not have same dimensions
+    """
+    def __init__(self):
+        Exception.__init__(self, "Numpy arrays provided for comparisons do not have same dimensions")
+
+class NumpyShapeComparisonException(Exception):
+    """
+    Numpy shape comparison Exception raised if two numpy arrays provided do not have same shape extactly
+    """
+    def __init__(self):
+        Exception.__init__(self, "Numpy arrays provided for comparisons do not have same shape")

+ 6 - 3
ipfml/filters/noise.py

@@ -284,7 +284,7 @@ def mut_white_noise(image,
         image: image used as input (2D or 3D image representation)
         n: used to set importance of noise [1, 999]
         identical: keep or not identical noise distribution for each canal if RGB Image (default False)
-        distribution_interval: set the distribution interval of normal law distribution (default (-0.5, 0.5))
+        distribution_interval: set the distribution interval of normal law distribution (default (0, 1))
         k: variable that specifies the amount of noise to be taken into account in the output image (default 0.002)
 
     Returns:
@@ -300,10 +300,13 @@ def mut_white_noise(image,
     (100, 100)
     """
 
+    min_value = 1 - (k/2);
+    max_value = 1 + (k/2);
+
     a, b = distribution_interval
-    generator = lambda h, w: np.random.uniform(a, b, (h, w))
+    generator = lambda h, w: min_value + (np.random.uniform(a, b, (h, w)) * (max_value - min_value))
 
-    updator = lambda x, noise: x * (n * k * noise)
+    updator = lambda x, noise: x * pow(noise, n)
 
     return _global_noise_filter(image, generator, updator, identical)
 

+ 0 - 0
ipfml/iqa/__init__.py


+ 125 - 0
ipfml/iqa/fr.py

@@ -0,0 +1,125 @@
+from skimage.measure import compare_ssim, compare_psnr
+from ipfml.exceptions import NumpyShapeComparisonException
+
+"""
+Full-reference Image Quality Assessment (FR-IQA) methods
+"""
+
+def _prepare_arrays(arr1, arr2):
+    img_true = np.asarray(img_true, dtype=float_32)
+    img_test = np.asarray(img_test, dtype=float_32)
+
+    if img_true.shape != img_test.shape:
+        raise NumpyShapeComparisonException
+
+    return img_true, img_test
+
+
+def mse(img_true, img_test):
+    """Returns Mean-Squared Error between two Numpy arrays
+
+    Args:
+        img_true: Image, numpy array of any dimension
+        img_test: Image, numpy array of any dimension
+
+    Returns:
+        Computed MSE score
+
+    Raises:
+        NumpyShapeComparisonException: if shape of images are not the same
+
+    Example:
+        >>> from ipfml import utils
+        >>> import numpy as np
+        >>> arr1 = np.arange(10)
+        >>> arr2 = np.arange(5, 10)
+        >>> mse = utils.mse(arr1, arr2)
+        >>> mse
+        100
+    """
+
+    img_true, img_test = _prepare_arrays(img_true, img_test)
+
+    return np.mean(np.square(img_true - img_test), dtype=np.float64)
+
+
+def rmse(img_true, img_test):
+    """Returns Mean-Squared Error between two Numpy arrays
+
+    Args:
+        img_true: Image, numpy array of any dimension
+        img_test: Image, numpy array of any dimension
+
+    Returns:
+        Computed MSE score
+
+    Raises:
+        NumpyShapeComparisonException: if shape of images are not the same
+
+    Example:
+        >>> from ipfml import utils
+        >>> import numpy as np
+        >>> arr1 = np.arange(10)
+        >>> arr2 = np.arange(5, 10)
+        >>> rmse = utils.rmse(arr1, arr2)
+        >>> rmse
+        100
+    """
+
+    return np.sqrt(mse(img_true, img_test))
+
+
+def mae(img_true, img_test):
+    """Returns Mean-Squared Error between two Numpy arrays
+
+    Args:
+        img_true: Image, numpy array of any dimension
+        img_test: Image, numpy array of any dimension
+
+    Returns:
+        Computed MSE score
+
+    Raises:
+        NumpyShapeComparisonException: if shape of images are not the same
+
+    Example:
+        >>> from ipfml import utils
+        >>> import numpy as np
+        >>> arr1 = np.arange(10)
+        >>> arr2 = np.arange(5, 10)
+        >>> mse = utils.mse(arr1, arr2)
+        >>> mse
+        100
+    """
+
+    img_true, img_test = _prepare_arrays(img_true, img_test)
+
+    return np.mean(np.absolute(img_true - img_test), dtype=np.float64)
+
+
+def pnsr(img_true, img_test):
+    """Returns the computed Peak Signal to Noise Ratio (PSNR) between two images
+
+    Args:
+        img_true: Image, numpy array of any dimension
+        img_test: Image, numpy array of any dimension
+
+    Returns:
+        Computed PSNR score
+    """
+
+    return compare_psnr(img_true, img_test)
+
+
+def ms_ssim(img_true, img_test):
+    """
+    Implemented later..
+    """
+    pass
+
+
+def vif(img_true, img_test):
+    """
+    Implemented later..
+    """
+    pass

+ 0 - 92
ipfml/processing.py

@@ -186,98 +186,6 @@ def divide_in_blocks(image, block_size, pil=True):
     return blocks
 
 
-def normalize_arr(arr):
-    '''Normalize data of 1D array shape
-
-    Args:
-        arr: array data of 1D shape
-
-    Returns:
-        Normalized 1D array
-
-    Example:
-
-    >>> from ipfml import processing
-    >>> import numpy as np
-    >>> arr = np.arange(11)
-    >>> arr_normalized = processing.normalize_arr(arr)
-    >>> arr_normalized[1]
-    0.1
-    '''
-
-    output_arr = []
-    max_value = max(arr)
-    min_value = min(arr)
-
-    for v in arr:
-        output_arr.append((v - min_value) / (max_value - min_value))
-
-    return output_arr
-
-
-def normalize_arr_with_range(arr, min, max):
-    '''Normalize data of 1D array shape
-
-    Args:
-        arr: array data of 1D shape
-
-    Returns:
-        Normalized 1D Numpy array
-
-    Example:
-
-    >>> from ipfml import processing
-    >>> import numpy as np
-    >>> arr = np.arange(11)
-    >>> arr_normalized = processing.normalize_arr_with_range(arr, 0, 20)
-    >>> arr_normalized[1]
-    0.05
-    '''
-
-    output_arr = []
-
-    for v in arr:
-        output_arr.append((v - min) / (max - min))
-
-    return output_arr
-
-
-def normalize_2D_arr(arr):
-    """Return array normalize from its min and max values
-
-    Args:
-        arr: 2D Numpy array
-
-    Returns:
-        Normalized 2D Numpy array
-
-    Example:
-
-    >>> from PIL import Image
-    >>> from ipfml import processing
-    >>> img = Image.open('./images/test_img.png')
-    >>> img_mscn = processing.rgb_to_mscn(img)
-    >>> img_normalized = processing.normalize_2D_arr(img_mscn)
-    >>> img_normalized.shape
-    (200, 200)
-    """
-
-    # getting min and max value from 2D array
-    max_value = arr.max(axis=1).max()
-    min_value = arr.min(axis=1).min()
-
-    # normalize each row
-    output_array = []
-    width, height = arr.shape
-
-    for row_index in range(0, height):
-        values = arr[row_index, :]
-        output_array.append(
-            normalize_arr_with_range(values, min_value, max_value))
-
-    return np.asarray(output_array)
-
-
 def rgb_to_mscn(image):
     """Convert RGB Image into Mean Subtracted Contrast Normalized (MSCN)
 

+ 97 - 0
ipfml/utils.py

@@ -0,0 +1,97 @@
+import numpy as np
+
+
+"""
+Utils functions of ipfml package
+"""
+
+def normalize_arr(arr):
+    '''Normalize data of 1D array shape
+
+    Args:
+        arr: array data of 1D shape
+
+    Returns:
+        Normalized 1D array
+
+    Example:
+
+    >>> from ipfml import utils
+    >>> import numpy as np
+    >>> arr = np.arange(11)
+    >>> arr_normalized = utils.normalize_arr(arr)
+    >>> arr_normalized[1]
+    0.1
+    '''
+
+    output_arr = []
+    max_value = max(arr)
+    min_value = min(arr)
+
+    for v in arr:
+        output_arr.append((v - min_value) / (max_value - min_value))
+
+    return output_arr
+
+
+def normalize_arr_with_range(arr, min, max):
+    '''Normalize data of 1D array shape
+
+    Args:
+        arr: array data of 1D shape
+
+    Returns:
+        Normalized 1D Numpy array
+
+    Example:
+
+    >>> from ipfml import processing
+    >>> import numpy as np
+    >>> arr = np.arange(11)
+    >>> arr_normalized = processing.normalize_arr_with_range(arr, 0, 20)
+    >>> arr_normalized[1]
+    0.05
+    '''
+
+    output_arr = []
+
+    for v in arr:
+        output_arr.append((v - min) / (max - min))
+
+    return output_arr
+
+
+def normalize_2D_arr(arr):
+    """Return array normalize from its min and max values
+
+    Args:
+        arr: 2D Numpy array
+
+    Returns:
+        Normalized 2D Numpy array
+
+    Example:
+
+    >>> from PIL import Image
+    >>> from ipfml import utils, processing
+    >>> img = Image.open('./images/test_img.png')
+    >>> img_mscn = processing.rgb_to_mscn(img)
+    >>> img_normalized = utils.normalize_2D_arr(img_mscn)
+    >>> img_normalized.shape
+    (200, 200)
+    """
+
+    # getting min and max value from 2D array
+    max_value = arr.max(axis=1).max()
+    min_value = arr.min(axis=1).min()
+
+    # normalize each row
+    output_array = []
+    width, height = arr.shape
+
+    for row_index in range(0, height):
+        values = arr[row_index, :]
+        output_array.append(
+            normalize_arr_with_range(values, min_value, max_value))
+
+    return np.asarray(output_array)

+ 5 - 3
setup.py

@@ -15,12 +15,14 @@ class BuildTestCommand(setuptools.command.build_py.build_py):
         from ipfml import processing
         from ipfml import metrics
         from ipfml.filters import noise as noise_filters
+        from ipfml.iqa import fr as fr_iqa
 
         print("==============================")
         print("Runs test command...")
         doctest.testmod(processing)
         doctest.testmod(metrics)
         doctest.testmod(noise_filters)
+        doctest.testmod(fr_iqa)
 
         # Run format code using ypaf
         try:
@@ -35,7 +37,7 @@ class BuildTestCommand(setuptools.command.build_py.build_py):
 
 setup(
     name='ipfml',
-    version='0.2.6',
+    version='0.2.7',
     description='Image Processing For Machine Learning',
     long_description=readme(),
     classifiers=[
@@ -44,11 +46,11 @@ setup(
         'Programming Language :: Python :: 3.6',
         'Topic :: Scientific/Engineering :: Artificial Intelligence'
     ],
-    url='https://gogs.univ-littoral.fr/jerome.buisine/IPFML',
+    url='https://github.com/jbuisine/IPFML',
     author='Jérôme BUISINE',
     author_email='jerome.buisine@univ-littoral.fr',
     license='MIT',
-    packages=['ipfml', 'ipfml/filters'],
+    packages=['ipfml', 'ipfml/filters', 'ipfml/iqa'],
     install_requires=[
         'matplotlib',
         'numpy',