Sampling a binary image with a matrix.

I am looking to sample a binary matrix with a smaller matrix. For example, take a 100x100 "image" binary matrix and pass a 5*10 window centered on each pixel. Would it then be possible to tag certain spots in that frame I'm passing over the image and mark where "1's" occur?
For example, if the frame passes over a '1' in the image I want to look at spots (2,5) and (4,1) and see if there is a pixel that is also a 1.

8 Comments

Do you mean you want to know, for each window position, whether there is a 1 in the main image anywhere within the window (or at selected positions in the window)? You could do that with the function conv2().
If they're in the window, I want to know where they are at so I can determine an angle. How would I go about using the conv2() filter? Would I need to generate a 2-D binary matrix where the specific spots are 1's and the rest are zero? How could I track and store the pair information between each frame movement? Thank you, my fourier and signal processing knowledge is limited.
conv2() sounds like a good strategy to me as well. Unfortunately, it isn't possible to center a 5 x 10 window over a pixel (to center, the window needs to be odd width and odd height)
By specific spots I mean the spots of intrest in my frame I mentioned in the original problem.
Is the (2,5) test independent of the (4,1) test, or do you only want to know when both are present, or do you want to do something different depending on which combination is present?
if the center of the frame is a 1, I want to record the points that are a certain angle away from the center of the frame. So for example and 'X' through the center of the frame. I'll determine these spots before hand, so I'll know the points that I want to record.
Is this correct? Let's for a moment assume that you can centre a 5x10 window on a pixel. I'll arbitrarily choose the co-ordinate (3,5) as the 'centre'. What you're asking is if there is a 1 at position (2,5) (the pixel immediately above) and/or (4,1) (the pixel immediately down and 3 places to the left). So in general I would compute two subimages slightly smaller than your large one, and offset one of them, then combine with AND. No convolution required.
I think this would work as well, running a for loop with offset counters for various spots in the matrices relative to the centre. Implementing the if statement in a for loop is probably less memory friendly than convolution though. This will eventually be implemented as part of a larger algorithm that will be run on a lot of images.

Sign in to comment.

 Accepted Answer

Construct a kernel that has a 1 in the center and a 1 at the point you want to sample. conv2() against that. The points that come out 2 in the result are the points that have both locations set. You can find() those to get the locations of the centers, and since you know the (X,Y) offset of the sample point you can add the offsets to get the location of the other end of the line.

3 Comments

Ahh so I could assign each spot a different number for convolution and get a different number our for each spot in my convolution kernel.
However, if there can be multiple matches, the center will get the sum of the numbers. That causes problems unless you can "decode" them, such as assigning the locations as powers of 2 and then converting the convolved sum to binary in order to figure out which positions were matched.
Ahhh, thank you very much! Everyone was extremely helpful!

Sign in to comment.

More Answers (0)

Categories

Find more on Signal Processing Toolbox in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!