mcanatan 3 #1 Oluşturuldu: Ekim 24, 2018 Merhabalar değerli dostlar. Harita mühendisliği bölümünde okumaktayım ve bitirme tezi aldığım hocama bir miktar yazılım bildiğimi ağzımdan kaçırınca altından kalkamayacağım bir tez verdi. Tez şöyle eş yükselti eğrisi haritasını yazılımda seçeceğiz. Daha sonra bu eğrileri program tekrardan kendi başına çizmesi gerekiyor. Birkaç referans program bulmuş olsam da hala bu konuya bir çözüm bulamadım. örnek olarak photoshop ile yaptığım şu görsel gibi bir şey olacak ancak çemberler daha sonra silinmesi gerekecek. Her ne kadar çok iyi olmasada bir akış diyagramı çizdim oda burada. Uzun lafın kısası şuan en öncelikli olarak içeri aktarılacak eş yükselti eğrisi haritasının çizim kısmını yapmayı başaramadım. Bu konuda yardımlarınızı bekliyorum.-- mesaja ek olarak --bulduğum kaynaklardan ikisi https://lasithapetthawadu.wordpress.com/2014/06/14/basic-contour-extraction-of-an-image-using-c-and-emgucv/ https://www.codeproject.com/Articles/196168/Contour-Analysis-for-Image-Recognition-in-C-- mesaja ek olarak --/// /// konuyu tekrar okuduğumda anlam karmaşası olmuş aklımdakini yansıtamamışım bu sebeple tekrar yazım /// Merhabalar değerli dostlar. Harita mühendisliği bölümünde okumaktayım ve bitirme tezi aldığım hocama bir miktar yazılım bildiğimi ağzımdan kaçırınca altından kalkamayacağım bir tez verdi. Tez şöyle, eş yükselti eğrisi haritasını yazılımda seçeceğiz. Seçtiğimiz dosya jpg yada png dosyası gibi grafik dosyası olacak. Daha sonra bu eğrileri program tekrardan kendi başına çizmesi gerekiyor. izohips haritalarında bildiğiniz gibi genelde arka fon beyaz yükselti eğrileri siyah oluyor. Daha sonrasında başlangıç noktasından program üzerinden hesaplanan pergel aralığı ile bir çember çizilmesi gerekiyor. çizilen çemberde bir sonraki yükselti eğrisine çember ile kesişen nokta belirlenmesi gerekiyor. 2 adet nokta bulunuyorsa daha yakın olana bir doğru çekilip sonrakine geçilmesi gerekiyor. Gel gelelim daha en başında çuvallamış bulunmaktayım. Seçilen dosyadan yükselti eğrilerini seçtirerek nasıl çizdirebileceğimi bilmiyorum. Birkaç referans program bulmuş olsam da hala bu konuya bir çözüm bulamadım. örnek olarak photoshop ile yaptığım şu görsel gibi bir şey olacak ancak çemberler daha sonra silinmesi gerekecek. Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş
mcanatan 3 #2 Konu Sahibi Ekim 24, 2018 tarihinde gönderildi araştırırken bulduğum kaynaklarda altta bulunan komut dizisine rast geldim. fakat aradığım değil. Parallel.ForEach>(contours, (contour) => burada paralel olarakçizdiriyor siyahın yanına. üzerine nasıl çizdereceğimi bilmiyorum. public void ProcessImage(Image grayFrame) { if (equalizeHist) grayFrame._EqualizeHist();//autocontrast //smoothed Image smoothedGrayFrame = grayFrame.PyrDown(); smoothedGrayFrame = smoothedGrayFrame.PyrUp(); //canny Image cannyFrame = null; if (noiseFilter) cannyFrame = smoothedGrayFrame.Canny(new Gray(cannyThreshold), new Gray(cannyThreshold)); //smoothing if (blur) grayFrame = smoothedGrayFrame; //binarize CvInvoke.cvAdaptiveThreshold(grayFrame, grayFrame, 255, Emgu.CV.CvEnum.ADAPTIVE_THRESHOLD_TYPE.CV_ADAPTIVE_THRESH_MEAN_C, Emgu.CV.CvEnum.THRESH.CV_THRESH_BINARY, adaptiveThresholdBlockSize + adaptiveThresholdBlockSize % 2 + 1, adaptiveThresholdParameter); // grayFrame._Not(); // if (addCanny) if (cannyFrame != null) grayFrame._Or(cannyFrame); // this.binarizedFrame = grayFrame; //dilate canny contours for filtering if (cannyFrame != null) cannyFrame = cannyFrame.Dilate(3); //find contours var sourceContours = grayFrame.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_NONE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_LIST); //filter contours contours = FilterContours(sourceContours, cannyFrame, grayFrame.Width, grayFrame.Height); //find templates lock (foundTemplates) foundTemplates.Clear(); samples.Clear(); lock (templates) Parallel.ForEach>(contours, (contour) => { var arr = contour.ToArray(); Template sample = new Template(arr, contour.Area, samples.templateSize); lock (samples) samples.Add(sample); if (!onlyFindContours) { FoundTemplateDesc desc = finder.FindTemplate(templates, sample); if (desc != null) lock (foundTemplates) foundTemplates.Add(desc); } } ); // FilterByIntersection(ref foundTemplates);-- mesaja ek olarak --classın tam kodları ise burada // // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY // KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR // PURPOSE. // // License: GNU General Public License version 3 (GPLv3) // // Email: [email protected]. // // Copyright (C) Pavel Torgashov, 2011. using System; using System.Collections.Generic; using System.Linq; using System.Text; using Emgu.CV; using Emgu.CV.Structure; using System.Drawing; using System.Threading.Tasks; namespace ContourAnalysisNS { public class ImageProcessor { //settings public bool equalizeHist = false; public bool noiseFilter = false; public int cannyThreshold = 50; public bool blur = true; public int adaptiveThresholdBlockSize = 4; public double adaptiveThresholdParameter = 1.2d; public bool addCanny = true; public bool filterContoursBySize = true; public bool onlyFindContours = false; public int minContourLength = 15; public int minContourArea = 10; public double minFormFactor = 0.5; // public List> contours; public Templates templates = new Templates(); public Templates samples = new Templates(); public List foundTemplates = new List(); public TemplateFinder finder = new TemplateFinder(); public Image binarizedFrame; public void ProcessImage(Image frame) { ProcessImage(frame.Convert()); } public void ProcessImage(Image grayFrame) { if (equalizeHist) grayFrame._EqualizeHist();//autocontrast //smoothed Image smoothedGrayFrame = grayFrame.PyrDown(); smoothedGrayFrame = smoothedGrayFrame.PyrUp(); //canny Image cannyFrame = null; if (noiseFilter) cannyFrame = smoothedGrayFrame.Canny(new Gray(cannyThreshold), new Gray(cannyThreshold)); //smoothing if (blur) grayFrame = smoothedGrayFrame; //binarize CvInvoke.cvAdaptiveThreshold(grayFrame, grayFrame, 255, Emgu.CV.CvEnum.ADAPTIVE_THRESHOLD_TYPE.CV_ADAPTIVE_THRESH_MEAN_C, Emgu.CV.CvEnum.THRESH.CV_THRESH_BINARY, adaptiveThresholdBlockSize + adaptiveThresholdBlockSize % 2 + 1, adaptiveThresholdParameter); // grayFrame._Not(); // if (addCanny) if (cannyFrame != null) grayFrame._Or(cannyFrame); // this.binarizedFrame = grayFrame; //dilate canny contours for filtering if (cannyFrame != null) cannyFrame = cannyFrame.Dilate(3); //find contours var sourceContours = grayFrame.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_NONE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_LIST); //filter contours contours = FilterContours(sourceContours, cannyFrame, grayFrame.Width, grayFrame.Height); //find templates lock (foundTemplates) foundTemplates.Clear(); samples.Clear(); lock (templates) Parallel.ForEach>(contours, (contour) => { var arr = contour.ToArray(); Template sample = new Template(arr, contour.Area, samples.templateSize); lock (samples) samples.Add(sample); if (!onlyFindContours) { FoundTemplateDesc desc = finder.FindTemplate(templates, sample); if (desc != null) lock (foundTemplates) foundTemplates.Add(desc); } } ); // FilterByIntersection(ref foundTemplates); } private static void FilterByIntersection(ref List templates) { //sort by area templates.Sort(new Comparison((t1, t2) => -t1.sample.contour.SourceBoundingRect.Area().CompareTo(t2.sample.contour.SourceBoundingRect.Area()))); //exclude templates inside other templates HashSet toDel = new HashSet(); for (int i = 0; i { if (toDel.Contains(i)) continue; Rectangle bigRect = templates[i].sample.contour.SourceBoundingRect; int bigArea = templates[i].sample.contour.SourceBoundingRect.Area(); bigRect.Inflate(4, 4); for (int j = i + 1; j { if (bigRect.Contains(templates[j].sample.contour.SourceBoundingRect)) { double a = templates[j].sample.contour.SourceBoundingRect.Area(); if (a / bigArea > 0.9d) { //choose template by rate if (templates[i].rate > templates[j].rate) toDel.Add(j); else toDel.Add(i); } else//delete tempate toDel.Add(j); } } } List newTemplates = new List(); for (int i = 0; i if (!toDel.Contains(i)) newTemplates.Add(templates[i]); templates = newTemplates; } private List> FilterContours(Contour contours, Image cannyFrame, int frameWidth, int frameHeight) { int maxArea = frameWidth * frameHeight / 5; var c = contours; List> result = new List>(); while (c != null) { if (filterContoursBySize) if (c.Total c.Area maxArea || c.Area / c.Total goto next; if (noiseFilter) { Point p1 = c[0]; Point p2 = c[(c.Total / 2) % c.Total]; if (cannyFrame[p1].Intensity goto next; } result.Add(c); next: c = c.HNext; } return result; } } } Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş