napari-dpr 0.1.0__cp312-cp312-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,103 @@
1
+ # distutils: language = c++
2
+ import numpy as np
3
+ cimport numpy as np
4
+ from libc.math cimport fabs, ceil
5
+ import scipy.ndimage as ndi
6
+ from scipy.interpolate import RectBivariateSpline
7
+
8
+ np.import_array()
9
+
10
+ ctypedef np.float64_t DTYPE_t
11
+
12
+ def dpr_set_parameters(double psf, double gain=1, double background=-1, temporal=None):
13
+ if background < 0:
14
+ background = ceil(17 * psf)
15
+ return {'gain': gain, 'background': background, 'temporal': temporal}
16
+
17
+ cpdef tuple dpr_update_single(np.ndarray[DTYPE_t, ndim=2] i, double psf, dict opt):
18
+ cdef:
19
+ int h = i.shape[0]
20
+ int w = i.shape[1]
21
+ int r = <int>ceil(opt['background'])
22
+ double g = opt['gain']
23
+ np.ndarray[DTYPE_t, ndim=2] localmin = np.zeros((h, w))
24
+ np.ndarray[DTYPE_t, ndim=2] i_localmin = np.zeros((h, w))
25
+ int u, v
26
+
27
+ i = i - i.min()
28
+ for u in range(h):
29
+ for v in range(w):
30
+ sub = i[max(0, u - r):min(h, u + r + 1), max(0, v - r):min(w, v + r + 1)]
31
+ localmin[u, v] = np.min(sub)
32
+ i_localmin[u, v] = i[u, v] - localmin[u, v]
33
+
34
+ psf /= 1.6651
35
+ x0 = np.linspace(-0.5, 0.5, w)
36
+ y0 = np.linspace(-0.5, 0.5, h)
37
+ x = np.linspace(-0.5, 0.5, round(5 * w / psf))
38
+ y = np.linspace(-0.5, 0.5, round(5 * h / psf))
39
+
40
+ interp_m = RectBivariateSpline(y0, x0, i_localmin)(y, x)
41
+ interp_m[interp_m < 0] = 0
42
+ interp_m = np.pad(interp_m, 10)
43
+
44
+ interp_i = RectBivariateSpline(y0, x0, i)(y, x)
45
+ interp_i[interp_i < 0] = 0
46
+ interp_i = np.pad(interp_i, 10)
47
+
48
+ hn, wn = interp_i.shape
49
+ norm = interp_m / (ndi.gaussian_filter(interp_m, 10) + 1e-5)
50
+
51
+ sobel_x = np.array([[1, 0, -1], [2, 0, -2], [1, 0, -1]])
52
+ sobel_y = np.array([[1, 2, 1], [0, 0, 0], [-1, -2, -1]])
53
+ gx = ndi.convolve(norm, sobel_y, mode='reflect') / (norm + 1e-5)
54
+ gy = ndi.convolve(norm, sobel_x, mode='reflect') / (norm + 1e-5)
55
+
56
+ gain_val = 0.5 * g + 1
57
+ dx = gain_val * gx
58
+ dy = gain_val * gy
59
+ dx[np.abs(dx) > 10] = 0
60
+ dy[np.abs(dy) > 10] = 0
61
+
62
+ out = np.zeros((hn, wn))
63
+ cdef int nx, ny, fx, fy, sx, sy
64
+ cdef double wx, wy, w1, w2, w3, w4, val
65
+
66
+ for nx in range(10, hn - 10):
67
+ for ny in range(10, wn - 10):
68
+ wx, wy = dx[nx, ny], dy[nx, ny]
69
+ fx, fy = int(wx), int(wy)
70
+ sx, sy = int(np.sign(wx)), int(np.sign(wy))
71
+ w1 = (1 - fabs(wx - fx)) * (1 - fabs(wy - fy))
72
+ w2 = (1 - fabs(wx - fx)) * fabs(wy - fy)
73
+ w3 = fabs(wx - fx) * (1 - fabs(wy - fy))
74
+ w4 = fabs(wx - fx) * fabs(wy - fy)
75
+ val = interp_i[nx, ny]
76
+ out[nx + fx, ny + fy] += w1 * val
77
+ out[nx + fx, ny + fy + sy] += w2 * val
78
+ out[nx + fx + sx, ny + fy] += w3 * val
79
+ out[nx + fx + sx, ny + fy + sy] += w4 * val
80
+
81
+ return out[10:-10, 10:-10], interp_i[10:-10, 10:-10], g, r
82
+
83
+ cpdef tuple dpr_stack(np.ndarray[DTYPE_t, ndim=3] s, double psf, dict opt):
84
+ cdef int f = s.shape[2]
85
+ dpr0, mag0, _, _ = dpr_update_single(s[:, :, 0], psf, opt)
86
+ shp = dpr0.shape
87
+ out = np.zeros((shp[0], shp[1], f))
88
+ mag = np.zeros((shp[0], shp[1], f))
89
+ cdef int i
90
+ for i in range(f):
91
+ dpr, m, _, _ = dpr_update_single(s[:, :, i], psf, opt)
92
+ out[:, :, i] = dpr
93
+ mag[:, :, i] = m
94
+ if opt.get('temporal') == 'mean':
95
+ out = np.mean(out, axis=2)
96
+ elif opt.get('temporal') == 'var':
97
+ out = np.var(out, axis=2)
98
+ return out, mag
99
+ cpdef tuple apply_dpr(np.ndarray[DTYPE_t, ndim=3] im, double psf=4, double gain=2, double background=10, temporal='mean'):
100
+ if im.ndim == 2:
101
+ im = im[:, :, np.newaxis]
102
+ opt = dpr_set_parameters(psf, gain, background, temporal)
103
+ return dpr_stack(im, psf, opt)
napari_dpr/napari.yaml ADDED
@@ -0,0 +1,10 @@
1
+ name: napari-dpr
2
+ display_name: DPR Resolution Enhancement
3
+ contributions:
4
+ commands:
5
+ - id: napari-dpr.enhance_image
6
+ title: Enhance resolution with DPR
7
+ python_name: napari_dpr._widget:enhance_image
8
+ widgets:
9
+ - command: napari-dpr.enhance_image
10
+ display_name: DPR Enhancement
napari_dpr/run.dpr.py ADDED
@@ -0,0 +1,68 @@
1
+ # run_dpr.py
2
+ import os
3
+ import numpy as np
4
+ import tifffile as tf
5
+ from napari_dpr.dpr_core import apply_dpr
6
+ import matplotlib.pyplot as plt
7
+ import time
8
+ from pathlib import Path
9
+
10
+ def run_example(input_file=None):
11
+ """Run DPR on an example image file."""
12
+
13
+ # If no input file is provided, try to find the test image in standard locations
14
+ if input_file is None:
15
+ # Try several possible locations for the test image
16
+ possible_paths = [
17
+ "test_data/test_image.tif", # Repository structure
18
+ "../test_data/test_image.tif", # If run from src directory
19
+ "../../test_data/test_image.tif", # If run from deeper directory
20
+ os.path.join(os.path.dirname(__file__), '../../test_data/test_image.tif') # Relative to script
21
+ ]
22
+
23
+ for path in possible_paths:
24
+ if os.path.exists(path):
25
+ input_file = path
26
+ break
27
+
28
+ if input_file is None:
29
+ # If no test image is found, generate a random one
30
+ print("No test image found, generating random data...")
31
+ input_image = np.random.rand(64, 64, 5).astype(np.float64)
32
+ else:
33
+ print(f"Using test image: {input_file}")
34
+ else:
35
+ print(f"Using provided image: {input_file}")
36
+
37
+ # Load the image if a file was found or provided
38
+ if input_file is not None:
39
+ input_image = tf.imread(input_file)
40
+ # Ensure correct dimensions (HEIGHT, WIDTH, TIME)
41
+ if input_image.ndim == 3 and input_image.shape[0] < input_image.shape[1]:
42
+ input_image = input_image.transpose([1, 2, 0])
43
+
44
+ # Ensure 3D image (HEIGHT, WIDTH, TIME)
45
+ if input_image.ndim == 2:
46
+ input_image = input_image[:, :, np.newaxis]
47
+
48
+ # Process with DPR
49
+ print(f"Processing image of shape {input_image.shape}...")
50
+ start = time.time()
51
+ dpr_out, magnified = apply_dpr(input_image, psf=4.0)
52
+ print(f"Time taken: {time.time() - start:.2f} seconds")
53
+
54
+ # Display results
55
+ plt.figure(figsize=(12, 6))
56
+ plt.subplot(121)
57
+ plt.title("Original (Magnified)")
58
+ plt.imshow(magnified.sum(2))
59
+ plt.subplot(122)
60
+ plt.title("DPR Enhanced")
61
+ plt.imshow(dpr_out)
62
+ plt.tight_layout()
63
+ plt.show()
64
+
65
+ return dpr_out, magnified
66
+
67
+ if __name__ == "__main__":
68
+ run_example()
@@ -0,0 +1,41 @@
1
+ Metadata-Version: 2.4
2
+ Name: napari-dpr
3
+ Version: 0.1.0
4
+ Summary: Napari plugin for DPR Resolution Enhancement
5
+ Author-email: JenuC <jenu.chacko@wisc.edu>
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/jenuc/napari-dpr
8
+ Project-URL: Bug Tracker, https://github.com/jenuc/napari-dpr/issues
9
+ Project-URL: Documentation, https://github.com/jenuc/napari-dpr#README.md
10
+ Classifier: Development Status :: 3 - Alpha
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3.9
13
+ Classifier: Programming Language :: Python :: 3.10
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Framework :: napari
19
+ Classifier: Intended Audience :: Science/Research
20
+ Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
21
+ Classifier: Topic :: Scientific/Engineering :: Image Processing
22
+ Requires-Python: >=3.9
23
+ Description-Content-Type: text/markdown
24
+ Requires-Dist: napari>=0.4.18
25
+ Requires-Dist: numpy>=1.24.3
26
+ Requires-Dist: scipy>=1.10.1
27
+ Requires-Dist: matplotlib>=3.7.2
28
+ Requires-Dist: cython>=0.29.0
29
+ Requires-Dist: setuptools>=42.0.0
30
+ Requires-Dist: tifffile
31
+ Requires-Dist: pillow
32
+ Requires-Dist: magicgui>=0.5.0
33
+ Requires-Dist: qtpy
34
+ Provides-Extra: dev
35
+ Requires-Dist: pytest; extra == "dev"
36
+ Requires-Dist: build; extra == "dev"
37
+ Requires-Dist: twine; extra == "dev"
38
+ Requires-Dist: cibuildwheel; extra == "dev"
39
+ Provides-Extra: testing
40
+ Requires-Dist: pytest; extra == "testing"
41
+ Requires-Dist: pytest-qt; extra == "testing"
@@ -0,0 +1,16 @@
1
+ napari_dpr/__init__.py,sha256=HFUdQMoqtTsOemML-GXsGoAC8q-EGgfAbqgQzhqfRwY,165
2
+ napari_dpr/_widget.py,sha256=_4c3sK7JQGcBR97SHkh8EkSULcw_O0IE9kaRXY-lT44,2933
3
+ napari_dpr/dpr.py,sha256=6pNcqYCI7HQXJv2nU33ZFyhEJu4Po5Fo3xG5Z1L8WIc,5267
4
+ napari_dpr/dpr_core.cp310-win_amd64.pyd,sha256=XSPkw-7w569QoqQytaG7Qr2c-4tefdOF91GfzsoSI94,102912
5
+ napari_dpr/dpr_core.cp311-win_amd64.pyd,sha256=VmFCAzAHVzCk4mcMBg8EBryLjMQoPRwALk47v1y5ktk,103424
6
+ napari_dpr/dpr_core.cp312-win_amd64.pyd,sha256=CCpiLdPcziOmnP9l6psT1tUDTRiWMqqOxvVu-74QpX8,102400
7
+ napari_dpr/dpr_core.cp39-win_amd64.pyd,sha256=YnljIT3EbCAuhz1w2pHmi4HfIj7xUb7wUNtoLnFAcOY,102912
8
+ napari_dpr/dpr_core.cpp,sha256=vA_q9YKFdjR0zum6jiUDicGLamarxZjUya6Iagx6OXA,621646
9
+ napari_dpr/dpr_core.pyx,sha256=GGnCR37RnWW_IDBHwuqrCevCUJHo5p7cNhQyKUQlvIs,3804
10
+ napari_dpr/napari.yaml,sha256=52yyMHUE3xPkS-3rVPKhqRRDXN2fyF6mjS021FzihkA,309
11
+ napari_dpr/run.dpr.py,sha256=NDr2QhzYMjr0ZqudspgzOCZhMxaqRrbejwaS7lPs6_4,2427
12
+ napari_dpr-0.1.0.dist-info/METADATA,sha256=6H1apAE54fyczp5aCUQQ3xF_Kf3dTxavZDnOAqh3hCk,1652
13
+ napari_dpr-0.1.0.dist-info/WHEEL,sha256=KI7LHhz6dTtDDO7VYe8QnwL5I_g0fgqsSHIhDBBaEVw,101
14
+ napari_dpr-0.1.0.dist-info/entry_points.txt,sha256=EWQt54qiAOwySprF_niJSapFgqHgkTB2TNnyYXiVQa0,54
15
+ napari_dpr-0.1.0.dist-info/top_level.txt,sha256=i9hH6jDl1Ge8GHx1LoWvm1k5DLu4b7-59b5ceuaWxuI,11
16
+ napari_dpr-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (78.1.1)
3
+ Root-Is-Purelib: false
4
+ Tag: cp312-cp312-win_amd64
5
+
@@ -0,0 +1,2 @@
1
+ [napari.manifest]
2
+ napari-dpr = napari_dpr:napari.yaml
@@ -0,0 +1 @@
1
+ napari_dpr