vfertical at x style rewrite
This commit is contained in:
parent
77e5968236
commit
1accbe27b6
1 changed files with 33 additions and 29 deletions
|
|
@ -201,51 +201,55 @@ class StitchingScanner:
|
||||||
def _blend_vertical_at_x(self, base: np.ndarray, strip: np.ndarray,
|
def _blend_vertical_at_x(self, base: np.ndarray, strip: np.ndarray,
|
||||||
blend_height: int, append_below: bool,
|
blend_height: int, append_below: bool,
|
||||||
x_offset: int = 0) -> np.ndarray:
|
x_offset: int = 0) -> np.ndarray:
|
||||||
mh, mw = base.shape[:2]
|
h_base, w_base = base.shape[:2]
|
||||||
sh, sw = strip.shape[:2]
|
h_strip, w_strip = strip.shape[:2]
|
||||||
|
|
||||||
# Clamp x_offset to valid range
|
# Clamp x_offset to valid range
|
||||||
x_offset = max(0, min(x_offset, mw - 1))
|
x_offset = max(0, min(x_offset, w_base - 1))
|
||||||
|
|
||||||
# Calculate how much of strip fits in mosaic
|
|
||||||
available_width = mw - x_offset
|
|
||||||
strip_width = min(sw, available_width)
|
|
||||||
|
|
||||||
# Create full-width strip with strip placed at x_offset
|
# Create full-width strip with strip placed at x_offset
|
||||||
full_strip = np.zeros((sh, mw, 3), dtype=np.uint8)
|
full_strip = np.zeros((h_strip, w_base, 3), dtype=np.uint8)
|
||||||
full_strip[:, x_offset:x_offset + strip_width] = strip[:, :strip_width]
|
available_width = w_base - x_offset
|
||||||
|
copy_width = min(w_strip, available_width)
|
||||||
|
full_strip[:, x_offset:x_offset + copy_width] = strip[:, :copy_width]
|
||||||
|
|
||||||
# Now blend using existing logic
|
# Early exit: no blending possible
|
||||||
blend_h = min(blend_height, sh, mh)
|
if blend_height <= 0 or blend_height >= h_strip:
|
||||||
|
|
||||||
if blend_h <= 0:
|
|
||||||
if append_below:
|
if append_below:
|
||||||
return np.vstack([base, full_strip])
|
return np.vstack([base, full_strip])
|
||||||
return np.vstack([full_strip, base])
|
return np.vstack([full_strip, base])
|
||||||
|
|
||||||
|
# Height mismatch shouldn't happen with full_strip, but safety check
|
||||||
|
if w_strip > w_base:
|
||||||
|
self.log(f"Warning: strip wider than base ({w_strip} > {w_base})")
|
||||||
|
|
||||||
|
blend_h = min(blend_height, h_strip, h_base)
|
||||||
|
|
||||||
if append_below:
|
if append_below:
|
||||||
|
result_height = h_base + h_strip - blend_h
|
||||||
|
result = np.zeros((result_height, w_base, 3), dtype=np.uint8)
|
||||||
|
result[:h_base, :] = base
|
||||||
|
|
||||||
alpha = np.linspace(1, 0, blend_h, dtype=np.float32)[:, np.newaxis, np.newaxis]
|
alpha = np.linspace(1, 0, blend_h, dtype=np.float32)[:, np.newaxis, np.newaxis]
|
||||||
base_overlap = base[-blend_h:].astype(np.float32)
|
base_overlap = base[-blend_h:, :].astype(np.float32)
|
||||||
strip_overlap = full_strip[:blend_h].astype(np.float32)
|
strip_overlap = full_strip[:blend_h, :].astype(np.float32)
|
||||||
blended = (base_overlap * alpha + strip_overlap * (1 - alpha)).astype(np.uint8)
|
blended = (base_overlap * alpha + strip_overlap * (1 - alpha)).astype(np.uint8)
|
||||||
|
|
||||||
result_h = mh + sh - blend_h
|
result[h_base - blend_h:h_base, :] = blended
|
||||||
result = np.zeros((result_h, mw, 3), dtype=np.uint8)
|
result[h_base:, :] = full_strip[blend_h:, :]
|
||||||
result[:mh - blend_h] = base[:-blend_h]
|
|
||||||
result[mh - blend_h:mh] = blended
|
|
||||||
result[mh:] = full_strip[blend_h:]
|
|
||||||
return result
|
return result
|
||||||
else:
|
else:
|
||||||
|
result_height = h_base + h_strip - blend_h
|
||||||
|
result = np.zeros((result_height, w_base, 3), dtype=np.uint8)
|
||||||
|
result[:h_strip, :] = full_strip
|
||||||
|
|
||||||
alpha = np.linspace(0, 1, blend_h, dtype=np.float32)[:, np.newaxis, np.newaxis]
|
alpha = np.linspace(0, 1, blend_h, dtype=np.float32)[:, np.newaxis, np.newaxis]
|
||||||
strip_overlap = full_strip[-blend_h:].astype(np.float32)
|
strip_overlap = full_strip[-blend_h:, :].astype(np.float32)
|
||||||
base_overlap = base[:blend_h].astype(np.float32)
|
base_overlap = base[:blend_h, :].astype(np.float32)
|
||||||
blended = (strip_overlap * (1 - alpha) + base_overlap * alpha).astype(np.uint8)
|
blended = (strip_overlap * (1 - alpha) + base_overlap * alpha).astype(np.uint8)
|
||||||
|
|
||||||
result_h = mh + sh - blend_h
|
result[h_strip - blend_h:h_strip, :] = blended
|
||||||
result = np.zeros((result_h, mw, 3), dtype=np.uint8)
|
result[h_strip:, :] = base[blend_h:, :]
|
||||||
result[:sh - blend_h] = full_strip[:-blend_h]
|
|
||||||
result[sh - blend_h:sh] = blended
|
|
||||||
result[sh:] = base[blend_h:]
|
|
||||||
return result
|
return result
|
||||||
def _blend_vertical(self, base: np.ndarray, strip: np.ndarray,
|
def _blend_vertical(self, base: np.ndarray, strip: np.ndarray,
|
||||||
blend_height: int, append_below: bool) -> np.ndarray:
|
blend_height: int, append_below: bool) -> np.ndarray:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue