Merge pull request #1356 from blink1073/travis-build-docs

Verify doc building with Travis
This commit is contained in:
Stefan van der Walt
2015-02-07 16:55:00 -08:00
26 changed files with 123 additions and 106 deletions
+3 -5
View File
@@ -123,9 +123,7 @@ Guidelines
* All code should have tests (see `test coverage`_ below for more details).
* All code should be documented, to the same
`standard
<://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt#docstring-standard>`_
as NumPy and SciPy.
`standard <://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt#docstring-standard>`_ as NumPy and SciPy.
* For new functionality, always add an example to the
gallery.
* No changes are ever committed without review. Ask on the
@@ -195,8 +193,8 @@ successfully passes all tests. To do so,
* Go to `Travis-CI <http://travis-ci.org/>`__ and follow the Sign In link at the top
* Go to your `profile page <https://travis-ci.org/profile>`__ and switch on your
scikit-image fork
* Go to your `profile page <https://travis-ci.org/profile>`__ and switch
on your scikit-image fork
It corresponds to steps one and two in
`Travis-CI documentation <http://about.travis-ci.org/docs/user/getting-started/>`__
+5 -5
View File
@@ -45,12 +45,12 @@ functionality is only available with the following installed:
* `Astropy <http://www.astropy.org>`__ provides FITS io capability.
*`SimpleITK <http://www.simpleitk.org/>`
Optional io plugin providing a wide variety of `formats <http://www.itk.org/Wiki/ITK_File_Formats>`__.
including specialized formats using in medical imaging.
* `SimpleITK <http://www.simpleitk.org/>`
Optional io plugin providing a wide variety of `formats <http://www.itk.org/Wiki/ITK_File_Formats>`__.
including specialized formats using in medical imaging.
*`imread <http://pythonhosted.org/imread/>`
Optional io plugin providing most standard `formats <http://pythonhosted.org//imread/formats.html>`__.
* `imread <http://pythonhosted.org/imread/>`
Optional io plugin providing most standard `formats <http://pythonhosted.org//imread/formats.html>`__.
Testing requirements
+4
View File
@@ -14,3 +14,7 @@ doctest:
coverage:
nosetests skimage --with-coverage --cover-package=skimage
html:
pip install -q sphinx
export SPHINXOPTS=-W; make -C doc html
+13
View File
@@ -3,3 +3,16 @@ To build docs, run `make` in this directory. `make help` lists all targets.
## Requirements ##
Sphinx is needed to build doc. Install with `pip install sphinx`.
## Fixing Warnings ##
- "citation not found: R###"
$ cd doc/build; grep -rin R### .
There is probably an underscore after the reference (e.g. [1]_)
- "Duplicate citation R###, other instance in...""
There is probably a [2] without a [1] in one of
the docstrings
- Make sure to use pre-sphinxification paths to images
(not the _images directory)
+2 -1
View File
@@ -258,7 +258,8 @@ def write_gallery(gallery_index, src_dir, rst_dir, cfg, depth=0):
else:
sub_dir_list = src_dir.psplit()[-depth:]
sub_dir = Path('/'.join(sub_dir_list) + '/')
gallery_index.write(TOCTREE_TEMPLATE % (sub_dir + '\n '.join(ex_names)))
joiner = '\n %s' % sub_dir
gallery_index.write(TOCTREE_TEMPLATE % (sub_dir + joiner.join(ex_names)))
for src_name in examples:
+1
View File
@@ -251,6 +251,7 @@ latex_use_modindex = False
# Numpy extensions
# -----------------------------------------------------------------------------
numpydoc_show_class_members = False
numpydoc_class_members_toctree = False
# -----------------------------------------------------------------------------
# Plots
-7
View File
@@ -1,7 +0,0 @@
Table of Contents
=================
.. toctree::
/api/api
+1 -1
View File
@@ -15,7 +15,7 @@ Sections
:hidden:
overview
api
api/api
api_changes
install
user_guide
+2
View File
@@ -12,3 +12,5 @@ User Guide
user_guide/tutorials
user_guide/getting_help
user_guide/viewer
user_guide/tutorial_parallelization
user_guide/tutorial_segmentation
+17 -15
View File
@@ -81,7 +81,7 @@ disk: ::
... (nrows / 2)**2)
>>> camera[outer_disk_mask] = 0
.. image:: ../../_images/plot_camera_numpy_1.png
.. image:: ../auto_examples/images/plot_camera_numpy_1.png
:width: 45%
:target: ../auto_examples/plot_camera_numpy.html
@@ -123,6 +123,8 @@ the grayscale image above:
Using a 2D mask on a 2D color image
>>> from skimage import data
>>> cat = data.chelsea()
>>> reddish = cat[:, :, 0] > 160
>>> cat[reddish] = [0, 255, 0]
>>> plt.imshow(cat)
@@ -153,14 +155,14 @@ These conventions are summarized below:
.. table:: Dimension name and order conventions in scikit-image
======================== ========================================
Image type coordinates
======================== ========================================
2D grayscale (row, col)
2D multichannel (eg. RGB) (row, col, ch)
3D grayscale (pln, row, col)
3D multichannel (pln, row, col, ch)
======================== ========================================
========================= ========================================
Image type coordinates
========================= ========================================
2D grayscale (row, col)
2D multichannel (eg. RGB) (row, col, ch)
3D grayscale (pln, row, col)
3D multichannel (pln, row, col, ch)
========================= ========================================
Many functions in scikit-image operate on 3D images directly:
@@ -248,9 +250,9 @@ We can then supplement the above table as follows:
.. table:: Addendum to dimension names and orders in scikit-image
======================== ========================================
Image type coordinates
======================== ========================================
2D color video (t, row, col, ch)
3D multichannel video (t, pln, row, col, ch)
======================== ========================================
======================== ========================================
Image type coordinates
======================== ========================================
2D color video (t, row, col, ch)
3D multichannel video (t, pln, row, col, ch)
======================== ========================================
@@ -67,7 +67,7 @@ from RGB to grayscale::
array([[ 0.7154]])
Converting a grayscale image to RGB with :func:`gray2rgb``simply
Converting a grayscale image to RGB with :func:`gray2rgb` simply
duplicates the gray values over the three color channels.
Painting images with labels
@@ -78,7 +78,7 @@ using an array of labels to encode the regions to be represented with the
same color.
.. image:: ../../_images/plot_join_segmentations_1.png
.. image: ../auto_examples/images/plot_join_segmentations_1.png
:target: ../auto_examples/plot_join_segmentations.html
:align: center
:width: 80%
@@ -159,7 +159,7 @@ image with :func:`equalize_adapthist`, in order to correct for exposure
gradients across the image. See the example
:ref:`example_plot_equalize.py`.
.. image:: ../../_images/plot_equalize_1.png
.. image:: ../auto_examples/images/plot_equalize_1.png
:target: ../auto_examples/plot_equalize.html
:align: center
:width: 90%
@@ -11,7 +11,7 @@ the coins cannot be done directly from the histogram of grey values,
because the background shares enough grey levels with the coins that a
thresholding segmentation is not sufficient.
.. image:: ../../_images/plot_coins_segmentation_1.png
.. image:: ../auto_examples/applications/images/plot_coins_segmentation_1.png
:target: ../auto_examples/applications/plot_coins_segmentation.html
:align: center
@@ -26,7 +26,7 @@ Simply thresholding the image leads either to missing significant parts
of the coins, or to merging parts of the background with the
coins. This is due to the inhomogeneous lighting of the image.
.. image:: ../../_images/plot_coins_segmentation_2.png
.. image:: ../auto_examples/applications/images/plot_coins_segmentation_2.png
:target: ../auto_examples/applications/plot_coins_segmentation.html
:align: center
@@ -53,7 +53,7 @@ boundary of the coins, or inside the coins.
>>> from scipy import ndimage
>>> fill_coins = ndimage.binary_fill_holes(edges)
.. image:: ../../_images/plot_coins_segmentation_3.png
.. image:: ../auto_examples/applications/images/plot_coins_segmentation_3.png
:target: ../auto_examples/applications/plot_coins_segmentation.html
:align: center
@@ -62,7 +62,7 @@ we fill the inner part of the coins using the
``ndimage.binary_fill_holes`` function, which uses mathematical morphology
to fill the holes.
.. image:: ../../_images/plot_coins_segmentation_4.png
.. image:: ../auto_examples/applications/images/plot_coins_segmentation_4.png
:target: ../auto_examples/applications/plot_coins_segmentation.html
:align: center
@@ -83,7 +83,7 @@ has not been segmented correctly at all. The reason is that the contour
that we got from the Canny detector was not completely closed, therefore
the filling function did not fill the inner part of the coin.
.. image:: ../../_images/plot_coins_segmentation_5.png
.. image:: ../auto_examples/applications/images/plot_coins_segmentation_5.png
:target: ../auto_examples/applications/plot_coins_segmentation.html
:align: center
@@ -128,7 +128,7 @@ separate the coins from the background.
and here is the corresponding 2-D plot:
.. image:: ../../_images/plot_coins_segmentation_6.png
.. image:: ../auto_examples/applications/images/plot_coins_segmentation_6.png
:target: ../auto_examples/applications/plot_coins_segmentation.html
:align: center
@@ -139,7 +139,7 @@ extreme parts of the histogram of grey values::
>>> markers[coins < 30] = 1
>>> markers[coins > 150] = 2
.. image:: ../../_images/plot_coins_segmentation_7.png
.. image:: ../auto_examples/applications/images/plot_coins_segmentation_7.png
:target: ../auto_examples/applications/plot_coins_segmentation.html
:align: center
@@ -148,7 +148,7 @@ Let us now compute the watershed transform::
>>> from skimage.morphology import watershed
>>> segmentation = watershed(elevation_map, markers)
.. image:: ../../_images/plot_coins_segmentation_8.png
.. image:: ../auto_examples/applications/images/plot_coins_segmentation_8.png
:target: ../auto_examples/applications/plot_coins_segmentation.html
:align: center
@@ -165,7 +165,7 @@ We can now label all the coins one by one using ``ndimage.label``::
>>> labeled_coins, _ = ndimage.label(segmentation)
.. image:: ../../_images/plot_coins_segmentation_9.png
.. image:: ../auto_examples/applications/images/plot_coins_segmentation_9.png
:target: ../auto_examples/applications/plot_coins_segmentation.html
:align: center
+1
View File
@@ -95,6 +95,7 @@ def circle(cy, cx, radius, shape=None):
Pixel coordinates of circle.
May be used to directly index into an array, e.g.
``img[rr, cc] = 1``.
Notes
-----
This function is a wrapper for skimage.draw.ellipse()
+1 -1
View File
@@ -18,7 +18,7 @@ from .util import plot_matches
from .blob import blob_dog, blob_log, blob_doh
__all__ = ['canny'
__all__ = ['canny',
'daisy',
'hog',
'greycomatrix',
+5 -5
View File
@@ -1,5 +1,5 @@
"""The local histogram is computed using a sliding window similar to the method
described in [1]_.
described in [1].
Input image can be 8-bit or 16-bit, for 16-bit input images, the number of
histogram bins is determined from the maximum value present in the image.
@@ -749,7 +749,7 @@ def tophat(image, selem, out=None, mask=None, shift_x=False, shift_y=False):
def noise_filter(image, selem, out=None, mask=None, shift_x=False,
shift_y=False):
"""Noise feature as described in [Hashimoto12]_.
"""Noise feature as described in [1].
Parameters
----------
@@ -769,7 +769,7 @@ def noise_filter(image, selem, out=None, mask=None, shift_x=False,
References
----------
.. [Hashimoto12] N. Hashimoto et al. Referenceless image quality evaluation
.. [1] N. Hashimoto et al. Referenceless image quality evaluation
for whole slide imaging. J Pathol Inform 2012;3:9.
Returns
@@ -800,7 +800,7 @@ def noise_filter(image, selem, out=None, mask=None, shift_x=False,
def entropy(image, selem, out=None, mask=None, shift_x=False, shift_y=False):
"""Local entropy [1]_.
"""Local entropy [1].
The entropy is computed using base 2 logarithm i.e. the filter returns the
minimum number of bits needed to encode the local greylevel distribution.
@@ -872,7 +872,7 @@ def otsu(image, selem, out=None, mask=None, shift_x=False, shift_y=False):
References
----------
.. [otsu] http://en.wikipedia.org/wiki/Otsu's_method
.. [1] http://en.wikipedia.org/wiki/Otsu's_method
Examples
--------
+4 -2
View File
@@ -200,8 +200,10 @@ def threshold_isodata(image, nbins=256, return_all=False):
Histogram-based threshold, known as Ridler-Calvard method or inter-means.
Threshold values returned satisfy the following equality:
threshold = (image[image <= threshold].mean() +
image[image > threshold].mean()) / 2.0
`threshold = (image[image <= threshold].mean() +`
`image[image > threshold].mean()) / 2.0`
That is, returned thresholds are intensities that separate the image into
two groups of pixels, where the threshold intensity is midway between the
mean intensities of these groups.
+1 -1
View File
@@ -220,7 +220,7 @@ def rag_mean_color(image, labels, connectivity=2, mode='distance',
labels : ndarray, shape(M, N, [..., P,])
The labelled image. This should have one dimension less than
`image`. If `image` has dimensions `(M, N, 3)` `labels` should have
dimensions `(M, N)`.
dimensions `(M, N)`.
connectivity : int, optional
Pixels with a squared distance less than `connectivity` from each other
are considered adjacent. It can range from 1 to `labels.ndim`. Its
+1 -1
View File
@@ -1,3 +1,3 @@
[pil]
description = Image reading via the Python Imaging Library
provides = imread, imsave, imshow, _app_show
provides = imread, imsave
-17
View File
@@ -260,20 +260,3 @@ def imsave(fname, arr, format_str=None):
img = ndarray_to_pil(arr, format_str=format_str)
img.save(fname, format=format_str)
def imshow(arr):
"""Display an image, using PIL's default display command.
Parameters
----------
arr : ndarray
Image to display. Images of dtype float are assumed to be in
[0, 1]. Images of dtype uint8 are in [0, 255].
"""
Image.fromarray(img_as_ubyte(arr)).show()
def _app_show():
pass
+6 -3
View File
@@ -93,15 +93,18 @@ def test_available():
def test_load_preferred_plugins_all():
from skimage.io._plugins import pil_plugin
from skimage.io._plugins import pil_plugin, matplotlib_plugin
with protect_preferred_plugins():
manage_plugins.preferred_plugins = {'all': ['pil']}
manage_plugins.preferred_plugins = {'all': ['pil'],
'imshow': ['matplotlib']}
manage_plugins.reset_plugins()
for plugin_type in ('imread', 'imsave', 'imshow'):
for plugin_type in ('imread', 'imsave'):
plug, func = manage_plugins.plugin_store[plugin_type][0]
assert func == getattr(pil_plugin, plugin_type)
plug, func = manage_plugins.plugin_store['imshow'][0]
assert func == getattr(matplotlib_plugin, 'imshow')
def test_load_preferred_plugins_imread():
+1 -1
View File
@@ -368,7 +368,7 @@ def label(input, neighbors=None, background=None, return_num=False,
Two pixels are connected when they are neighbors and have the same value.
In 2D, they can be neighbors either in a 1- or 2-connected sense.
The value refers to the maximum number of orthogonal hops to consider a
pixel/voxel a neighbor.
pixel/voxel a neighbor::
1-connectivity 2-connectivity diagonal connection close-up
+1 -1
View File
@@ -363,7 +363,7 @@ def richardson_lucy(image, psf, iterations=50, clip=True):
References
----------
.. [2] http://en.wikipedia.org/wiki/Richardson%E2%80%93Lucy_deconvolution
.. [1] http://en.wikipedia.org/wiki/Richardson%E2%80%93Lucy_deconvolution
"""
image = image.astype(np.float)
psf = psf.astype(np.float)
+7 -7
View File
@@ -65,15 +65,15 @@ def find_boundaries(label_img, connectivity=1, mode='thick', background=0):
How to mark the boundaries:
- thick: any pixel not completely surrounded by pixels of the
same label (defined by `connectivity`) is marked as a boundary.
This results in boundaries that are 2 pixels thick.
same label (defined by `connectivity`) is marked as a boundary.
This results in boundaries that are 2 pixels thick.
- inner: outline the pixels *just inside* of objects, leaving
background pixels untouched.
background pixels untouched.
- outer: outline pixels in the background around object
boundaries. When two objects touch, their boundary is also
marked.
boundaries. When two objects touch, their boundary is also
marked.
- subpixel: return a doubled image, with pixels *between* the
original pixels marked as boundary where appropriate.
original pixels marked as boundary where appropriate.
background: int, optional
For modes 'inner' and 'outer', a definition of a background
label is required. See `mode` for descriptions of these two.
@@ -197,7 +197,7 @@ def mark_boundaries(image, label_img, color=(1, 1, 0),
See Also
--------
``find_boundaries``.
find_boundaries
"""
marked = img_as_float(image, force_copy=True)
if marked.ndim == 2:
+9 -3
View File
@@ -332,7 +332,9 @@ class ProjectiveTransform(GeometricTransform):
class AffineTransform(ProjectiveTransform):
"""2D affine transformation of the form::
"""2D affine transformation of the form:
..:math:
X = a0*x + a1*y + a2 =
= sx*x*cos(rotation) - sy*y*sin(rotation + shear) + a2
@@ -551,7 +553,9 @@ class PiecewiseAffineTransform(GeometricTransform):
class SimilarityTransform(ProjectiveTransform):
"""2D similarity transformation of the form::
"""2D similarity transformation of the form:
..:math:
X = a0 * x - b0 * y + a1 =
= m * x * cos(rotation) - m * y * sin(rotation) + a1
@@ -715,7 +719,9 @@ class SimilarityTransform(ProjectiveTransform):
class PolynomialTransform(GeometricTransform):
"""2D transformation of the form::
"""2D transformation of the form:
..:math:
X = sum[j=0:order]( sum[i=0:j]( a_ji * x**(j - i) * y**i ))
Y = sum[j=0:order]( sum[i=0:j]( b_ji * x**(j - i) * y**i ))
+9 -9
View File
@@ -16,15 +16,15 @@ def random_noise(image, mode='gaussian', seed=None, clip=True, **kwargs):
mode : str
One of the following strings, selecting the type of noise to add:
'gaussian' Gaussian-distributed additive noise.
'localvar' Gaussian-distributed additive noise, with specified
local variance at each point of `image`
'poisson' Poisson-distributed noise generated from the data.
'salt' Replaces random pixels with 1.
'pepper' Replaces random pixels with 0.
's&p' Replaces random pixels with 0 or 1.
'speckle' Multiplicative noise using out = image + n*image, where
n is uniform noise with specified mean & variance.
- 'gaussian' Gaussian-distributed additive noise.
- 'localvar' Gaussian-distributed additive noise, with specified
local variance at each point of `image`
- 'poisson' Poisson-distributed noise generated from the data.
- 'salt' Replaces random pixels with 1.
- 'pepper' Replaces random pixels with 0.
- 's&p' Replaces random pixels with 0 or 1.
- 'speckle' Multiplicative noise using out = image + n*image, where
n is uniform noise with specified mean & variance.
seed : int
If provided, this will set the random seed before generating noise,
for valid pseudo-random comparisons.
+17 -9
View File
@@ -1,10 +1,18 @@
#!/usr/bin/env bash
set -ex
PY=$TRAVIS_PYTHON_VERSION
section "Test.with.min.requirements"
nosetests $TEST_ARGS skimage
section_end "Test.with.min.requirements"
section "Build.docs"
if [[ ($PY != 2.6) && ($PY != 3.2) ]]; then
sudo apt-get install -qq texlive texlive-latex-extra dvipng
make html
fi
section_end "Build.docs"
section "Flake8.test"
flake8 --exit-zero --exclude=test_*,six.py skimage doc/examples viewer_examples
@@ -14,13 +22,13 @@ section_end "Flake8.test"
section "Install.optional.dependencies"
# Install Qt and then update the Matplotlib settings
if [[ $TRAVIS_PYTHON_VERSION == 2.7* ]]; then
if [[ $PY == 2.7* ]]; then
sudo apt-get install -q python-qt4
# http://stackoverflow.com/a/9716100
LIBS=( PyQt4 sip.so )
VAR=( $(which -a python$TRAVIS_PYTHON_VERSION) )
VAR=( $(which -a python$PY) )
GET_PYTHON_LIB_CMD="from distutils.sysconfig import get_python_lib; print (get_python_lib())"
LIB_VIRTUALENV_PATH=$(python -c "$GET_PYTHON_LIB_CMD")
@@ -38,14 +46,14 @@ else
fi
# imread does NOT support py3.2
if [[ $TRAVIS_PYTHON_VERSION != 3.2 ]]; then
if [[ $PY != 3.2 ]]; then
sudo apt-get install -q libtiff4-dev libwebp-dev libpng12-dev xcftools
retry pip install -q imread
fi
# Install SimpleITK from wheelhouse if available (not 3.2 or 3.4)
if [[ $TRAVIS_PYTHON_VERSION =~ 3\.[24] ]]; then
echo "SimpleITK unavailable on $TRAVIS_PYTHON_VERSION"
if [[ $PY =~ 3\.[24] ]]; then
echo "SimpleITK unavailable on $PY"
else
retry pip install -q SimpleITK $WHEELHOUSE
fi
@@ -53,7 +61,7 @@ fi
sudo apt-get install -q libfreeimage3
retry pip install -q astropy $WHEELHOUSE
if [[ $TRAVIS_PYTHON_VERSION == 2.* ]]; then
if [[ $PY == 2.* ]]; then
retry pip install -q pyamg
fi
@@ -65,7 +73,7 @@ section_end "Install.optional.dependencies"
section "Run.doc.examples"
# Matplotlib settings - do not show figures during doc examples
if [[ $TRAVIS_PYTHON_VERSION == 2.7* ]]; then
if [[ $PY == 2.7* ]]; then
MPL_DIR=$HOME/.matplotlib
else
MPL_DIR=$HOME/.config/matplotlib
@@ -96,7 +104,7 @@ for f in doc/examples/applications/*.py; do
done
# Now configure Matplotlib to use Qt4
if [[ $TRAVIS_PYTHON_VERSION == 2.7* ]]; then
if [[ $PY == 2.7* ]]; then
MPL_QT_API=PyQt4
export QT_API=pyqt
else
@@ -112,7 +120,7 @@ section_end "Run.doc.applications"
section "Test.with.optional.dependencies"
# run tests again with optional dependencies to get more coverage
if [[ $TRAVIS_PYTHON_VERSION == 3.3 ]]; then
if [[ $PY == 3.3 ]]; then
TEST_ARGS="$TEST_ARGS --with-cov --cover-package skimage"
fi
nosetests $TEST_ARGS