@@ -854,29 +854,36 @@ kernel-3x3
854854 (tensor/compute-tensor
855855 [h w]
856856 (fn [y x]
857- ; ; Accumulate weighted sum over kernel neighborhood.
858- ; ; We use an atom for local accumulation since tensor/compute-tensor
859- ; ; expects a function that returns a single value per position.
860- ( let [sum ( atom 0.0 ) ]
861- (doseq [ky ( range kh)
862- kx ( range kw)]
857+ ; ; Sum weighted pixel values in kernel neighborhood
858+ ( loop [ky 0
859+ kx 0
860+ sum 0.0 ]
861+ (if ( >= ky kh)
862+ sum
863863 (let [img-y (+ y ky (- pad-h))
864- img-x (+ x kx (- pad-w))]
865- (when (and (>= img-y 0 ) (< img-y h)
866- (>= img-x 0 ) (< img-x w))
867- (swap! sum +
868- (* (tensor/mget kernel ky kx)
869- (tensor/mget img-2d img-y img-x))))))
870- @sum))
864+ img-x (+ x kx (- pad-w))
865+ in-bounds? (and (>= img-y 0 ) (< img-y h)
866+ (>= img-x 0 ) (< img-x w))
867+ new-sum (if in-bounds?
868+ (+ sum (* (tensor/mget kernel ky kx)
869+ (tensor/mget img-2d img-y img-x)))
870+ sum)
871+ [next-ky next-kx] (if (>= (inc kx) kw)
872+ [(inc ky) 0 ]
873+ [ky (inc kx)])]
874+ (recur next-ky next-kx new-sum)))))
871875 :float32 )))
872876
873877; ; **Apply box blur to grayscale**:
874878
875879(def blurred-gray (convolve-2d grayscale kernel-3x3))
876880
877- ; ; Visualize blurred result :
881+ ; ; Compare original vs box blur :
878882
879- (bufimg/tensor->image (dtype/elemwise-cast blurred-gray :uint8 ))
883+ (kind/table
884+ [[:original :box-blur-3x3 ]
885+ [(bufimg/tensor->image grayscale)
886+ (bufimg/tensor->image (dtype/elemwise-cast blurred-gray :uint8 ))]])
880887
881888; ; ## Gaussian Blur
882889
@@ -909,7 +916,20 @@ gaussian-5x5
909916
910917(def gaussian-blurred (convolve-2d grayscale gaussian-5x5))
911918
912- (bufimg/tensor->image (dtype/elemwise-cast gaussian-blurred :uint8 ))
919+ ; ; Larger Gaussian blur for stronger effect:
920+
921+ (def gaussian-15x15 (gaussian-kernel 15 3.0 ))
922+
923+ (def gaussian-blurred-large (convolve-2d grayscale gaussian-15x15))
924+
925+ ; ; Compare different blur kernels:
926+
927+ (kind/table
928+ [[:original :box-blur-3x3 :gaussian-5x5 :gaussian-15x15 ]
929+ [(bufimg/tensor->image grayscale)
930+ (bufimg/tensor->image (dtype/elemwise-cast blurred-gray :uint8 ))
931+ (bufimg/tensor->image (dtype/elemwise-cast gaussian-blurred :uint8 ))
932+ (bufimg/tensor->image (dtype/elemwise-cast gaussian-blurred-large :uint8 ))]])
913933
914934; ; ## Sharpen Filter
915935
@@ -945,9 +965,10 @@ gaussian-5x5
945965; ; grayscale tensors. For simplicity, we'll compute sharpness inline here:
946966
947967(-> {:original grayscale
948- :box (convolve-2d grayscale kernel-3x3)
949- :gaussian (convolve-2d grayscale gaussian-5x5)
950- :sharpened (sharpen grayscale 1.5 )}
968+ :box-3x3 blurred-gray
969+ :gaussian-5x5 gaussian-blurred
970+ :gaussian-15x15 gaussian-blurred-large
971+ :sharpened sharpened-gray}
951972 (update-vals
952973 (fn [t]
953974 (dfn/mean (edge-magnitude
0 commit comments