im1 Specifically, what is the shape of im1?
Thanks, -- Raul On Tue, Jun 27, 2017 at 10:48 AM, Linda Alvord <[email protected]> wrote: > Here's what I enter and there is no result. What am I missing? > It is an interesting result. > > Linda > > -----Original Message----- > From: Programming [mailto:[email protected]] On Behalf > Of Ben Gorte - CITG > Sent: Tuesday, June 27, 2017 8:42 AM > To: [email protected] > Subject: Re: [Jprogramming] cleanest diamond > > I was thinking about closing too, but a little bit slower than Markus, > > show =: (-.&' ')"1 @: ": > expand =: 3 : '(,.~{."1)(,.{:"1)(,~{.)(,{:) y' > minf =: 3 : '3 3 <./@:, ;. _3 expand y' > maxf =: 3 : '3 3 >./@:, ;. _3 expand y' > (show im1);show minf maxf im1 > +--------------------------+--------------------------+ > |00000000000000000000000000|00000000000000000000000000| > |00000000000000000000000000|00000000000000000000000000| > |00000000000000000000000000|00000000000000000000000000| > |00000000000000000000000000|00000000000000000000000000| > |00000000000000100000000000|00000000000000100000000000| > |00000000000001110000000000|00000000000001110000000000| > |00000000000001110000000000|00000000000001110000000000| > |00000000000011111000000000|00000000000011111000000000| > |00000000000111111100000000|00000000000111111100000000| > |00000000000111101100000000|00000000000111111100000000| > |00000000001111111110000000|00000000001111111110000000| > |00000000011111111100000000|00000000011111111110000000| > |00000000111111111111100000|00000000111111111111100000| > |00000001111111111111010000|00000001111111111111110000| > |00000011111111111111010000|00000011111111111111110000| > |00000101111111111110011100|00000111111111111111111100| > |00001111011110110101011100|00001111111111111111111100| > |00000111111111111111110000|00000111111111111111110000| > |00000011110011100101100000|00000011111111111111100000| > |00000001111111111101100000|00000001111111111111100000| > |00000001111111110100000000|00000001111111111110000000| > |00000000011111110110000000|00000000011111111110000000| > |00000000010101010000000000|00000000011111111000000000| > |00000000000010110000000000|00000000000111111000000000| > |00000000000110111000000000|00000000000111111000000000| > |00000000000110110000000000|00000000000111110000000000| > |00000000000010100000000000|00000000000011100000000000| > |00000000000000000000000000|00000000000000000000000000| > |00000000000000000000000000|00000000000000000000000000| > |00000000000000000000000000|00000000000000000000000000| > +--------------------------+--------------------------+ > > Greetings, > Ben > > ________________________________________ > From: Programming [[email protected]] on behalf of > Schmidt-Gröttrup, Markus [[email protected]] > Sent: Tuesday, June 27, 2017 13:38 > To: [email protected] > Subject: Re: [Jprogramming] cleanest diamond > > A morphological closure is the reasonable treating. > > With these definitions: > im1 =: _48+ (, ;._2) a. i. 0 : 0 > 00000000000000000000000000 > 00000000000000000000000000 > 00000000000000000000000000 > 00000000000000000000000000 > 00000000000000100000000000 > 00000000000001110000000000 > 00000000000001110000000000 > 00000000000011111000000000 > 00000000000111111100000000 > 00000000000111101100000000 > 00000000001111111110000000 > 00000000011111111100000000 > 00000000111111111111100000 > 00000001111111111111010000 > 00000011111111111111010000 > 00000101111111111110011100 > 00001111011110110101011100 > 00000111111111111111110000 > 00000011110011100101100000 > 00000001111111111101100000 > 00000001111111110100000000 > 00000000011111110110000000 > 00000000010101010000000000 > 00000000000010110000000000 > 00000000000110111000000000 > 00000000000110110000000000 > 00000000000010100000000000 > 00000000000000000000000000 > 00000000000000000000000000 > 00000000000000000000000000 > ) show =: (-.&' ')"1 @: ": > expand =: 3 : '(,.~{."1)(,.{:"1)(,~{.)(,{:) y' > minf =: 3 : '3 3 <./@:, ;. _3 expand y' > maxf =: 3 : '3 3 >./@:, ;. _3 expand y' > (show im1);show minf maxf im1 > +--------------------------+--------------------------+ > |00000000000000000000000000|00000000000000000000000000| > |00000000000000000000000000|00000000000000000000000000| > |00000000000000000000000000|00000000000000000000000000| > |00000000000000000000000000|00000000000000000000000000| > |00000000000000100000000000|00000000000000100000000000| > |00000000000001110000000000|00000000000001110000000000| > |00000000000001110000000000|00000000000001110000000000| > |00000000000011111000000000|00000000000011111000000000| > |00000000000111111100000000|00000000000111111100000000| > |00000000000111101100000000|00000000000111111100000000| > |00000000001111111110000000|00000000001111111110000000| > |00000000011111111100000000|00000000011111111110000000| > |00000000111111111111100000|00000000111111111111100000| > |00000001111111111111010000|00000001111111111111110000| > |00000011111111111111010000|00000011111111111111110000| > |00000101111111111110011100|00000111111111111111111100| > |00001111011110110101011100|00001111111111111111111100| > |00000111111111111111110000|00000111111111111111110000| > |00000011110011100101100000|00000011111111111111100000| > |00000001111111111101100000|00000001111111111111100000| > |00000001111111110100000000|00000001111111111110000000| > |00000000011111110110000000|00000000011111111110000000| > |00000000010101010000000000|00000000011111111000000000| > |00000000000010110000000000|00000000000111111000000000| > |00000000000110111000000000|00000000000111111000000000| > |00000000000110110000000000|00000000000111110000000000| > |00000000000010100000000000|00000000000011100000000000| > |00000000000000000000000000|00000000000000000000000000| > |00000000000000000000000000|00000000000000000000000000| > |00000000000000000000000000|00000000000000000000000000| > +--------------------------+--------------------------+ > ushift =: 0 ,~ }. > dshift =: 0 , }: > lshift =: 0 ,"1~ }."1 > rshift =: 0 ,"1 }:"1 > ulshift =: ushift@lshift > urshift =: ushift@rshift > dlshift =: dshift@lshift > drshift =: dshift@rshift > clos22 =: (]*.rshift)@:(]*.dshift)@:(]+.lshift)@:(]+.ushift) > closc4 =: > (]*.urshift)@:(]*.drshift)@:(]*.rshift)@:(]*.dshift)@:(]+.dlshift)@:(]+.ulshift)@:(]+.lshift)@:(]+.ushift) > show =: (-.&' ')"1 @: ": > > closures with a 2*2 square or a circle with diameter 4 are shown with: > > show im1 + clos22 im1 > 00000000000000000000000000 > 00000000000000000000000000 > 00000000000000000000000000 > 00000000000000000000000000 > 00000000000000200000000000 > 00000000000002220000000000 > 00000000000002220000000000 > 00000000000022222000000000 > 00000000000222222200000000 > 00000000000222212200000000 > 00000000002222222220000000 > 00000000022222222210000000 > 00000000222222222222200000 > 00000002222222222222120000 > 00000022222222222222120000 > 00000212222222222221122200 > 00002222122221221212122200 > 00000222222222222222220000 > 00000022221122211212200000 > 00000002222222222212200000 > 00000002222222221210000000 > 00000000022222221220000000 > 00000000021212120000000000 > 00000000000121220000000000 > 00000000000221222000000000 > 00000000000221220000000000 > 00000000000021200000000000 > 00000000000000000000000000 > 00000000000000000000000000 > 00000000000000000000000000 > show im1 + closc4 im1 > 00000000000000000000000000 > 00000000000000000000000000 > 00000000000000000000000000 > 00000000000000000000000000 > 00000000000000200000000000 > 00000000000002220000000000 > 00000000000002220000000000 > 00000000000022222000000000 > 00000000000222222200000000 > 00000000000222212200000000 > 00000000002222222220000000 > 00000000022222222211000000 > 00000000222222222222200000 > 00000002222222222222120000 > 00000022222222222222121000 > 00000212222222222221122200 > 00002222122221221212122200 > 00000222222222222222220000 > 00000022221122211212200000 > 00000002222222222212200000 > 00000002222222221211000000 > 00000000122222221220000000 > 00000000021212121100000000 > 00000000001121221000000000 > 00000000000221222000000000 > 00000000000221220000000000 > 00000000000021200000000000 > 00000000000000000000000000 > 00000000000000000000000000 > 00000000000000000000000000 > > Best regards, > > Markus > > > -----Ursprüngliche Nachricht----- > Von: Programming [mailto:[email protected]] Im Auftrag > von Marshall Lochbaum > Gesendet: Dienstag, 27. Juni 2017 10:20 > An: [email protected] > Betreff: Re: [Jprogramming] cleanest diamond > > A common strategy that may work for you is just to ignore the spacial data > and perform some sort of clustering (like k-means, with k=2) on the > intensities. Then classify pixels according to which cluster they fall in. > > An approach that does use this data, and which I expect would be much slower > but somewhat more accurate, would be to use the realization that a threshold > that maximizes the number of contiguous 1's minimizes the number of adjacent > pixels which are separated by the threshold (that is, adjacent 0-1 pairs). To > minimize this number, we need to collect all pairs of adjacent pixels, then > turn consider these pairs as intervals and compute for each possible > threshold the number of these intervals which contain it. > > I don't have any particularly clever ways to find pairs of adjacent pixels. > For the strictest form of adjacency, with no diagonals, the verb ((}. ,.&, > }:) , (}."1 ,.&, }:"1)) will get them all. Each pair should then be sorted, > to put them in a standard interval form. > > An efficient way to turn a list of intervals into a list of > number-of-intervals-containing uses an obverse of monad (I.), which I am > increasingly coming to believe is a major feature missing from J. To > wit: > > x =. 4 7 2 4 1 7 8 > (10$0) (#/.~@])`(~.@])`[}"1 x > 0 1 1 0 2 0 0 2 1 0 > I. (10$0) (#/.~@])`(~.@])`[}"1 x > 1 2 4 4 7 7 8 > (/:~x) -: I. (10$0) (#/.~@])`(~.@])`[}"1 x > 1 > > The verb ((#/.~@])`(~.@])`[}) with an appropriate left argument is an left > inverse to I. ignoring trailing zeros, and a right inverse to I. > ignoring ordering. It counts, for each number in (i.n) where n is the length > of the left argument, how many elements on the right are equal to it. To get > our interval count, we just take this count for the starts of intervals, > subtract the counts for ends of intervals, and do a running > sum: > > ]a =. /:~"1 ]10 2?@$10 NB. intervals obtained from image > 3 4 > 5 9 > 5 7 > 0 6 > 0 5 > 3 6 > 3 6 > 1 7 > 2 9 > 1 4 > +/\ -/ (10$0) (#/.~@])`(~.@])`[}"1 |:a > 2 4 5 8 6 7 4 2 2 0 > > The above example for n=10 has counts increasing then falling, but if the > values in the image are clustered like yours are, then they should dip in the > middle. Just picking the minimum won't work, because a threshold of 0 or 256 > trivially maximizes contiguous 0's or 1's. > However, it should be possibly to either penalize values at the edges (say, > by adding a multiple of (*:128-~i.256) or select a local minimum near the > middle to obtain a threshold. > > One other note is that performing a morphological closure on the ones will > remove any small gaps left by thresholding while preserving the diamond shape. > > Marshall > > On Mon, Jun 26, 2017 at 05:54:44PM -0400, Brian Schott wrote: >> In my webcam playing-card image recognizer, I am trying to set a >> threshold that depends on the amount of ambient lighting on the >> playing cards. If the threshold is set well than I can better >> distinguish between the card suits and pips. The threshold is a number >> between 0 and 255 and my experience has seen it between 100 and 180. >> But I have no algorithm to get a best value, only an eyeballed acceptable >> value. >> >> My idea is to present the webcam with any card with the diamond suit >> and to search for a threshold value that produces the best diamond >> (during the setup period of the app usage, and then to leave the >> threshold value alone later). >> >> The image is always inside a boolean array of shape 30 26. The center >> of the array always is inside the diamond image but that's about the >> only known fact, because the image can be off-center slightly and even >> tilted slightly and the size of the diamond in the image is unknown. >> If the threshold is set too high the boolean image is all 1s, if the >> threshold is set too low, the boolean image is all 0s. (The diamond >> suit is easiest to use because of its relatively regular shape on >> almost any card deck.) >> >> The two examples below are meant to show a dirty diamond and a very >> clean diamond. The clean example has no holes of 0s internal to the >> external perimeter of the diamond. I cannot guarantee that every image >> can be captured with a perfectly clean diamond, so I would sort of >> like to find the threshold that produces the diamond with the greatest >> number of contiguous 1's, sort of. I feel as if there is likely to be >> a gradual increase in the number of contiguous 1's in the sweetspot >> range of the threshold value, but I'm not sure of this. >> >> I am open to other ideas for accomplishing this thresholding, btw. But >> mostly I am looking for J code ideas. >> >> You may be able to copy and paste each example from this email. I >> suppose I could >> >> 00000000000000000000000000 >> 00000000000000000000000000 >> 00000000000000000000000000 >> 00000000000000000000000000 >> 00000000000000100000000000 >> 00000000000001110000000000 >> 00000000000001110000000000 >> 00000000000011111000000000 >> 00000000000111111100000000 >> 00000000000111101100000000 >> 00000000001111111110000000 >> 00000000011111111100000000 >> 00000000111111111111100000 >> 00000001111111111111010000 >> 00000011111111111111010000 >> 00000101111111111110011100 >> 00001111011110110101011100 >> 00000111111111111111110000 >> 00000011110011100101100000 >> 00000001111111111101100000 >> 00000001111111110100000000 >> 00000000011111110110000000 >> 00000000010101010000000000 >> 00000000000010110000000000 >> 00000000000110111000000000 >> 00000000000110110000000000 >> 00000000000010100000000000 >> 00000000000000000000000000 >> 00000000000000000000000000 >> 00000000000000000000000000 >> >> 00000000000000000000000000 >> 00000000000000000000000000 >> 00000000000000000000000000 >> 00000000000000100000000000 >> 00000000000001110000000000 >> 00000000000001111000000000 >> 00000000000011111000000000 >> 00000000000111111100000000 >> 00000000001111111100000000 >> 00000000011111111111000000 >> 00000000011111111111000000 >> 00000001111111111111100000 >> 00000001111111111111110000 >> 00000011111111111111111100 >> 00000111111111111111111100 >> 00001111111111111111111100 >> 00001111111111111111111000 >> 00000111111111111111110000 >> 00000011111111111111100000 >> 00000001111111111111000000 >> 00000000111111111110000000 >> 00000000011111111100000000 >> 00000000001111111100000000 >> 00000000000111111000000000 >> 00000000000111110000000000 >> 00000000000011110000000000 >> 00000000000011100000000000 >> 00000000000001000000000000 >> 00000000000001000000000000 >> 00000000000000000000000000 >> >> >> Thanks, >> >> >> -- >> (B=) <-----my sig >> Brian Schott >> ---------------------------------------------------------------------- >> 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
