I've posted an initial draft to Rosetta Code. Anyone should feel free to 
improve on it.

I felt it looked cleaner on the site to merge hough into houghTransform 
directly. I also altered the max and min for rho to be the max and min possible 
rather than the actuals.
 
NB.*houghTransform v Produces a density plot of image y in hough space
NB. y is picture as an array with 1 at non-white points,
NB. x is resolution (width,height) of resulting image
houghTransform=: dyad define
  'w h'=. x                               NB. width and height of target image
  theta=. o. (%~ 0.5+i.) w                NB. theta in radians from 0 to π
  rho=. (4$.$. |.y) +/ .* 2 1 o./theta    NB. rho for each pixel at each theta
  'min max'=. (,~-) +/&.:*: $y            NB. min/max possible rho
  rho=. <. 0.5+ h * (rho-min) % max-min   NB. Rescale rho from 0 to h and round 
to int
  |. ([: <:@(#/.~) (i.h)&,)"1&.|: rho      NB. consolidate into picture
)

http://rosettacode.org/wiki/Hough_transform#J


> From: Marshall Lochbaum
> Sent: Thursday, 16 September 2010 13:32
> 
> Your correction to |. is right--I forgot there was a left argument. I
> suppose I am in favor of the first verb just because it maintains the under
> transformation, although both are uglier than I would like.
> 
> I meant to load the .png files into J, and didn't see your earlier use.
> Thanks!
> 
> Does this mean we are ready to post a solution? It seems complete to me.
> 
> Marshall
> 
> 
> -----Original Message-----
> From: [email protected]
> [mailto:[email protected]] On Behalf Of Sherlock, Ric
> Sent: Wednesday, September 15, 2010 7:05 PM
> To: Programming forum
> Subject: Re: [Jprogramming] Hough transform
> 
> Don't think that is quite right (it reverses the left arg (w h) too).
> I think this is the desired result?
>   viewmat |. 320 240 houghTransform |. _1 > Img
> 
> If we want to integrate that into the houghTransform verb here are a couple
> of options:
> houghTransform=: 4 :0 &.|.
>   'h w'=. x
>   rho=. y hough~ o. (%~ 0.5+i.) w        NB. rho for each pixel at each
> theta
>   'min max'=. (<./ , >./) ,rho
>   rho=. <. 0.5+ h * (rho-min) % max-min  NB. Rescale rho from 0 to h and
> round to int
>   ([: <:@(#/.~) (i.h)&,)"1&.|: rho       NB. consolidate into picture
> )
> 
> houghTransform=: 4 :0
>   'w h'=. x
>   rho=. (|.y) hough~ o. (%~ 0.5+i.) w     NB. rho for each pixel at each
> theta
>   'min max'=. (<./ , >./) ,rho
>   rho=. <. 0.5+ h * (rho-min) % max-min   NB. Rescale rho from 0 to h and
> round to int
>   |.([: <:@(#/.~) (i.h)&,)"1&.|: rho      NB. consolidate into picture
> )
> 
> What do you mean by "load .png files"?
> If you mean as an array in J then see the "Example Use" Note in my last
> post.
> Or do you mean load a .png on RosettaCode?
> 
> 
> > From: Marshall Lochbaum
> > Sent: Thursday, 16 September 2010 10:22
> >
> > To make the center the lower left corner and have theta go in the
> > right direction, we actually need houghTransform&.|.
> >
> > Everything else looks satisfactory.
> >
> > Also, does anybody know how to load .png files?
> >
> > Marshall
> >
> > From: Sherlock, Ric
> > Sent: Tuesday, September 14, 2010 11:52 PM
> >
> > I think theta should only go to 1p1. I'd leave viewmat out of the main
> verb.
> >
> > NB.*houghTransform v Produces a density diagram of image y in hough
> > space NB. y is picture as an array with 1 at non-white points, NB. x
> > is resolution
> > (width,height) of resulting image
> > houghTransform=:4 :0
> >   'w h'=.x
> >   rho=. y hough~ o. (%~ 0.5+i.) w      NB. rho for each pixel at each
> theta
> >   'min max'=. (<./ , >./)@, rho
> >   rho=. <. 0.5+ h * (max-min) %~ min -~ rho  NB. Rescale and round rho
> > to int from 0 to h
> >   ([: <:@(#/.~) (i.h)&,)"1&.|: rho     NB. consolidate into picture
> > )
> >
> > NB. Where hough is one of these equivalent verbs:
> >
> > NB.*hough v Returns rho values of each theta value x for picture y.
> > NB. y is picture as an array with 1 at non-white points, NB. x is
> > values to test at
> > hough=:4 :0
> >   ind=. 4$.$. y     NB. Indices of points in y
> >   ind +/ .* 2 1 o./ x
> > )
> > hough=: 4 :'(2 1 o./ x) +/ .*~ 4$.$.y'
> > hough=: 2 1&(o./)@[ +/ .*~ 4 $. $...@]
> >
> > Note 'Example use:'
> >    require 'viewmat media/platimg'
> >    Img=: readimg jpath '~temp/pentagon.png'
> >    viewmat 320 240 houghTransform _1 > Img
> > )
> >
> >
> > > From: Marshall Lochbaum
> > > Sent: Wednesday, 15 September 2010 13:30
> > >
> > > I think this gives the correct plot. It also uses viewmat, but just
> > > to plot the final array.
> > >
> > > NB. Y is picture as an array with 1 at black points, x is values to
> > > test at NB. Returns r values of each theta value x.
> > >    hough=:4 :0
> > > ind=. ($ #: I.@,) y     NB. Indices of points in y
> > > ind +/ .* 2 1 o./ x
> > > )
> > >
> > > NB. Y is picture, x is resolution. Produces and sends to viewmat a
> > > density diagram NB. In hough space with resolution x
> > >    drawhough=:4 :0
> > > 'w h'=.x
> > > val=. y hough~ +:o. (%~ 0.5+i.) w   NB. Test r values for each pixel at
> > each
> > > theta given by the centers of pixels 'min max'=. (<./@, , >./@,) val
> > > rel=.h * (max-min) %~ min -~ val   NB. Rescale so that y values go from
> 0
> > to
> > > h
> > > pixels=.([: <:@(#/.~) (i.h) , ])"1&.|: <:@>. rel  NB. Round y
> > > values; consolidate into picture viewmat pixels
> > > )
> > >
> > > I have tested this on |. =/~ i. 100, but not on the actual picture.
> > > Note that it uses the top left corner as the natural coordinate center.
> > > Also, I made theta go from 0 to 2p1. Should these be the bounds, or
> > > just 0 to 1p1?
> > >
> > > Marshall
> > >
> > > -----Original Message-----
> > > From: [email protected]
> > > [mailto:[email protected]] On Behalf Of Aai
> > > Sent: Tuesday, September 14, 2010 10:16 AM
> > > To: Programming forum
> > > Subject: Re: [Jprogramming] Hough transform
> > >
> > > Hi David,
> > > I don't know exactly what you expect but here's an alternative using
> > > viewmat.
> > >
> > > require 'viewmat'
> > >
> > > Because you just increment coordinate values by 1 for every
> > > iteration it's sufficient to compose a triple X Y Z  in which Z is the
> 'height'
> > > or 'density' of a point in hough space.
> > >
> > > hough2=: 4 : 0
> > > radii=: (>:length>:$y)*_0.5+grid {. x
> > > angle=: 1r1p1*grid {: x
> > > b=: 0 < ,y
> > > inter=: b # , y
> > > coord=: ($y) #: I. b
> > > rhoug=: (coord,.1)+/ .*(1 0,0 _1,:_0.5 0.5*$y)+/ .*1 2 o./angle
> > > r=: (<:@# - I.&rhoug)radii
> > > 'X Y Z'=.|:({.,#)/.~,/r ,."1 i. {: x viewmat Z (;/ X,.Y) } 0 $~ 0 _1
> > > { x
> > > )
> > >
> > >
> > > try e.g.
> > >
> > > 250 hough2 data
> > >
> > >
> > > --
> > > Met vriendelijke groet,
> > > =@@i
> > >
> > > --------------------------------------------------------------------
> > > -- For information about J forums see
> > > http://www.jsoftware.com/forums.htm
> > >
> > > --------------------------------------------------------------------
> > > -- For information about J forums see
> > > http://www.jsoftware.com/forums.htm
> > ----------------------------------------------------------------------
> > For information about J forums see http://www.jsoftware.com/forums.htm
> >
> > ----------------------------------------------------------------------
> > For information about J forums see http://www.jsoftware.com/forums.htm
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
> 
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to