Merge branch 'integer-image-histogram-range' into develop
ImageItem.getHistogram is more clever about constructing histograms: - integer dtype images now have integer-aligned bins, with bin number determined by a target value - step size is automatically chosen based on a target image size - bins and step arguments have default values 'auto'
This commit is contained in:
commit
a51c30d02f
@ -22,6 +22,7 @@ pyqtgraph-0.9.9 [unreleased]
|
|||||||
- Assigns previously-selected text after list is cleared and repopulated
|
- Assigns previously-selected text after list is cleared and repopulated
|
||||||
- Get, set current value
|
- Get, set current value
|
||||||
- Added Flowchart.sigChartChanged
|
- Added Flowchart.sigChartChanged
|
||||||
|
- ImageItem.getHistogram is more clever about constructing histograms
|
||||||
|
|
||||||
Bugfixes:
|
Bugfixes:
|
||||||
- PlotCurveItem now has correct clicking behavior--clicks within a few px
|
- PlotCurveItem now has correct clicking behavior--clicks within a few px
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
from __future__ import division
|
||||||
|
|
||||||
from ..Qt import QtGui, QtCore
|
from ..Qt import QtGui, QtCore
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import collections
|
import collections
|
||||||
@ -287,15 +289,45 @@ class ImageItem(GraphicsObject):
|
|||||||
self.render()
|
self.render()
|
||||||
self.qimage.save(fileName, *args)
|
self.qimage.save(fileName, *args)
|
||||||
|
|
||||||
def getHistogram(self, bins=500, step=3):
|
def getHistogram(self, bins='auto', step='auto', targetImageSize=200, targetHistogramSize=500, **kwds):
|
||||||
"""Returns x and y arrays containing the histogram values for the current image.
|
"""Returns x and y arrays containing the histogram values for the current image.
|
||||||
The step argument causes pixels to be skipped when computing the histogram to save time.
|
For an explanation of the return format, see numpy.histogram().
|
||||||
|
|
||||||
|
The *step* argument causes pixels to be skipped when computing the histogram to save time.
|
||||||
|
If *step* is 'auto', then a step is chosen such that the analyzed data has
|
||||||
|
dimensions roughly *targetImageSize* for each axis.
|
||||||
|
|
||||||
|
The *bins* argument and any extra keyword arguments are passed to
|
||||||
|
np.histogram(). If *bins* is 'auto', then a bin number is automatically
|
||||||
|
chosen based on the image characteristics:
|
||||||
|
|
||||||
|
* Integer images will have approximately *targetHistogramSize* bins,
|
||||||
|
with each bin having an integer width.
|
||||||
|
* All other types will have *targetHistogramSize* bins.
|
||||||
|
|
||||||
This method is also used when automatically computing levels.
|
This method is also used when automatically computing levels.
|
||||||
"""
|
"""
|
||||||
if self.image is None:
|
if self.image is None:
|
||||||
return None,None
|
return None,None
|
||||||
stepData = self.image[::step, ::step]
|
if step == 'auto':
|
||||||
hist = np.histogram(stepData, bins=bins)
|
step = (np.ceil(self.image.shape[0] / targetSize),
|
||||||
|
np.ceil(self.image.shape[1] / targetSize))
|
||||||
|
if np.isscalar(step):
|
||||||
|
step = (step, step)
|
||||||
|
stepData = self.image[::step[0], ::step[1]]
|
||||||
|
|
||||||
|
if bins == 'auto':
|
||||||
|
if stepData.dtype.kind in "ui":
|
||||||
|
mn = stepData.min()
|
||||||
|
mx = stepData.max()
|
||||||
|
step = np.ceil((mx-mn) / 500.)
|
||||||
|
bins = np.arange(mn, mx+1.01*step, step, dtype=np.int)
|
||||||
|
else:
|
||||||
|
bins = 500
|
||||||
|
|
||||||
|
kwds['bins'] = bins
|
||||||
|
hist = np.histogram(stepData, **kwds)
|
||||||
|
|
||||||
return hist[1][:-1], hist[0]
|
return hist[1][:-1], hist[0]
|
||||||
|
|
||||||
def setPxMode(self, b):
|
def setPxMode(self, b):
|
||||||
|
Loading…
Reference in New Issue
Block a user