Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

How do I extract elements of a random matrix masked by a circle with its center at A(15,26)

  1. Sep 15, 2016 #1
    Lets say I have a matrix A=rand(31,51). How can I extract its elements from its center (say row = 15, column = 26) in circular manner. I want to have a matrix that displays only those elements of 'A' which are inside a circle with its center at A(15,26). Radius of circle can be any number say 5 cells from A(31,51).
  2. jcsd
  3. Sep 15, 2016 #2
    A naive solution would be to find all integer pairs ## (i,j) ## whose distance to the center ## (i_C, j_C)## is less than your specified distance ##R##.

    In other words find solutions ##(i,j)\in \mathbb{N}## of the inequality ##(i-i_C)^2 + (j-j_C)^2 \leq R^2##.

    I'm sure there are other, better solutions (especially for large distances in large matrices). I can't think of any of the top of my head.

    When getting this to work you can check your work by plotting a disc of radius R around your center.
    Overlay this with a grid of points representing each element of the matrix (i.e. use their indices as coordinates).
    Finally you plot the solutions in another color and see whether all relevant elements are marked.
  4. Sep 15, 2016 #3
    This code does somehow similar thing but I lose information about indices in the final array 'B'. I want matrix 'B' in such a way that its size is equal to size of A but it contains only selected values at those specific positions (indices) where they were in A. In other words, I don't want to lose information on indices as well.
    Code (Text):
    xc=15; yc=26; r=5;
  5. Sep 17, 2016 #4
    Try this:

    Code (Text):

    % Demo to mask an array with a circle.
    clc;    % Clear the command window.
    close all;  % Close all figures (except those of imtool.)
    imtool close all;  % Close all imtool figures.
    clear;  % Erase all existing variables.
    workspace;  % Make sure the workspace panel is showing.
    fontSize = 20;

    % Get the dimensions of the image.  numberOfColorBands should be = 1.
    [rows, columns, numberOfColorBands] = size(A);
    % Display the original gray scale image.
    subplot(2, 2, 1);
    imshow(A, []);
    % Change imshow to image() if you don't have the Image Processing Toolbox.
    title('Original Image', 'FontSize', fontSize);
    % Enlarge figure to full screen.
    set(gcf, 'Position', get(0,'Screensize'));
    set(gcf,'name','Image Analysis Demo','numbertitle','off')

    % Initialize parameters for the circle,
    % such as it's location and radius.
    circleCenterX = 26; % Column
    circleCenterY =  15; % row
    circleRadius = 5;    % big circle radius

    % Initialize an image to a logical image of the circle.
    circleImage = false(rows, columns);
    [x, y] = meshgrid(1:columns, 1:rows);
    circleImage((x - circleCenterX).^2 + (y - circleCenterY).^2 <= circleRadius.^2) = true;
    % Display it in the upper right plot.
    imshow(circleImage, []);
    % Change imshow to image() if you don't have the Image Processing Toolbox.
    title('Circle Mask', 'FontSize', fontSize);
    set(gcf, 'Position', get(0,'Screensize')); % Maximize figure.

    % Mask the image with the circle.
    maskedImage = A; % Initialize with the entire image.
    maskedImage(~circleImage) = 0; % Zero image outside the circle mask.

    % Display it in the lower right plot.
    subplot(2, 3, 5);
    imshow(maskedImage, []);
    % Change imshow to image() if you don't have the Image Processing Toolbox.
    title('Image masked with the circle.', 'FontSize', fontSize);

Share this great discussion with others via Reddit, Google+, Twitter, or Facebook

Have something to add?
Draft saved Draft deleted