Giriş olarak verilen görüntüyü ikili görüntüye çevirmek için kullanılan bir yöntemdir. İkili görüntü (binary), görüntünün siyah ve beyaz olarak tanımlanmasıdır. Morfolojik operatörler gibi görüntü üzerindeki gürültüleri azaltmak veya nesne belirlemek gibi farklı amaçlar için kullanılır. Giriş olarak verilen görüntü üzerinde uygulanan thresholding tipine bağlı olarak, pikselleri verilen eşik değerine göre siyah ya da beyaz olarak günceller.
Eşikleme; Basit(Simple) ve Adaptive Threshold olmak üzere ikiye ayrılır. Bunlarda kendi aralarında bir çok eşikleme çeşitlerinden oluşmaktadır. Bu makalede basit(simple) threshold kavramından bahsedeceğim.
Birçok basit threshold tipi mevcuttur:
Eşikleme; Basit(Simple) ve Adaptive Threshold olmak üzere ikiye ayrılır. Bunlarda kendi aralarında bir çok eşikleme çeşitlerinden oluşmaktadır. Bu makalede basit(simple) threshold kavramından bahsedeceğim.
Birçok basit threshold tipi mevcuttur:
- Binary
- BinaryInverted
- ToZero
- ToZeroInverted
- Truncate
UYGULAMA:
This file contains 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<Gray, Byte> m_originalImage; | |
private Image<Gray, Byte> m_resultImage; | |
public MainForm() | |
{ | |
InitializeComponent(); | |
} | |
private void m_buttonOK_Click(object sender, EventArgs e) | |
{ | |
try | |
{ | |
OpenFileDialog dlg = new OpenFileDialog(); | |
if (dlg.ShowDialog() != DialogResult.OK) | |
return; | |
m_originalImage = new Image<Gray, Byte>(dlg.FileName); | |
m_pictureBoxOriginalImage.Image = m_originalImage.ToBitmap(); | |
Gray avgGray = m_originalImage.GetAverage(); | |
m_trackBarThreshold.Value = (int)Math.Round(avgGray.Intensity); | |
m_labelGrayAvg.Text = avgGray.Intensity.ToString(); | |
} | |
catch (Exception ex) { | |
MessageBox.Show(ex.GetType().Name + " " + ex.Message); | |
} | |
} | |
private void m_buttonBinary_Click(object sender, EventArgs e) | |
{ | |
m_resultImage = new Image<Gray, Byte>(m_originalImage.Width, m_originalImage.Height); | |
CvInvoke.Threshold(m_originalImage, m_resultImage, m_trackBarThreshold.Value, 255, ThresholdType.Binary); | |
m_pictureBoxBinary.Image = m_resultImage.ToBitmap(); | |
} | |
private void m_buttonBinaryInverse_Click(object sender, EventArgs e) | |
{ | |
m_resultImage = new Image<Gray, Byte>(m_originalImage.Width, m_originalImage.Height); | |
CvInvoke.Threshold(m_originalImage, m_resultImage, m_trackBarThreshold.Value, 255, ThresholdType.BinaryInv); | |
m_pictureBoxBinaryInverse.Image = m_resultImage.ToBitmap(); | |
} | |
private void m_buttonToZero_Click(object sender, EventArgs e) | |
{ | |
m_resultImage = new Image<Gray, Byte>(m_originalImage.Width, m_originalImage.Height); | |
CvInvoke.Threshold(m_originalImage, m_resultImage, m_trackBarThreshold.Value, 255, ThresholdType.ToZero); | |
m_pictureBoxToZero.Image = m_resultImage.ToBitmap(); | |
} | |
private void m_buttonToZeroInverse_Click(object sender, EventArgs e) | |
{ | |
m_resultImage = new Image<Gray, Byte>(m_originalImage.Width, m_originalImage.Height); | |
CvInvoke.Threshold(m_originalImage, m_resultImage, m_trackBarThreshold.Value, 255, ThresholdType.ToZeroInv); | |
m_pictureBoxToZeroInverse.Image = m_resultImage.ToBitmap(); | |
} | |
private void m_buttonTruncate_Click(object sender, EventArgs e) | |
{ | |
m_resultImage = new Image<Gray, Byte>(m_originalImage.Width, m_originalImage.Height); | |
CvInvoke.Threshold(m_originalImage, m_resultImage, m_trackBarThreshold.Value, 255, ThresholdType.Trunc); | |
m_pictureBoxTruncate.Image = m_resultImage.ToBitmap(); | |
} | |
private void m_buttonOtsu_Click(object sender, EventArgs e) | |
{ | |
m_resultImage = new Image<Gray, Byte>(m_originalImage.Width, m_originalImage.Height); | |
CvInvoke.Threshold(m_originalImage, m_resultImage, m_trackBarThreshold.Value, 255, ThresholdType.Otsu); | |
m_pictureBoxOtsu.Image = m_resultImage.ToBitmap(); | |
} | |
} |
NOT: OTSU'nun methodundan adaptive thresholdu anlattığım makalemde detaylı bir şekilde bahsedeceğim.