diff --git a/.gitignore b/.gitignore index ad1fb101..9002b892 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +imagepy/data/config.json # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] diff --git a/imagepy/data/config.json b/imagepy/data/config.json index fe7b9a33..b7722ba7 100644 --- a/imagepy/data/config.json +++ b/imagepy/data/config.json @@ -1 +1 @@ -[["uistyle", "imagepy", null], ["mea_style", {"color": [0, 0, 255], "fcolor": [255, 255, 255], "fill": false, "lw": 2, "tcolor": [0, 255, 0], "size": 12}, null], ["mark_style", {"color": [0, 255, 0], "fcolor": [255, 255, 255], "fill": false, "lw": 1, "tcolor": [255, 0, 0], "size": 8}, null], ["recent", ["C:/Users/54631/Desktop/\u6d77\u51b0\u62a5\u4ef7/testmacros.mc", "C:\\Users\\Administrator\\Downloads\\\u7d20\u6750\u2014\u8f66\u5934\\\u6d4b\u8bd5-JK1-\u52ff\u5220\\20170201\\In-20170201151126911-\u6842J73220-\u9ec4-qj-1.jpg", "C:/Users/Administrator/Desktop/imagepy/imagepy/plugins/demoplugin/menus/Demos/Macros Demo/Macros Gaussian Invert.mc", "DEM.mc"], null], ["roi_style", {"color": [255, 255, 0], "fcolor": [255, 255, 255], "fill": false, "lw": 1, "tcolor": [255, 255, 0], "size": 8}, null], ["language", "English", null]] \ No newline at end of file +[["language", "English", null], ["roi_style", {"color": [255, 255, 0], "fcolor": [255, 255, 255], "fill": false, "lw": 1, "tcolor": [255, 255, 0], "size": 8}, null], ["recent", ["C:/Users/54631/Desktop/\u6d77\u51b0\u62a5\u4ef7/testmacros.mc", "C:\\Users\\Administrator\\Downloads\\\u7d20\u6750\u2014\u8f66\u5934\\\u6d4b\u8bd5-JK1-\u52ff\u5220\\20170201\\In-20170201151126911-\u6842J73220-\u9ec4-qj-1.jpg", "C:/Users/Administrator/Desktop/imagepy/imagepy/plugins/demoplugin/menus/Demos/Macros Demo/Macros Gaussian Invert.mc", "DEM.mc"], null], ["mark_style", {"color": [0, 255, 0], "fcolor": [255, 255, 255], "fill": false, "lw": 1, "tcolor": [255, 0, 0], "size": 8}, null], ["mea_style", {"color": [0, 0, 255], "fcolor": [255, 255, 255], "fill": false, "lw": 2, "tcolor": [0, 255, 0], "size": 12}, null], ["uistyle", "imagepy", null]] \ No newline at end of file diff --git a/imagepy/menus/Kit3D/Analysis 3D/regionprops3d_plgs.py b/imagepy/menus/Kit3D/Analysis 3D/regionprops3d_plgs.py index 2ca4e55d..10c4130a 100644 --- a/imagepy/menus/Kit3D/Analysis 3D/regionprops3d_plgs.py +++ b/imagepy/menus/Kit3D/Analysis 3D/regionprops3d_plgs.py @@ -1,7 +1,8 @@ import numpy as np from sciapp.action import Simple, Filter from scipy.ndimage import label, generate_binary_structure -from skimage.measure import marching_cubes_lewiner, mesh_surface_area +# from skimage.measure import marching_cubes_lewiner, mesh_surface_area # scikit-image 0.15 +from skimage.measure import marching_cubes, mesh_surface_area # scikit-image 0.19 from skimage.segmentation import find_boundaries from skimage.measure import regionprops from numpy.linalg import norm @@ -65,7 +66,8 @@ def run(self, ips, imgs, para = None): dt.append([round(i.centroid[2]*k,1) for i in ls]) if para['surf']: buf[find_boundaries(buf, mode='outer')] = 0 - vts, fs, ns, cs = marching_cubes_lewiner(buf, level=0) + # vts, fs, ns, cs = marching_cubes_lewiner(buf, level=0) # scikit-image 0.15 + vts, fs, ns, cs = marching_cubes(buf, level=0, method='lewiner') # scikit-image 0.19 lst = [[] for i in range(n+1)] for i in fs: lst[int(cs[i[0]])].append(i) dt.append([0 if len(i)==0 else mesh_surface_area(vts, np.array(i))*k**2 for i in lst][1:]) @@ -124,4 +126,4 @@ def run(self, ips, imgs, para = None): idx[0] = para['front'] if para['inv'] else 0 imgs[:] = idx[lab] -plgs = [RegionLabel, RegionCounter, RegionFilter] \ No newline at end of file +plgs = [RegionLabel, RegionCounter, RegionFilter] diff --git a/imagepy/menus/Kit3D/Analysis 3D/surfacemeasure_plg.py b/imagepy/menus/Kit3D/Analysis 3D/surfacemeasure_plg.py index 2a8f6cd6..2dae02d2 100644 --- a/imagepy/menus/Kit3D/Analysis 3D/surfacemeasure_plg.py +++ b/imagepy/menus/Kit3D/Analysis 3D/surfacemeasure_plg.py @@ -1,5 +1,6 @@ from sciapp.action import Filter -from skimage.measure import marching_cubes_lewiner, mesh_surface_area +from skimage.measure import marching_cubes, mesh_surface_area +# from skimage.measure import marching_cubes_lewiner, mesh_surface_area import numpy as np import pandas as pd @@ -37,8 +38,9 @@ def run(self, ips, snap, img, para = None): sfront = (ips.imgs[::ds,::ds,::ds]>lev).sum() * ds ** 3 * k**3 sback = scube - sfront print(scube, sfront, sback) - vts, fs, ns, cs = marching_cubes_lewiner(ips.imgs[::ds,::ds,::ds], lev, step_size=step) + # vts, fs, ns, cs = marching_cubes_lewiner(ips.imgs[::ds,::ds,::ds], lev, step_size=step) + vts, fs, ns, cs = marching_cubes(ips.imgs[::ds,::ds,::ds], lev, step_size=step, method='lewiner') area = mesh_surface_area(vts, fs) * (ds**2 * k **2) rst = [round(i,3) for i in [scube, sfront, sback, sfront/scube, area, area/sfront]] titles = ['Cube Volume', 'Volume', 'Blank', 'Volume/Cube', 'Surface', 'Volume/Surface'] - IPy.show_table(pd.DataFrame([rst], columns=titles), ips.title+'-Volume Measure') \ No newline at end of file + IPy.show_table(pd.DataFrame([rst], columns=titles), ips.title+'-Volume Measure') diff --git a/imagepy/menus/Selection/roiwindow_wgt.py b/imagepy/menus/Selection/roiwindow_wgt.py index 778242e6..f2663a28 100644 --- a/imagepy/menus/Selection/roiwindow_wgt.py +++ b/imagepy/menus/Selection/roiwindow_wgt.py @@ -232,7 +232,7 @@ def on_add(self, event): Macros('', ['ROI Add>None']).start(self.app, callafter=self.UpdateData) def on_add_nameless(self, event): - ips = ImageManager.get() + ips = self.app.get_img() if ips is None: return self.app.alert('No image opened!') if ips.roi is None: return self.app.alert('No Roi found!') Macros('', ['ROI Add>{"name":"%s-roi"}'%ips.title]).start(self.app, callafter=self.UpdateData) @@ -313,10 +313,14 @@ def on_setting(self, event): Macros('', ['ROI Setting>None']).start(self.app) def UpdateData(self): - names = self.app.manager('roi').gets('name') - objs = self.app.manager('roi').gets('obj') - types = [ROI(mark2shp(i)).roitype for i in objs] + names = self.app.manager('roi').names() + if len(names) == 0: + objs = [] + else: + objs = self.app.manager('roi').gets() + types = [ROI(mark2shp(i[1])).roitype for i in objs] self.lst_rois.SetValue(list(zip(names, types))) + self.lst_rois.Refresh() def __del__( self ): pass \ No newline at end of file diff --git a/imagepy/tools/Draw/aibrush_tol.py b/imagepy/tools/Draw/aibrush_tol.py index 5a50caba..59ade309 100644 --- a/imagepy/tools/Draw/aibrush_tol.py +++ b/imagepy/tools/Draw/aibrush_tol.py @@ -2,7 +2,8 @@ import numpy as np from time import time from skimage.morphology import flood_fill, flood -from skimage.draw import line, circle +# from skimage.draw import line, circle +from skimage.draw import line, disk from skimage.segmentation import felzenszwalb from sciapp.util import mark2shp from scipy.ndimage import binary_fill_holes, binary_dilation, binary_erosion @@ -21,7 +22,8 @@ def local_brush(img, back, r, c, color, sigma, msize): def local_pen(img, r, c, R, color): img = img.reshape((img.shape+(1,))[:3]) - rs, cs = circle(r, c, R/2+1e-6, shape=img.shape) + # rs, cs = circle(r, c, R/2+1e-6, shape=img.shape) + rs, cs = disk((r, c), R/2+1e-6, shape=img.shape) img[rs, cs] = color def local_in_fill(img, r, c, R, color, bcolor): @@ -29,7 +31,8 @@ def local_in_fill(img, r, c, R, color, bcolor): msk = (img == color).min(axis=2) filled = binary_fill_holes(msk) filled ^= msk - rs, cs = circle(r, c, R/2+1e-6, shape=img.shape) + # rs, cs = circle(r, c, R/2+1e-6, shape=img.shape) + rs, cs = disk((r, c), R/2+1e-6, shape=img.shape) msk[:] = 0 msk[rs, cs] = 1 msk &= filled @@ -38,7 +41,8 @@ def local_in_fill(img, r, c, R, color, bcolor): def local_out_fill(img, r, c, R, color, bcolor): img = img.reshape((img.shape+(1,))[:3]) msk = (img != color).max(axis=2) - rs, cs = circle(r, c, R/2+1e-6, shape=img.shape) + # rs, cs = circle(r, c, R/2+1e-6, shape=img.shape) + rs, cs = disk((r, c), R/2+1e-6, shape=img.shape) buf = np.zeros_like(msk) buf[rs, cs] = 1 msk &= buf @@ -49,7 +53,8 @@ def local_sketch(img, r, c, R, color, bcolor): msk = (img == color).min(axis=2) dilation = binary_dilation(msk, np.ones((3,3))) dilation ^= msk - rs, cs = circle(r, c, R/2+1e-6, shape=img.shape) + # rs, cs = circle(r, c, R/2+1e-6, shape=img.shape) + rs, cs = disk((r, c), R/2+1e-6, shape=img.shape) msk[:] = 0 msk[rs, cs] = 1 msk &= dilation @@ -280,4 +285,4 @@ def mouse_wheel(self, ips, x, y, d, **key): elif self.status == None: if d>0:key['canvas'].zoomout(x, y, 'data') if d<0:key['canvas'].zoomin(x, y, 'data') - ips.update() \ No newline at end of file + ips.update() diff --git a/imagepy/tools/Standard/painter_tol.py b/imagepy/tools/Standard/painter_tol.py index 5642b348..dd94390f 100644 --- a/imagepy/tools/Standard/painter_tol.py +++ b/imagepy/tools/Standard/painter_tol.py @@ -1,10 +1,12 @@ from sciapp.action import ImageTool -from skimage.draw import line, circle +# from skimage.draw import line, circle +from skimage.draw import line, disk def drawline(img, oldp, newp, w, value): if img.ndim == 2 and hasattr(value, '__iter__'): value = sum(value)/3 oy, ox = line(*[int(round(i)) for i in oldp+newp]) - cy, cx = circle(0, 0, w/2+1e-6) + # cy, cx = circle(0, 0, w/2+1e-6) + cy, cx = disk((0, 0), w/2+1e-6) ys = (oy.reshape((-1,1))+cy).clip(0, img.shape[0]-1) xs = (ox.reshape((-1,1))+cx).clip(0, img.shape[1]-1) img[ys.ravel(), xs.ravel()] = value @@ -35,4 +37,4 @@ def mouse_move(self, ips, x, y, btn, **key): self.oldp = (y, x) ips.update() - def mouse_wheel(self, ips, x, y, d, **key):pass \ No newline at end of file + def mouse_wheel(self, ips, x, y, d, **key):pass diff --git a/requirements.txt b/requirements.txt index 1be86b5a..92e66320 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,3 +15,6 @@ markdown python-markdown-math moderngl dulwich +matplotlib +vispy +pystackreg