# -*- coding: utf-8 -*- """ Demonstrate a simple data-slicing task: given 3D data (displayed at top), select a 2D plane and interpolate data along that plane to generate a slice image (displayed at bottom). https://www.hindawi.com/journals/js/2021/5643054/ https://www.hindawi.com/journals/mpe/2021/8243072/ """ import logging import numpy as np _log=logging.getLogger(__name__) import numpy as np import PIL.Image from scipy import ndimage,signal import glob from pyqtgraph.Qt import QtCore, QtGui import pyqtgraph as pg class autofocus(QtGui.QMainWindow): def __init__(self, parent = None): super(autofocus, self).__init__(parent) self.resize(800, 1500) self.setWindowTitle('pyqtgraph example: DataSlicing') cw=QtGui.QWidget() self.setCentralWidget(cw) l=QtGui.QGridLayout() cw.setLayout(l) #self._imgLst=imgLst=sorted(glob.glob("../scratch/autofocus1/image*.png")) self._imgLst=imgLst=sorted(glob.glob("../scratch/autofocus2/image*.png")) self._metrics=mtr=np.ndarray(shape=(len(imgLst), 5)) mtr[:]=0 self._sld=sld=QtGui.QSlider(QtCore.Qt.Horizontal) sld.setMinimum(0) sld.setMaximum(len(imgLst)-1) sld.setValue(0) sld.setTickPosition(QtGui.QSlider.TicksBelow) sld.setTickInterval(1) sld.valueChanged.connect(self.cb_sld_change) self._imv1=imv1=pg.ImageView() self._imv2=imv2=pg.ImageView() #spl=QtGui.QSplitter(QtCore.Qt.Horizontal) self._pw=pw=pg.PlotWidget(name='Plot1') ## giving the plots names allows us to link self._plt=plt=[] for c in ('rgbcy'): plt.append(pw.plot(pen=c)) pw.resize(100,100) pw.setMaximumSize(2000,200) l.addWidget(sld, 0, 0) l.addWidget(imv1, 1, 0) l.addWidget(imv2, 2, 0) l.addWidget(pw, 3, 0) ## Display the data self.cb_sld_change(0,True) mtr[1:,:]=mtr[0,:] self._imv1.setHistogramRange(0, 100) self._imv1.setLevels(0, 40) self._imv2.setHistogramRange(0, 100) self._imv2.setLevels(0, 40) def cb_sld_change(self,val,auto=False): i=self._sld.value() _log.debug(f'{i}') fn= self._imgLst[i] img=PIL.Image.open(fn) img=np.asarray(img) #slb=ndimage.sobel(img) img16=np.array(img,np.int16) s1=np.array(((1,0,-1),(2,0,-2),(1,0,-1)),np.int16) sb1=signal.convolve2d(img16, s1, mode='same', boundary='fill', fillvalue=0) sb2=signal.convolve2d(img16, s1.T, mode='same', boundary='fill', fillvalue=0) sb=np.abs(sb1)+np.abs(sb2) #remove irrelevant low values idx=sb[:]<20 sbLut=sb*1 sbLut[idx]=0 #import numpy as np #import matplotlib.pyplot as plt mx=sb.max()+1 lut=(np.sin(np.arange(mx)/mx*np.pi-np.pi/2)+1)*128 #lut=((np.arcsin(np.arange(mx)/(mx-1)*2-1)/np.pi)+.5)*255 #lut=np.array(lut*255,np.uint16) #sbLut=lut[sb] #import matplotlib.pyplot as plt #plt.plot(lut);plt.show() #img2=ndimage.grey_dilation(sb,size=(5,5)) #, size=None, footprint=None, structure=None, output=None, mode='reflect', cval=0.0, origin=0) img2=ndimage.grey_closing(sb,size=(25,25)) #, size=None, footprint=None, structure=None, output=None, mode='reflect', cval=0.0, origin=0) #fft=np.log(np.abs(np.fft.fft2(sb))) #fft=np.fft.fftshift(fft) # fft[300:700,400:800]=0 # v[i,1]=fft.sum() self._imv1.setImage(img,autoRange=auto,autoLevels=auto,autoHistogramRange=auto) self._imv2.setImage(sb,autoRange=auto,autoLevels=auto,autoHistogramRange=auto) #self._imv2.setImage(sbLut,autoRange=auto,autoLevels=auto,autoHistogramRange=auto) mtr=self._metrics mtr[i, 0]=img.std() mtr[i, 1]=sb.sum() mtr[i, 2]=sb.std() mtr[i, 3]=sbLut.sum()#sb.std() mtr[i, 4]=sbLut.std()#img2.sum() mx=mtr.max(0) mn=mtr.min(0) mtr=(mtr-mn)/(mx-mn) _log.debug(f'{i} {mtr[i,:]}') for i in range(mtr.shape[1]): self._plt[i].setData(mtr[:,i]) ## Start Qt event loop unless running in interactive mode. if __name__=='__main__': import sys logging.basicConfig(level=logging.DEBUG, format='%(levelname)s:%(module)s:%(lineno)d:%(funcName)s:%(message)s ') app=QtGui.QApplication([]) af=autofocus() af.show() if (sys.flags.interactive!=1) or not hasattr(QtCore, 'PYQT_VERSION'): QtGui.QApplication.instance().exec_()