Canny kenar belirleme algoritması; görüntüde keskin olarak belirlenmiş kenarları bulmak için John F. Canny tarafından geliştirilmiş ve aşamaları olan bir algoritmadır.
Kenar bulmada son derece etkin olarak kullanılan bir algoritmadır. Aşamaları maddeleyecek olursak; Görüntünün gürültülerini azaltmak amacıyla Gaussian çekirdekle konvolüsyon alınarak azaltılır. Gaussian filtre dışında Mean ya da Medyan filtrede kullanılabilir. . Gradyan operatörü uygulanır. Bu şekilde görüntünün Gradyan büyüklüğü ve yönü hesaplanır. Bu işlem için Sobel filtresi en çok kullanılan yöntemdir. Bunun dışında Prewitt ve Robert kenar bulma metotları da mevcuttur. . Kenarlar Non Maxima baskılama kullanılarak incelemeye alınır. . İkili eşikleme uygulanır bu şekilde istenmeyen ayrıntılardan arındırılma işlemi gerçekleştirilir. . Güçlü-zayıf ayrımı yapıldıktan sonra baskılama uygulanır ve asıl kenarlarla görüntüye son hali verilir.
Kenar bulmada son derece etkin olarak kullanılan bir algoritmadır. Aşamaları maddeleyecek olursak; Görüntünün gürültülerini azaltmak amacıyla Gaussian çekirdekle konvolüsyon alınarak azaltılır. Gaussian filtre dışında Mean ya da Medyan filtrede kullanılabilir. . Gradyan operatörü uygulanır. Bu şekilde görüntünün Gradyan büyüklüğü ve yönü hesaplanır. Bu işlem için Sobel filtresi en çok kullanılan yöntemdir. Bunun dışında Prewitt ve Robert kenar bulma metotları da mevcuttur. . Kenarlar Non Maxima baskılama kullanılarak incelemeye alınır. . İkili eşikleme uygulanır bu şekilde istenmeyen ayrıntılardan arındırılma işlemi gerçekleştirilir. . Güçlü-zayıf ayrımı yapıldıktan sonra baskılama uygulanır ve asıl kenarlarla görüntüye son hali verilir.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public partial class MainForm : Form | |
{ | |
private Image<Bgr, byte> m_img; | |
private Image<Gray, Byte> m_grayImg; | |
private static VectorOfVectorOfPoint FindContours(Image<Gray, byte> image, ChainApproxMethod method = ChainApproxMethod.ChainApproxSimple, | |
Emgu.CV.CvEnum.RetrType type = RetrType.List) | |
{ | |
// Check that all parameters are valid. | |
VectorOfVectorOfPoint result = new VectorOfVectorOfPoint(); | |
if (method == Emgu.CV.CvEnum.ChainApproxMethod.ChainCode) | |
{ | |
throw new NotImplementedException("Chain Code not implemented, sorry try again later"); | |
} | |
CvInvoke.FindContours(image, result, null, type, method); | |
return result; | |
} | |
public MainForm() | |
{ | |
InitializeComponent(); | |
} | |
private void m_buttonCanny_Click(object sender, EventArgs e) | |
{ | |
if (m_img == null) { | |
MessageBox.Show("You have to choose an image"); | |
return; | |
} | |
m_grayImg = m_img.Convert<Gray, Byte>().PyrDown().PyrUp(); | |
Image<Gray, Byte> cannyImg = m_grayImg.Canny(m_trackBarTresh.Value, m_trackBarThreshLinking.Value); | |
m_grayImg = cannyImg; | |
m_pictureBoxResult.Image = cannyImg.ToBitmap(); | |
} | |
private void m_trackBarTresh_ValueChanged(object sender, EventArgs e) | |
{ | |
if (m_img == null) { | |
m_trackBarTresh.Value = 0; | |
return; | |
} | |
Image<Gray, Byte> cannyImg = m_grayImg.Canny(m_trackBarTresh.Value, m_trackBarThreshLinking.Value); | |
m_pictureBoxResult.Image = cannyImg.ToBitmap(); | |
} | |
private void m_trackBarThreshLinking_Scroll(object sender, EventArgs e) | |
{ | |
if (m_img == null) | |
{ | |
m_trackBarThreshLinking.Value = 0; | |
return; | |
} | |
Image<Gray, Byte> cannyImg = m_grayImg.Canny(m_trackBarTresh.Value, m_trackBarThreshLinking.Value); | |
m_pictureBoxResult.Image = cannyImg.ToBitmap(); | |
} | |
private void m_buttonLoadFile_Click(object sender, EventArgs e) | |
{ | |
OpenFileDialog dlg = new OpenFileDialog(); | |
if (dlg.ShowDialog() != DialogResult.OK) | |
return; | |
m_img = new Image<Bgr, byte>(dlg.FileName); | |
m_pictureBoxOriginalImage.Image = m_img.ToBitmap(); | |
} | |
private void m_buttonDisplayContours_Click(object sender, EventArgs e) | |
{ | |
try | |
{ | |
VectorOfVectorOfPoint v = FindContours(m_grayImg); | |
var img = m_grayImg.Convert<Bgr, byte>(); | |
img.Draw(v, -1, new Bgr(Color.LimeGreen)); | |
m_pictureBoxResult.Image = img.ToBitmap(); | |
} | |
catch (Exception ex) | |
{ | |
MessageBox.Show(ex.Message); | |
} | |
} | |
} |