Repository: scikit-image/scikit-image

Issue:
"pages" parameter is not passed to tifffile's imread
## Description
When trying to load a tif file with the additional "pages" parameter I get an error message:

```
Traceback (most recent call last):

  File "<ipython-input-18-4a8d1197932c>", line 1, in <module>
    io.imread('dataRaw_0002_ang090.tif',plugin='tifffile',pages=[3])

  File "C:\ProgramData\Anaconda3\lib\site-packages\skimage\io\_io.py", line 61, in imread
    img = call_plugin('imread', fname, plugin=plugin, **plugin_args)

  File "C:\ProgramData\Anaconda3\lib\site-packages\skimage\io\manage_plugins.py", line 211, in call_plugin
    return func(*args, **kwargs)

  File "C:\ProgramData\Anaconda3\lib\site-packages\skimage\io\_plugins\tifffile_plugin.py", line 31, in imread
    return tif.asarray(**kwargs)

TypeError: asarray() got an unexpected keyword argument 'pages'
```
According to 
http://scikit-image.org/docs/0.13.x/api/skimage.io.html#skimage.io.imread
it should be possible to pass plugin args, however when you look into 

> skimage\io\_plugins\tifffile_plugin.py line 30
(this also persists in the newest version though a bit changed code: https://github.com/scikit-image/scikit-image/blob/master/skimage/io/_plugins/tifffile_plugin.py)

you see that no arguments are passed to the Tifffile class, and instead all arguments are passed to the asarray function one line after.

## Way to reproduce
- Code example: `io.imread('sample.tif',plugin='tifffile',pages=[3])`
- Operating system and version: Windows 10 64bit, 
- Python 3.7
- skimage 0.13.1




Discussion:
seems like you are right that the docs are inconsistent.

Would you be interested in making the pull request to address it?
ok i can do that. guess I'll have to fork then first?
@MarcelBeining Yes! Please have a look at our [contributing guide](http://scikit-image.org/docs/dev/contribute.html)! We are here to help if you have any questions!

Resolving patch:
diff --git a/skimage/external/tifffile/__init__.py b/skimage/external/tifffile/__init__.py
--- a/skimage/external/tifffile/__init__.py
+++ b/skimage/external/tifffile/__init__.py
@@ -1,5 +1,6 @@
-from .tifffile import imsave, imread, imshow, TiffFile, TiffWriter, TiffSequence
+from .tifffile import imsave, imread, imshow, TiffFile, TiffWriter, \
+    TiffSequence, parse_kwargs
 
 __version__ = '0.6.2'
 __all__ = ('imsave', 'imread', 'imshow', 'TiffFile', 'TiffWriter',
-           'TiffSequence')
+           'TiffSequence', 'parse_kwargs')
diff --git a/skimage/io/_plugins/tifffile_plugin.py b/skimage/io/_plugins/tifffile_plugin.py
--- a/skimage/io/_plugins/tifffile_plugin.py
+++ b/skimage/io/_plugins/tifffile_plugin.py
@@ -1,4 +1,4 @@
-from ...external.tifffile import TiffFile, imsave
+from ...external.tifffile import TiffFile, imsave, parse_kwargs
 
 
 def imread(fname, dtype=None, **kwargs):
@@ -24,7 +24,15 @@ def imread(fname, dtype=None, **kwargs):
     .. [1] http://www.lfd.uci.edu/~gohlke/code/tifffile.py
 
     """
+
     if 'img_num' in kwargs:
         kwargs['key'] = kwargs.pop('img_num')
-    with TiffFile(fname) as tif:
+
+    # parse_kwargs will extract keyword arguments intended for the TiffFile 
+    # class and remove them from the kwargs dictionary in-place
+    tiff_keys = ['multifile', 'multifile_close', 'pages', 'fastij', 'is_ome']
+    kwargs_tiff = parse_kwargs(kwargs, *tiff_keys)
+
+    # read and return tiff as numpy array
+    with TiffFile(fname, **kwargs_tiff) as tif:
         return tif.asarray(**kwargs)


Test patch:
diff --git a/skimage/io/tests/test_tifffile.py b/skimage/io/tests/test_tifffile.py
--- a/skimage/io/tests/test_tifffile.py
+++ b/skimage/io/tests/test_tifffile.py
@@ -37,6 +37,11 @@ def test_imread_multipage_rgb_tif():
     img = imread(os.path.join(data_dir, 'multipage_rgb.tif'))
     assert img.shape == (2, 10, 10, 3), img.shape
 
+def test_tifffile_kwarg_passthrough ():
+    img = imread(os.path.join(data_dir, 'multipage.tif'), pages=[1], 
+                 multifile=False, multifile_close=True, fastij=True, 
+                 is_ome=True)
+    assert img.shape == (15, 10), img.shape
 
 def test_imread_handle():
     expected = np.load(os.path.join(data_dir, 'chessboard_GRAY_U8.npy'))