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
