creating mask around line
12 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
I have an edge detected image. I have to compute all the pixel coordinates which lies near the edge line. That means matlab have to create a mask (region) around the line first and then it should compute the coordinates of all the points lying within the mask. If I know the region then can easily compute the points using poly2mask
x = [28 59 59 28 28];
y = [38 40 44 42 38];
[rows, cols] = size(im);
myregion = poly2mask(x,y,cols,rows);
STATS = regionprops(myregion, 'PixelList','PixelIdxList');
My problem is I know the endpoints of the line. How can I get the vertices of the rectangle (mask) from that
For example if the line endpoints are (30,40) and (57,44) if i give mask size = 2 it should create a polygon vertices (28,38) , (59,40), (28,42) , (59,44)
if line endpoints (30,40) and (28,80) with mask size = 2 then vertices of polygon should be (28,38), (32,38), (26,82), (30,82) How i can i do this?
Or is there any easy way to get the coordinates of the points (pixel) lying within the mask using line end points?
0 comentarios
Respuesta aceptada
Matt J
el 9 de Oct. de 2012
Editada: Matt J
el 9 de Oct. de 2012
There are infinitely many rectangles enclosing a given line. The particular rectangle you want, and the rule you use to get its vertices, is not clear to me. Below is a way of finding a rectangle with edges parallel/perpendicular to the line and at a distance of masksize from the nearest endpoint.
%data
pt1=[30,40];
pt2=[57,44];
masksize=2;
%engine
dirvec=pt2-pt1;
dirvec=dirvec/norm(dirvec);
perpvec=[dirvec(2), - dirvec(1)];
perpvec=perpvec/norm(perpvec);
%masksize=masksize/sqrt(2);
vertex1 = pt1 + masksize*(-dirvec+perpvec),
vertex2 = pt1 + masksize*(-dirvec-perpvec),
vertex3 = pt2 + masksize*(dirvec+perpvec),
vertex4 = pt2 + masksize*(dirvec-perpvec),
Más respuestas (1)
Image Analyst
el 14 de Nov. de 2012
Sounds like another case of someone asking how to do something without giving us the big picture of why they want to do it. What if your edge outline looks like a "C" - what good are the endpoints going to do for you? What does the box you get from those endpoints mean?
Anyway to answer your question, use imdilate to expand your lines
dilatedImage = imdilate(edgeImage, false(2));
Then, don't call poly2mask(). Just call regionprops and ask for the bounding box.
blobMeasurements = regionprops(dilatedImage, 'BoundingBox');
Then, "to get the coordinates of the points (pixel) lying within the mask" you need to use meshgrid on each box (adapted from my blobs demo):
for k = 1 : numberOfBlobs % Loop through all blobs.
% Find the bounding box of each blob.
thisBlobsBoundingBox = blobMeasurements(k).BoundingBox;
x1 = ceil(thisBlobsBoundingBox(1));
y1 = ceil(thisBlobsBoundingBox(2));
x2 = x1 + thisBlobsBoundingBox(3) - 1;
y2 = y1 + thisBlobsBoundingBox(4) - 1;
[allXs, allYs] = meshgrid(x1:x2, y1:y2);
end
This will give you all the (x,y) coordinates inside the bounding box of each outline/curve/line. Note that the bounding box of a "C" will be the actual bounding box, not the bounding box only around the endpoints that you (for some reason) asked for. Of course if your edge outlines are straight lines, then they're the same thing, but if it's not a line, then they're not.
Anyway, I'm not sure a list of all the pixels coordinates inside the bounding box is what you need, like I said before. If you want to clarify, please go ahead.
Ver también
Categorías
Más información sobre Surface and Mesh Plots en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!