From 0fd5174ccaf0c0ecc0e2ff0a4540a92bbc1588bb Mon Sep 17 00:00:00 2001 From: David Manthey Date: Fri, 6 Sep 2024 16:00:58 -0400 Subject: [PATCH] Fix scaling small images in the multi source with bicubic smoothing We need a bigger border or some areas are zero. Also, fix corner computation. --- CHANGELOG.md | 6 ++++++ .../large_image_source_multi/__init__.py | 4 ++-- test/test_source_multi.py | 20 +++++++++---------- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ea62562b..9a9c7b559 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## 1.29.8 + +### Bug Fixes + +- Fix scaling small images in the multi source with bicubic smoothing ([#1627](../../pull/1627)) + ## 1.29.7 ### Improvements diff --git a/sources/multi/large_image_source_multi/__init__.py b/sources/multi/large_image_source_multi/__init__.py index 762dc7039..a400d528d 100644 --- a/sources/multi/large_image_source_multi/__init__.py +++ b/sources/multi/large_image_source_multi/__init__.py @@ -1071,7 +1071,7 @@ def _getTransformedTile(self, ts, transform, corners, scale, frame, crop=None): # we only need every 1/srcscale pixel. srcscale = int(2 ** math.log2(max(1, srcscale))) # Pad to reduce edge effects at tile boundaries - border = int(math.ceil(2 * srcscale)) + border = int(math.ceil(4 * srcscale)) region = { 'left': int(max(0, minx - border) // srcscale) * srcscale, 'top': int(max(0, miny - border) // srcscale) * srcscale, @@ -1119,8 +1119,8 @@ def _getTransformedTile(self, ts, transform, corners, scale, frame, crop=None): # Recompute where the source corners will land destcorners = (np.dot(transform, regioncorners.T).T).tolist() destShape = [ - max(max(math.ceil(c[1]) for c in destcorners), srcImage.shape[0]), max(max(math.ceil(c[0]) for c in destcorners), srcImage.shape[1]), + max(max(math.ceil(c[1]) for c in destcorners), srcImage.shape[0]), ] if max(0, -x) or max(0, -y): transform[0][2] -= max(0, -x) diff --git a/test/test_source_multi.py b/test/test_source_multi.py index fbf749035..3bbb4b708 100644 --- a/test/test_source_multi.py +++ b/test/test_source_multi.py @@ -274,13 +274,13 @@ def testMultiAffineTransform(): source = large_image_source_multi.open(imagePath) frameval = [ [243, 243, 49065], - [3920, 3920, 47672], - [13, 13, 49149], - [3943, 3943, 47695], - [246, 246, 49063], - [972, 972, 48785], - [1455, 1455, 48597], - [204, 204, 49059], + [3924, 3924, 47676], + [13, 13, 49148], + [2592, 2592, 48093], + [235, 235, 49062], + [942, 942, 48785], + [1014, 1014, 48872], + [198, 198, 49063], ] for frame in range(8): thumbs = {} @@ -292,9 +292,9 @@ def testMultiAffineTransform(): r = np.sum(img[:, :, 0] >= 128) g = np.sum(img[:, :, 1] >= 128) b = np.sum(img[:, :, 2] >= 128) - assert abs(r - frameval[frame][0]) < 200 - assert abs(g - frameval[frame][1]) < 200 - assert abs(b - frameval[frame][2]) < 200 + assert abs(r - frameval[frame][0]) < 250 + assert abs(g - frameval[frame][1]) < 250 + assert abs(b - frameval[frame][2]) < 250 assert abs(np.average(thumbs[2048] - thumbs[256])) < 7 assert abs(np.average(thumbs[1024] - thumbs[256])) < 7 assert abs(np.average(thumbs[512] - thumbs[256])) < 7