Skip to content

Commit 767ebe7

Browse files
committed
matrix tensors wip
1 parent 92a514f commit 767ebe7

1 file changed

Lines changed: 40 additions & 19 deletions

File tree

src/dtype_next/image_processing_with_tensors.clj

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)