Görüntülere kontur ekleme

Oct 09 2020

Resimlerime otomatik olarak bir taslak ekleyerek çalışmamı optimize etmek niyetindeyim.

Bu resmi test etmek için referans olarak bırakıyorum:

Görüntünün ana hatlarını yapabilirim, ancak kalitesiz ...

ColorNegate[EdgeDetect[AlphaChannel[Import["https://i.stack.imgur.com/PvtRV.png"]],2,0.07,Method->"Canny"]]

Bu sonucu, orijinal resmi ana hat ile birleştirerek elde etmeyi düşünüyorum:

Yanıtlar

5 kglr Oct 09 2020 at 06:10
thickness = 10;
img = Import["https://i.stack.imgur.com/PvtRV.png"];

1. ContourDetect + EdgeDetect+Dilation

ImageMultiply[img, ColorNegate @
  Dilation[EdgeDetect @ ImagePad[ColorNegate @ ContourDetect[img], 20], thickness]]

2. ComponentMeasurements

img0 = ImagePad[img, 10]; 

Show[img0, Graphics[{AbsoluteThickness[thickness], Red, 
   MaximalBy[Length @* First] @
    First[Values[ComponentMeasurements[img0, "Contours"]]]}]]

3 flinty Oct 09 2020 at 05:58

ImageMeshVe dokuları kullanmak , beklediğimden biraz daha garip, ancak işi şu şekilde görüntü manipülasyonuna ihtiyaç duymadan yapıyor EdgeDetect:

img = ImageCrop[Import["https://i.stack.imgur.com/PvtRV.png"]];
mesh = ImageMesh[AlphaChannel[img]];
coords = MeshCoordinates[mesh];
mmx = MinMax[coords[[All, 1]]];
mmy = MinMax[coords[[All, 2]]];
texcoords = {Rescale[#[[1]], mmx], Rescale[#[[2]], mmy]} & /@ coords;
g = Graphics[{Thickness[.05], Line[coords], Texture[img], 
  Polygon[coords, VertexTextureCoordinates -> texcoords]}]

Umarım sonuç tatmin edicidir. Şimdi kullanarak onu rasterleştirebilirsiniz r = Rasterize[g, RasterSize -> ImageDimensions[img]]. Ancak, yaparsanız artık orijinalle aynı çizgide olmadığını fark edebilirsiniz ImageCompose[img,{r,0.5}]. Bu, rahatsız edici bir tuhaflıktan kaynaklanıyor ImageMeshve henüz bir çalışma bulamadım.


Görüntü işleme işlevlerini kullanarak bunu şu şekilde yönettim:

ImageCompose[
 img, (* t controls the thickness *)
 With[{t = 5, dims = ImageDimensions[img]},
  Antialiasing ColorConvert[
    ColorNegate@
     ImageResize[
      ColorReplace[
       Dilation[EdgeDetect@ImagePad[AlphaChannel@img, t], t], 
       Black -> Transparent], dims], "RGB"]
  ]
 ]