Merge pull request #369 from campagnola/imageitem-tests

Imageitem tests
This commit is contained in:
Luke Campagnola 2016-08-27 17:26:43 -07:00 committed by GitHub
commit e84af46380
4 changed files with 118 additions and 15 deletions

View File

@ -300,8 +300,11 @@ class ImageItem(GraphicsObject):
y = self.mapToDevice(QtCore.QPointF(0,1)) y = self.mapToDevice(QtCore.QPointF(0,1))
w = Point(x-o).length() w = Point(x-o).length()
h = Point(y-o).length() h = Point(y-o).length()
xds = int(1/max(1, w)) if w == 0 or h == 0:
yds = int(1/max(1, h)) self.qimage = None
return
xds = int(1.0/w)
yds = int(1.0/h)
image = fn.downsample(self.image, xds, axis=0) image = fn.downsample(self.image, xds, axis=0)
image = fn.downsample(image, yds, axis=1) image = fn.downsample(image, yds, axis=1)
else: else:

View File

@ -1,17 +1,113 @@
import gc import time
import weakref
import pytest import pytest
# try:
# import faulthandler
# faulthandler.enable()
# except ImportError:
# pass
from pyqtgraph.Qt import QtCore, QtGui, QtTest from pyqtgraph.Qt import QtCore, QtGui, QtTest
import numpy as np import numpy as np
import pyqtgraph as pg import pyqtgraph as pg
from pyqtgraph.tests import assertImageApproved
app = pg.mkQApp() app = pg.mkQApp()
def test_ImageItem():
w = pg.GraphicsWindow()
view = pg.ViewBox()
w.setCentralWidget(view)
w.resize(200, 200)
w.show()
img = pg.ImageItem(border=0.5)
view.addItem(img)
# test mono float
np.random.seed(0)
data = np.random.normal(size=(20, 20))
dmax = data.max()
data[:10, 1] = dmax + 10
data[1, :10] = dmax + 12
data[3, :10] = dmax + 13
img.setImage(data)
QtTest.QTest.qWaitForWindowShown(w)
time.sleep(0.1)
app.processEvents()
assertImageApproved(w, 'imageitem/init', 'Init image item. View is auto-scaled, image axis 0 marked by 1 line, axis 1 is marked by 2 lines. Origin in bottom-left.')
# ..with colormap
cmap = pg.ColorMap([0, 0.25, 0.75, 1], [[0, 0, 0, 255], [255, 0, 0, 255], [255, 255, 0, 255], [255, 255, 255, 255]])
img.setLookupTable(cmap.getLookupTable())
assertImageApproved(w, 'imageitem/lut', 'Set image LUT.')
# ..and different levels
img.setLevels([dmax+9, dmax+13])
assertImageApproved(w, 'imageitem/levels1', 'Levels show only axis lines.')
img.setLookupTable(None)
# test mono int
data = np.fromfunction(lambda x,y: x+y*10, (129, 128)).astype(np.int16)
img.setImage(data)
assertImageApproved(w, 'imageitem/gradient_mono_int', 'Mono int gradient.')
img.setLevels([640, 641])
assertImageApproved(w, 'imageitem/gradient_mono_int_levels', 'Mono int gradient w/ levels to isolate diagonal.')
# test mono byte
data = np.fromfunction(lambda x,y: x+y, (129, 128)).astype(np.ubyte)
img.setImage(data)
assertImageApproved(w, 'imageitem/gradient_mono_byte', 'Mono byte gradient.')
img.setLevels([127, 128])
assertImageApproved(w, 'imageitem/gradient_mono_byte_levels', 'Mono byte gradient w/ levels to isolate diagonal.')
# test RGBA byte
data = np.zeros((100, 100, 4), dtype='ubyte')
data[..., 0] = np.linspace(0, 255, 100).reshape(100, 1)
data[..., 1] = np.linspace(0, 255, 100).reshape(1, 100)
data[..., 3] = 255
img.setImage(data)
assertImageApproved(w, 'imageitem/gradient_rgba_byte', 'RGBA byte gradient.')
img.setLevels([[128, 129], [128, 255], [0, 1], [0, 255]])
assertImageApproved(w, 'imageitem/gradient_rgba_byte_levels', 'RGBA byte gradient. Levels set to show x=128 and y>128.')
# test RGBA float
data = data.astype(float)
img.setImage(data / 1e9)
assertImageApproved(w, 'imageitem/gradient_rgba_float', 'RGBA float gradient.')
# checkerboard to test alpha
img2 = pg.ImageItem()
img2.setImage(np.fromfunction(lambda x,y: (x+y)%2, (10, 10)), levels=[-1,2])
view.addItem(img2)
img2.scale(10, 10)
img2.setZValue(-10)
data[..., 0] *= 1e-9
data[..., 1] *= 1e9
data[..., 3] = np.fromfunction(lambda x,y: np.sin(0.1 * (x+y)), (100, 100))
img.setImage(data, levels=[[0, 128e-9],[0, 128e9],[0, 1],[-1, 1]])
assertImageApproved(w, 'imageitem/gradient_rgba_float_alpha', 'RGBA float gradient with alpha.')
# test composition mode
img.setCompositionMode(QtGui.QPainter.CompositionMode_Plus)
assertImageApproved(w, 'imageitem/gradient_rgba_float_additive', 'RGBA float gradient with alpha and additive composition mode.')
img2.hide()
img.setCompositionMode(QtGui.QPainter.CompositionMode_SourceOver)
# test downsampling
data = np.fromfunction(lambda x,y: np.cos(0.002 * x**2), (800, 100))
img.setImage(data, levels=[-1, 1])
assertImageApproved(w, 'imageitem/resolution_without_downsampling', 'Resolution test without downsampling.')
img.setAutoDownsample(True)
assertImageApproved(w, 'imageitem/resolution_with_downsampling_x', 'Resolution test with downsampling axross x axis.')
img.setImage(data.T, levels=[-1, 1])
assertImageApproved(w, 'imageitem/resolution_with_downsampling_y', 'Resolution test with downsampling across y axis.')
@pytest.mark.skipif(pg.Qt.USE_PYSIDE, reason="pyside does not have qWait") @pytest.mark.skipif(pg.Qt.USE_PYSIDE, reason="pyside does not have qWait")
def test_dividebyzero(): def test_dividebyzero():
import pyqtgraph as pg import pyqtgraph as pg

View File

@ -1,15 +1,15 @@
import pyqtgraph as pg import pyqtgraph as pg
import numpy as np import numpy as np
app = pg.mkQApp() app = pg.mkQApp()
plot = pg.plot()
app.processEvents() app.processEvents()
# set view range equal to its bounding rect.
# This causes plots to look the same regardless of pxMode.
plot.setRange(rect=plot.boundingRect())
def test_scatterplotitem(): def test_scatterplotitem():
plot = pg.PlotWidget()
# set view range equal to its bounding rect.
# This causes plots to look the same regardless of pxMode.
plot.setRange(rect=plot.boundingRect())
for i, pxMode in enumerate([True, False]): for i, pxMode in enumerate([True, False]):
for j, useCache in enumerate([True, False]): for j, useCache in enumerate([True, False]):
s = pg.ScatterPlotItem() s = pg.ScatterPlotItem()
@ -54,6 +54,10 @@ def test_scatterplotitem():
def test_init_spots(): def test_init_spots():
plot = pg.PlotWidget()
# set view range equal to its bounding rect.
# This causes plots to look the same regardless of pxMode.
plot.setRange(rect=plot.boundingRect())
spots = [ spots = [
{'x': 0, 'y': 1}, {'x': 0, 'y': 1},
{'pos': (1, 2), 'pen': None, 'brush': None, 'data': 'zzz'}, {'pos': (1, 2), 'pen': None, 'brush': None, 'data': 'zzz'},

View File

@ -42,7 +42,7 @@ Procedure for unit-testing with images:
# pyqtgraph should be tested against. When adding or changing test images, # pyqtgraph should be tested against. When adding or changing test images,
# create and push a new tag and update this variable. To test locally, begin # create and push a new tag and update this variable. To test locally, begin
# by creating the tag in your ~/.pyqtgraph/test-data repository. # by creating the tag in your ~/.pyqtgraph/test-data repository.
testDataTag = 'test-data-4' testDataTag = 'test-data-5'
import time import time