Jump to content
Araştır
  • Diğer seçenekler ...
Sonuçları bul ...
Sonuçları bul ...
mcanatan

Bitirme tezi kodlama yardım talebi

Önerilen Mesajlar

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.
qv5rVQ.jpg

Her ne kadar çok iyi olmasada bir akış diyagramı çizdim oda burada.

qv5rXq.png

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.

İletiyi paylaş


Link to post
Sitelerde Paylaş

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.
Z384PA.png

        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;
}
}
}

İletiyi paylaş


Link to post
Sitelerde Paylaş

×
×
  • Yeni Oluştur...