Bir önceki makalemde eşik değeri olarak global bir değer kullandık. Fakat görüntünün farklı alanlarda farklı aydınlatma koşullarına sahip olduğu tüm koşullarda iyi olmayabilir. Bu durumda, uyarlanabilir eşik değer almaktayız.
Adaptif eşiklemede resmin küçük bir bölgesi için eşik değeri hesaplanır. Bu nedenle, aynı görüntünün farklı bölgelerinde farklı eşikler elde ediyoruz ve farklı aydınlatmalara sahip görüntüler için daha iyi sonuç vermektedir.
Adaptif eşiklemede resmin küçük bir bölgesi için eşik değeri hesaplanır. Bu nedenle, aynı görüntünün farklı bölgelerinde farklı eşikler elde ediyoruz ve farklı aydınlatmalara sahip görüntüler için daha iyi sonuç vermektedir.
Adaptif eşiklemede, eşik değerinin nasıl hesaplanacağına karar veren iki yöntem mevcuttur.
ADAPTIVE_THRESH_MEAN_C: eşik değeri komşu piksellerin alanlarının ortalamasıdır.
ADAPTIVE_THRESH_GAUSSIAN_C: eşik değeri, ağırlıkların bir gaussian penceresi olduğu komşuluk değerlerinin ağırlıklı toplamıdır.
Blok Boyutu - Komşuluk alanının boyutunu belirler.
C - Hesaplanan ortalama veya ağırlıklı ortalamadan çıkarılmış bir sabittir.
Aşağıdaki kod parçası, aydınlatma değişikliğine sahip bir görüntü için global eşitleme ve uyarlanabilir eşikliği karşılaştırır:
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; | |
private static void fillSizeInfo(Label label, Mat m) | |
{ | |
label.Text = m.Width + "x" + m.Height; | |
} | |
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(); | |
fillSizeInfo(m_labelOriginalSize, m_originalImage.Mat); | |
} | |
catch (Exception ex) { | |
MessageBox.Show(ex.GetType().Name + " " + ex.Message); | |
} | |
} | |
private void MainForm_Load(object sender, EventArgs e) | |
{ | |
try | |
{ | |
Enum.GetValues(typeof(AdaptiveThresholdType)).Cast<adaptivethresholdtype>().ToList().ForEach(at => m_comboBoxAdaptiveThresholdType.Items.Add(at)); | |
m_comboBoxAdaptiveThresholdType.SelectedIndex = 0; | |
} | |
catch (Exception ex) | |
{ | |
MessageBox.Show(ex.Message); | |
} | |
} | |
private void m_trackBarThreshold_ValueChanged(object sender, EventArgs e) | |
{ | |
try | |
{ | |
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_pictureBoxResult.Image = m_resultImage.ToBitmap(); | |
m_labelThreshold.Text = m_trackBarThreshold.Value.ToString(); | |
} | |
catch (Exception ex) | |
{ | |
MessageBox.Show(ex.Message); | |
} | |
} | |
private void m_buttonAdaptiveThreshold_Click(object sender, EventArgs e) | |
{ | |
try | |
{ | |
Mat m = new Mat(); | |
CvInvoke.AdaptiveThreshold(m_originalImage, m, 255, (AdaptiveThresholdType)m_comboBoxAdaptiveThresholdType.SelectedItem, ThresholdType.Binary, 71, 15); | |
//m_resultImage = m_originalImage.Convert<Gray, float>().ThresholdAdaptive(new Gray(255), (AdaptiveThresholdType)m_comboBoxAdaptiveThresholdType.SelectedItem, (ThresholdType)m_comboBoxThresholdType.SelectedItem, 70, new Gray(15)).Convert<Gray, Byte>(); | |
m_resultImage = new Image<Gray, Byte>(m.Bitmap); | |
m_pictureBoxResult.Image = m_resultImage.ToBitmap(); | |
} | |
catch (Exception ex) | |
{ | |
MessageBox.Show(ex.Message); | |
} | |
} | |
} |