139 lines
4.2 KiB
Python
139 lines
4.2 KiB
Python
# -*- 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 fiducial(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(sb,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([])
|
|
fd=fiducial()
|
|
fd.show()
|
|
if (sys.flags.interactive!=1) or not hasattr(QtCore, 'PYQT_VERSION'):
|
|
QtGui.QApplication.instance().exec_()
|