Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Silx compare doc #3884

Merged
merged 3 commits into from
Jul 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions doc/source/applications/compare.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
.. _silx compare:

silx compare
============

Purpose
-------

The *silx compare* command provides a graphical user interface to compare 2D data from files.

It displays a list of datasets, and allows to open multiple datasets.
This list can be updated with drag and drop from silx view.


.. |imgViewImg| image:: img/silx-compare.png
:height: 300px
:align: middle


Usage
-----

::

silx compare [-h] [--debug] [--use-opengl-plot] [files [files ...]]


Options
-------

-h, --help show this help message and exit
--debug Set logging system in debug mode
--use-opengl-plot Use OpenGL for plots (instead of matplotlib)

Examples of usage
-----------------

::

silx compare "silx://ID16B_diatomee.h5?path=/scan1/instrument/data&slice=0" "silx://ID16B_diatomee.h5?path=/scan1/instrument/data&slice=1"
Binary file added doc/source/applications/img/silx-compare.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions doc/source/applications/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,4 @@ To see the list of all available commands, type the following command in a termi

view
convert
compare
128 changes: 3 additions & 125 deletions examples/compareImages.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,84 +34,10 @@
import silx.io
from silx.gui import qt
import silx.test.utils
from silx.io.url import DataUrl
from silx.gui.plot.CompareImages import CompareImages
from silx.gui.widgets.UrlSelectionTable import UrlSelectionTable

_logger = logging.getLogger(__name__)

import fabio

try:
import PIL
except ImportError:
_logger.debug("Backtrace", exc_info=True)
PIL = None


class CompareImagesSelection(qt.QMainWindow):
def __init__(self, backend):
qt.QMainWindow.__init__(self, parent=None)
self._plot = CompareImages(parent=self, backend=backend)

self._selectionTable = UrlSelectionTable(parent=self)
self._dockWidgetMenu = qt.QDockWidget(parent=self)
self._dockWidgetMenu.layout().setContentsMargins(0, 0, 0, 0)
self._dockWidgetMenu.setFeatures(qt.QDockWidget.DockWidgetMovable)
self._dockWidgetMenu.setWidget(self._selectionTable)
self.addDockWidget(qt.Qt.LeftDockWidgetArea, self._dockWidgetMenu)

self.setCentralWidget(self._plot)

self._selectionTable.sigImageAChanged.connect(self._updateImageA)
self._selectionTable.sigImageBChanged.connect(self._updateImageB)

def setUrls(self, urls):
for url in urls:
self._selectionTable.addUrl(url)

def setFiles(self, files):
urls = list()
for _file in files:
if os.path.isfile(_file):
urls.append(DataUrl(file_path=_file, scheme=None))
urls.sort(key=lambda url: url.path())
window.setUrls(urls)
window._selectionTable.setSelection(url_img_a=urls[0].path(),
url_img_b=urls[1].path())

def clear(self):
self._plot.clear()
self._selectionTable.clear()

def _updateImageA(self, urlpath):
self._updateImage(urlpath, self._plot.setImage1)

def _updateImage(self, urlpath, fctptr):
def getData():
_url = silx.io.url.DataUrl(path=urlpath)
for scheme in ('silx', 'fabio'):
try:
dataImg = silx.io.utils.get_data(
silx.io.url.DataUrl(file_path=_url.file_path(),
data_slice=_url.data_slice(),
data_path=_url.data_path(),
scheme=scheme))
except:
_logger.debug("Error while loading image with %s" % scheme,
exc_info=True)
else:
# TODO: check is an image
return dataImg
return None

data = getData()
if data is not None:
fctptr(data)

def _updateImageB(self, urlpath):
self._updateImage(urlpath, self._plot.setImage2)


def createTestData():
data = numpy.arange(100 * 100)
Expand All @@ -124,52 +50,14 @@ def createTestData():
return data1, data2


def loadImage(filename):
try:
return silx.io.get_data(filename)
except Exception:
_logger.debug("Error while loading image with silx.io", exc_info=True)

try:
return fabio.open(filename).data
except Exception:
_logger.debug("Error while loading image with fabio", exc_info=True)

if PIL is not None:
try:
return numpy.asarray(PIL.Image.open(filename))
except Exception:
_logger.debug("Error while loading image with PIL", exc_info=True)

raise Exception("Impossible to load '%s' with the available image libraries" % filename)


file_description = """
Image data to compare (HDF5 file with path, EDF files, JPEG/PNG image files).
Data from HDF5 files can be accessed using dataset path and slicing as an URL: silx:../my_file.h5?path=/entry/data&slice=10
EDF file frames also can can be accessed using URL: fabio:../my_file.edf?slice=10
Using URL in command like usually have to be quoted: "URL".
"""


def createParser():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument(
'files',
nargs=argparse.ZERO_OR_MORE,
help=file_description)
parser.add_argument(
'--debug',
dest="debug",
action="store_true",
default=False,
help='Set logging system in debug mode')
parser.add_argument(
'--testdata',
dest="testdata",
action="store_true",
default=False,
help='Use synthetic images to test the application')
parser.add_argument(
'--use-opengl-plot',
dest="use_opengl_plot",
Expand All @@ -192,19 +80,9 @@ def createParser():
backend = "mpl"

app = qt.QApplication([])
if options.testdata or len(options.files) == 2:
if options.testdata:
_logger.info("Generate test data")
data1, data2 = createTestData()
else:
data1 = loadImage(options.files[0])
data2 = loadImage(options.files[1])
window = CompareImages(backend=backend)
window.setData(data1, data2)
else:
data = options.files
window = CompareImagesSelection(backend=backend)
window.setFiles(options.files)

data1, data2 = createTestData()
window = CompareImages(backend=backend)
window.setData(data1, data2)
window.setVisible(True)
app.exec()
Loading