Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
8b27535
sharpening function
joshqsumner Oct 27, 2025
c369764
include sharpen
joshqsumner Oct 27, 2025
2eac040
test sharpen function
joshqsumner Oct 27, 2025
b877581
include sharpening in docs/updating
joshqsumner Oct 27, 2025
81d170c
deepsource
joshqsumner Oct 27, 2025
bfc3069
import params
joshqsumner Oct 27, 2025
112f66d
changing init order
joshqsumner Oct 27, 2025
24f4eb0
direct import
joshqsumner Oct 27, 2025
16287cb
deepsource
joshqsumner Oct 27, 2025
28ce95d
moving helper to helpers
joshqsumner Oct 27, 2025
68c663e
deepsource
joshqsumner Oct 27, 2025
7e3673c
shuffling order
joshqsumner Oct 27, 2025
eb51b03
deepsource again
joshqsumner Oct 27, 2025
26b8429
module name
joshqsumner Oct 27, 2025
077fd5b
changing module name back
joshqsumner Oct 27, 2025
ec799c1
moving helper back to main sharpen module
joshqsumner Oct 27, 2025
37ac07a
importing np and cv2
joshqsumner Oct 27, 2025
5f291e1
less specific namespace
joshqsumner Oct 27, 2025
0fbcbb4
params back to bottom
joshqsumner Oct 27, 2025
9af3baf
shuffling init
joshqsumner Oct 27, 2025
f1dbc4a
Merge branch 'main' into v5.0
joshqsumner Oct 27, 2025
0c52263
Merge branch 'v5.0' into image-sharpening
joshqsumner Oct 27, 2025
4fc053a
importing directly again
joshqsumner Oct 28, 2025
9c63d97
relative import
joshqsumner Oct 28, 2025
d2acd28
moving params import into function
joshqsumner Oct 28, 2025
1051b93
just going to try to change the whole thing I guess
joshqsumner Oct 28, 2025
9e179f3
testing more specific import in readimage
joshqsumner Oct 28, 2025
32085a8
test import change
joshqsumner Oct 28, 2025
3101c10
desperation? spelling?
joshqsumner Oct 28, 2025
3dc16b0
Merge branch 'v5.0' into image-sharpening
joshqsumner Oct 28, 2025
4174323
moving params and output class definitions to globals module
joshqsumner Oct 31, 2025
49665c7
Delete time_lapse_video.py
joshqsumner Oct 31, 2025
187fc66
had to remove time lapse video for checks to run
joshqsumner Oct 31, 2025
86c1c44
Merge branch 'v5.0' into image-sharpening
nfahlgren Feb 5, 2026
c3bc07d
Update docs/sharpen.md
joshqsumner Feb 5, 2026
1ea6789
copilot suggestions
joshqsumner Feb 6, 2026
5a425ef
read in as gray
joshqsumner Feb 6, 2026
0294791
Merge branch 'v5.0' into image-sharpening
nfahlgren Feb 13, 2026
aa4e48a
Add output to function signature
nfahlgren Feb 13, 2026
90eed0a
Reformat docstrings to numpydoc style
nfahlgren Feb 13, 2026
125cc85
Remove spaces
nfahlgren Feb 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added docs/img/documentation_images/sharpen/sharp1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/img/documentation_images/sharpen/sharp5.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
44 changes: 44 additions & 0 deletions docs/sharpen.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
## Sharpen

Sharpens an image through the unsharp masking method. Applies a gaussian blur which is subtracted from an exaggerated version of the starting image.

**plantcv.sharpen**(*img, ksize, amount=1, threshold=0, sigma_x=0, sigma_y=None, roi=None*)

**returns** sharpened image

- **Parameters:**
- img - RGB or grayscale image data
- ksize - Tuple of kernel dimensions, e.g. (5, 5). Must be odd integers.
- amount - Integer describing amount of sharpening, higher numbers will sharpen more.
- threshold - Integer cutoff on low contrast, contrasts lower than this will be removed.
- sigma_x - standard deviation in X direction; if 0 (default), calculated from kernel size
- sigma_y - standard deviation in Y direction; if sigma_Y is None (default), sigma_Y is taken to equal sigma_X
- roi - Optional rectangular ROI as returned by [`pcv.roi.rectangle`](roi_rectangle.md) within which to apply this function. (default = None, which uses the entire image)
- **Context:**
- Used to reduce blur in an image

**Original image**

![Screenshot](img/documentation_images/threshold_2channels/VIS_TV_z500_h2_g0_e100_163042_0_m.png)

**Sharpening Image**

```python

# Apply sharpening within an ROI to show differences
roi = pcv.roi.rectangle(img, 200, 0, 335, 200)
sharp1 = pcv.sharpen(img, (5, 5), amount=1, roi=roi)

# Higher amount of sharpening will look more dramatic
sharp5 = pcv.sharpen(img, (5, 5), amount = 5, roi=roi)
```

**Sharpen (ksize = (5,5), amount=1, roi=roi)**

![sharp1](img/documentation_images/sharpen/sharp1.png)

**Sharpen (ksize = (5,5), amount=5, roi=roi)**

![sharp5](img/documentation_images/sharpen/sharp5.png)

**Source Code:** [Here](https://github.com/danforthcenter/plantcv/blob/main/plantcv/plantcv/sharpen.py)
4 changes: 4 additions & 0 deletions docs/updating.md
Original file line number Diff line number Diff line change
Expand Up @@ -1156,6 +1156,10 @@ pages for more details on the input and output variable types.
* post v3.0dev2: sr_img = **plantcv.scharr_filter**(*gray_img, dx, dy, scale*)
* post v4.9: sr_img = **plantcv.scharr_filter**(*gray_img, dx, dy, scale, roi=None*)

#### plantcv.sharpen
* pre v5.0: NA
* post v5.0: img = **plantcv.sharpen**(*img, ksize, amount=1, threshold=0, sigma_x=0, sigma_y=None, roi=None*)

#### plantcv.shift_img

* pre v3.0dev2: device, adjusted_img = **plantcv.shift_img**(*img, device, number, side="right", debug=None*)
Expand Down
1 change: 1 addition & 0 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ nav:
- 'Filter a mask by ROI (quickly)': roi_quick_filter.md
- 'Convert ROI to Mask': roi2mask.md
- 'Segment Image Series': segment_image_series.md
- 'Sharpen Image': sharpen.md
- 'Shift Image': shift.md
- 'Spatial Clustering': spatial_clustering.md
- 'Spectral Index': spectral_index.md
Expand Down
18 changes: 10 additions & 8 deletions plantcv/plantcv/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,15 @@
__version__ = version("plantcv")

from plantcv.plantcv.fatal_error import fatal_error
from plantcv.plantcv.classes import Params
from plantcv.plantcv.classes import Outputs
from plantcv.plantcv.classes import Spectral_data
from plantcv.plantcv.classes import PSII_data
from plantcv.plantcv.classes import Points
from plantcv.plantcv.classes import Point
from plantcv.plantcv.classes import Objects

# Initialize an instance of the Params and Outputs class with default values
# params and outputs are available when plantcv is imported
params = Params()
outputs = Outputs()
from plantcv.plantcv._globals import Params, Outputs
from plantcv.plantcv._globals import params, outputs

from plantcv.plantcv.deprecation_warning import deprecation_warning
from plantcv.plantcv.warn import warn
Expand Down Expand Up @@ -63,6 +61,7 @@
from plantcv.plantcv.canny_edge_detect import canny_edge_detect
from plantcv.plantcv.opening import opening
from plantcv.plantcv.closing import closing
from plantcv.plantcv.sharpen import sharpen
from plantcv.plantcv import roi
from plantcv.plantcv import threshold
from plantcv.plantcv import visualize
Expand All @@ -87,12 +86,14 @@

__all__ = [
"fatal_error",
"Params",
"Outputs",
"Spectral_data",
'PSII_data',
'Points',
'Point',
"Objects",
"Params",
"Outputs",
"params",
"outputs",
"deprecation_warning",
"warn",
"print_image",
Expand Down Expand Up @@ -139,6 +140,7 @@
"canny_edge_detect",
"opening",
"closing",
"sharpen",
"roi",
"threshold",
"visualize",
Expand Down
2 changes: 1 addition & 1 deletion plantcv/plantcv/_debug.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Debugging module
from plantcv.plantcv import params
from plantcv.plantcv._globals import params
from plantcv.plantcv import print_image
from plantcv.plantcv import plot_image

Expand Down
Loading