@@ -417,8 +417,9 @@ function perform_iterative_redistribution!(histogram::AbstractArray, limit::Numb
417417end
418418
419419
420+
420421function apply_cdf_transform (val:: Union{Real,AbstractGray} , minval:: Union{Real,AbstractGray} , maxval:: Union{Real,AbstractGray} , edges:: AbstractArray , cdf:: AbstractArray )
421- val, minval, maxval = gray (val), gray (minval), gray (maxval)
422+ val, minval, maxval = intensity (val), intensity (minval), intensity (maxval)
422423
423424 first_edge = first (edges)
424425 inv_step_size = 1 / step (edges)
@@ -494,13 +495,25 @@ function transform_image!(out, img, block_centroid_r, block_centroid_c, block_wi
494495 intensity_range, block_cdf)
495496end
496497
497- function transform_interior! (out, img, bounds, block_centroids, block_dimensions, intensity_range, block_cdf)
498+ @inline integer_store (:: Type{T} , x, lo, hi) where {T} = convert (T, clamp (ceil (x), lo, hi))
499+ @inline clamp_store (:: Type{T} , x, lo, hi) where {T} = convert (T, clamp (x, lo, hi))
500+
501+ storefn (:: Type{T} ) where {T<: Integer } = integer_store
502+ storefn (:: Type{T} ) where {T} = clamp_store
503+
504+ function transform_interior! (out:: AbstractArray{T} , img, bounds, block_centroids, block_dimensions, intensity_range, block_cdf) where {T}
498505 rows, cols = bounds
499506 block_centroid_r, block_centroid_c = block_centroids
500507 block_width, block_height = block_dimensions
501508 minval, maxval = intensity_range
509+
510+ lo = intensity (minval)
511+ hi = intensity (maxval)
512+ store = storefn (T)
513+
502514 inv_block_height = 1 / block_height
503515 inv_block_width = 1 / block_width
516+
504517 for r in rows
505518 for c in cols
506519 rᵢ = round (Int, r * inv_block_height)
@@ -512,53 +525,70 @@ function transform_interior!(out, img, bounds, block_centroids, block_dimensions
512525 T₃ = apply_cdf_transform (img[r,c], minval, maxval, block_cdf[rᵢ + 1 , cᵢ + 1 ]. .. )
513526 T₄ = apply_cdf_transform (img[r,c], minval, maxval, block_cdf[rᵢ, cᵢ + 1 ]. .. )
514527 interpolated_val = (1 - t)* (1 - u)* T₁ + t* (1 - u)* T₂ + t* u* T₃ + (1 - t)* u* T₄
515- out[r,c] = eltype (img) <: Integer ? ceil ( interpolated_val) : interpolated_val
528+ out[r,c] = store (T, interpolated_val, lo, hi)
516529 end
517530 end
518531end
519532
520533
521- function transform_vertical_strip! (out, img, bounds, block_centroid_r, cᵢ, block_height, intensity_range, block_cdf)
534+ function transform_vertical_strip! (out:: AbstractArray{T} , img, bounds, block_centroid_r, cᵢ, block_height, intensity_range, block_cdf) where {T}
522535 rows, cols = bounds
523536 minval, maxval = intensity_range
537+
538+ lo = intensity (minval)
539+ hi = intensity (maxval)
540+ store = storefn (T)
541+
524542 inv_block_height = 1 / block_height
543+
525544 for r in rows
526545 for c in cols
527546 rᵢ = round (Int, r * inv_block_height)
528547 t = (r - block_centroid_r[rᵢ]) / block_height
529548 T₁ = apply_cdf_transform (img[r,c], minval, maxval, block_cdf[rᵢ, cᵢ]. .. )
530549 T₂ = apply_cdf_transform (img[r,c], minval, maxval, block_cdf[rᵢ + 1 , cᵢ]. .. )
531550 interpolated_val = (1 - t)* T₁ + t* T₂
532- out[r,c] = eltype (img) <: Integer ? ceil ( interpolated_val) : interpolated_val
551+ out[r,c] = store (T, interpolated_val, lo, hi)
533552 end
534553 end
535554end
536555
537556
538- function transform_horizontal_strip! (out, img, bounds, block_centroid_c, rᵢ, block_width, intensity_range, block_cdf)
557+ function transform_horizontal_strip! (out:: AbstractArray{T} , img, bounds, block_centroid_c, rᵢ, block_width, intensity_range, block_cdf) where {T}
539558 rows, cols = bounds
540559 minval, maxval = intensity_range
560+
561+ lo = intensity (minval)
562+ hi = intensity (maxval)
563+ store = storefn (T)
564+
541565 inv_block_width = 1 / block_width
566+
542567 for r in rows
543568 for c in cols
544569 cᵢ = round (Int, c * inv_block_width)
545570 u = (c - block_centroid_c[cᵢ]) / block_width
546571 T₁ = apply_cdf_transform (img[r,c], minval, maxval, block_cdf[rᵢ, cᵢ]. .. )
547572 T₂ = apply_cdf_transform (img[r,c], minval, maxval, block_cdf[rᵢ, cᵢ + 1 ]. .. )
548573 interpolated_val = (1 - u)* T₁ + u* T₂
549- out[r,c] = eltype (img) <: Integer ? ceil ( interpolated_val) : interpolated_val
574+ out[r,c] = store (T, interpolated_val, lo, hi)
550575 end
551576 end
552577end
553578
554579
555- function transform_corner! (out, img, bounds, rᵢ, cᵢ, intensity_range, block_cdf)
580+ function transform_corner! (out:: AbstractArray{T} , img, bounds, rᵢ, cᵢ, intensity_range, block_cdf) where {T}
556581 rows, cols = bounds
557582 minval, maxval = intensity_range
583+
584+ lo = intensity (minval)
585+ hi = intensity (maxval)
586+ store = storefn (T)
587+
558588 for r in rows
559589 for c in cols
560590 val = apply_cdf_transform (img[r,c], minval, maxval, block_cdf[rᵢ, cᵢ]. .. )
561- out[r,c] = eltype (img) <: Integer ? ceil ( val) : val
591+ out[r,c] = store (T, val, lo, hi)
562592 end
563593 end
564594end
0 commit comments