Görüntülere kontur ekleme
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
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"]]]}]]
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"]
]
]