7
$\begingroup$

I want to extract the edge points from a text image and use ListPlot[points] to visualize those points:

Enter image description here

I tried to used ImageCorners[] and CornerFilter[], but there isn't any good result:

img=ColorConvert[img, "Grayscale"] // Binarize

HighlightImage[img, CornerFilter[img] // ImageAdjust]

Enter image description here

HighlightImage[img, ImageCorners[img]]

Enter image description here

$\endgroup$
9
$\begingroup$
img0 = Import["https://i.stack.imgur.com/pLroE.png"];

1. ComponentMeasurements

Graphics[{Blue, Values @ ComponentMeasurements[Binarize @ img0 , "Contours"]}]

enter image description here

You can get the coordinate data by a simple ReplaceAll:

data = Join @@ Values[ComponentMeasurements[Binarize@img0, "Contours"]] /. 
   Line[x_] :> x;

Row[ListPlot[data, Joined -> #, ImageSize -> 400] & /@ {False, True}, 
 Spacer[20]]

enter image description here

2. RemoveBackground + EdgeDetect

HighlightImage[img0, 
 EdgeDetect @ RemoveBackground[img0, {"Background", Black}], "Lighten"]

enter image description here

| improve this answer | |
$\endgroup$
  • $\begingroup$ I need data set of points, how can I extract it from your code? $\endgroup$ – vito Oct 19 at 10:29
  • $\begingroup$ @vito, please see the update. $\endgroup$ – kglr Oct 19 at 11:35
6
$\begingroup$

You could just do this:

img = Binarize@Import["https://i.stack.imgur.com/pLroE.png"];
ListPlot@PixelValuePositions[EdgeDetect@img, 1]

amazing


Or if you want to use meshing then:

img = Binarize@Import["https://i.stack.imgur.com/pLroE.png"];
ListPlot@MeshCoordinates@RegionBoundary@ImageMesh@img

If you want to go further and break them up into individual point sets for each letter/hole then:

gr = MeshConnectivityGraph@ImageMesh@img;
comps = ConnectedGraphComponents@gr;
pts = GraphEmbedding /@ comps;
ListPlot[pts]

Note if you do ListLinePlot then the order of the points may not come out as expected. You may find it more productive to work with the graphs in comps, which have richer information about connectivity, instead of using raw points.

| improve this answer | |
$\endgroup$
  • $\begingroup$ Note, if you want a better quality mesh you should rasterize the image at a higher resolution first for example: ImageMesh@Rasterize[img, RasterSize -> 3000] $\endgroup$ – flinty Oct 18 at 16:58
  • $\begingroup$ MeshConnectivityGraph doesn't work for me, I have Mathematica 12.0 $\endgroup$ – vito Oct 19 at 10:26

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.