Image convolution: Difference between revisions

→‎{{header|J}}: bugfixes (incidentally adding a j903 version requirement), and make kernels more easily generalizable (to 5x5, 7x7, etc.)
(link to wikipedia article)
(→‎{{header|J}}: bugfixes (incidentally adding a j903 version requirement), and make kernels more easily generalizable (to 5x5, 7x7, etc.))
Line 785:
<lang J>NB. pad the edges of an array with border pixels
NB. (increasing the first two dimensions by 1 less than the kernel size)
pad=: adverb define{{
rank=.#$m
'a b'=. (<. ,. >.) 0.5 0.5 p. $m
'first second'=. (<.,:>.)-:$m
a"_`(0 , ] - 1:)`(# 1:)}~&# # b"_`(0 , ] - 1:)`(# 1:)}~&(1 { $) #"1 ]
-@(second+rank{.$) {. (first+rank{.$){.]
)
}}
 
kernel_filter=: adverb define{{
[: (0 >. 255 <. <.@:+&0.5) (1,:$m)+/ .*&(,m)~&(,/)&m;._3 m pad
)}}</lang>
 
 
Line 799 ⟶ 800:
Example use:
 
<lang J> NB. kernels borrowed from C and TCL implementations
sharpen_kernelid_kernel=: _1+10*4(=&i.-)3 3
sharpen_kernel=: ({ _1,#@,)id_kernel
blur_kernel=: ($ *&%/)3 3$%9
emboss_kernel=: _2 _1 0,_1 1 1,:0 1 2
emboss_kernel=: id_kernel+(+/~ - >./)i.3
sobel_emboss_kernel=: _1 _2 _1,0,(i:-:<:3)*/1 2 1+(<.|.)i.3
 
'blurred.ppm' writeppm~ blur_kernel kernel_filter readppm 'original.ppm'</lang>
6,951

edits