Bvural41 1
Bvural41
Fethi Polat 1
Fethi Polat
Mt2Hizmet 1
Mt2Hizmet
Sevdamsın 1
Sevdamsın
Nedved35 1
Nedved35
Hikaye Ekle

C# ile Temel Görüntü İşleme Yöntemleri

  • Konuyu başlatan Konuyu başlatan gameoveras
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 1
  • Görüntüleme Görüntüleme 2K
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

Ayyıldız2 | 2008 TR Yapısı • 1-99 Orta Emek Destan • Oto Avsız • 10 Temmuz 21:00 HEMEN TIKLA!

Bu çalışmada Visual Studio C# .NET’de görüntü işlemenin nasıl yapıldığı temel olarak ele alınmaktadır. Çalışmamızı Windows uygulaması olan formlarda gerçekleştireceğiz. Bunun için görüntülerimizi göstermek amacıyla bir form aleti olan PictureBox kullanacağız. Yaptığımız işlem en basit anlamıyla açılan resmin piksellerine teker teker erişip istediğimiz işlemi piksellere uygulamaktır. Biz burada üç farklı görüntü işleme yönteminin C# programlama dili ile nasıl yapılacağını göstermeye çalıştık. İlk yöntemde resmimizin rengini tersine çevirme ,ikinci yöntemde resmimize kabartma etkisi uygulama, üçüncü yöntemde ise resmi siyah-beyaz yani gri tonlara çeviren işlemleri gerçekleştirdik. Bu etkiler hakkında ayrıntılar sırasıyla ele alınacaktır. Her bir yöntem bir düğme olayıyla tetiklenmektedir. O halde ilgili kodları her bir farklı düğmenin basma(click) olayının içerisine yazacağız. Ayrıca gerçekleşen işlemin hangi aşamada olduğunu görmek için işlem çubuğu (progressBar) eklenmiştir.

Etkilerimize geçmeden önce birkaç gerekli terimden bahsetmek gerekiyor. Biz, aldığımız görüntüleri, pictureBoxiçinde gösterilen resmi elde edip onunla işlem yapmamızı sağlayan System.Drawing isim uzayının içinde Imagesınıfı ve piksel verisine ulaşmak için yine System.Drawing isim uzayının içinde Bitmap sınıflarını kullanmaktayız. Bitmap sınıfında tanımladığımız bir resmin piksel verilerini okuduktan sonra bu pikseller üzerinde işlem yapabilmek için Bitmap sınıfına ait aşağıdaki temel metotları kullanmaktayız.

[TABLE="class: cms_table_cms_table_codeBlock, width: 100%"]
[TR]
[TD]GetPixel(x,y)

Bu metot x,y noktasında bulunan pikselin rengini verir.

SetPixel(x,y)

Bu metot kullanılarak x,y noktasındaki pikselin rengi değiştirilebilir.
[/TD]
[/TR]
[/TABLE]


Şunu belirtmek gerekir ki Bitmap sınıfı Image sınıfından türemiştir ayrıca Image sınıfından türemişImaging.Metafile sınıfa da mevcuttur. Vektör türü grafikler (wmf, emf vb.) için Imaging.Metafile sınıfı, Bitmap türü grafikler (bmp, jpeg, gif vb.) için de Bitmap sınıfı kullanılır. Image sınıfına ait birçok özellik ve metotlar vardır. Biz burada bu özellik ve metotların hepsine değinmeyeceğiz. Bunlara yardım belgelerinden erişebilir ve neler olduğunu öğrenebilirsiniz. Örneğin Image sınıfının metotları sayesinde ilgili resmimiz Clone() metoduyla kopyalayabilir, RotateFlip(yön) ile döndürebilir, PhysicalDimensions ile orijinal boyutunu öğrenebilir,PixelFormat ile resmin piksel formatını öğrenebilir, HorizontalResolution ve VerticalResolution ile bir resmin yatay ve dikey çözünürlüğünü bu iki özellikle öğrenebiliriz (Çözünürlük bilgileri dpi –dot per inch – cinsindendir). Şimdi gelelim resim etkilerimizi nasıl oluşturduğumuza;

Öncelikle formumuzun içine iki tane pictureBox ve üç tane düğme yerleştirelim çünkü daha önceden de belirttiğim gibi görüntü etkilerimiz düğme olayıyla tetiklenecektir. Şimdi en önemli kısma geldik; resmimiz iki boyutlu olup piksellerden oluşmaktadır piksellere erişip istenen işlemi uygulamak için ise iki tane for döngüsü kullanmalıyız. Yani bütün pikselleri yatay ve dikey olarak taramalıyız. Bir resmin renklerini tersine alma

Aşağıdaki ilk etkimizin kodları vardır. İlk olarak pictureBox içine bir resim açmadığımızda ve işlem yürütmeye çalıştığımızda karşımıza bir uyarı mesajı vermesi sağlanmıştır. Burada Color sınıfından bir referans renk değişkeni belirliyoruz. pictureBox içindeki resmin piksellerine erişmek için Bitmap sınıfında yeni bir sınıf tanımlıyoruz ve progressBar’ın en yüksek çizgisi işlemin bittiğini göstermesi için en son işlenecek pikselle belirlenmiştir. GetPixel ile o anki döngümüzün pikseline erişip renk bileşenini okumaktayız. Color.FromArgbdört bileşenli (alpha , red, gren, blue) 8-bitlik renk bilgisine erişmemizi sağlar. Burada renkleralfa kanalı hariçDEĞİL(NOT) lenerek tersi alınmaktadır. Tersi alınan bu renk bilgisi asıl resmimizin piksel değerleriyle Setpixelkomutuyla değiştirilmektedir. Şimdi kodu inceleyelim. Gerekli açıklamalar kodda yer almaktadır. Kodu kopyala yapıştır yaparak sizde çalışıp çalışmadığını deneyebilirsiniz ama tavsiyem kendi yazmanızdır.[TABLE="class: cms_table_cms_table_codeBlock, width: 100%"]
[TR]
[TD]if(pictureBox1.Image==null)
{
MessageBox.Show("Önce bir resim Seçin");
}
else
{
progressBar1.Visible=true;//progress(işlem) çubuğu koyalım
int i,j;
Color r;
Bitmap bmp=new Bitmap(pictureBox1.Image);
progressBar1.Maximum=bmp.Width*bmp.Height;
for(i=0;i<=bmp.Width-1;i++)
{
for(j=0;j<=bmp.Height-1;j++)
{
r=bmp.GetPixel(i,j);//i,j noktasının rengini öğren
//alfa kanalı hariç diğer kanalların tersini al
r=Color.FromArgb(r.A,(byte)~r.R,(byte)~r.G,(byte)~ r.B);
bmp.SetPixel(i,j,r);//aynı noktaya tekrar koy
if((i%10)==0)//her on satırda bir göstergeyi güncelle
{
progressBar1.Value=i*bmp.Height+j;
Application.DoEvents();
}
}
}
pictureBox2.Image=bmp;
progressBar1.Visible=false; //işlem bittiğinde çubuklar görünmez olsun
}//else sonu[/TD]
[/TR]
[/TABLE]


mk1_1.jpg


Bir resme kabartma (emboss) etkisi yaratmak

Kabartma (emboss) etkisi resimdeki pikselin ve bir sonraki pikselin renk farkına 128 eklenmesiyle elde edilir. Bu iki pikselin renklerini öğrendikten sonra renklerin farkını alıp bu sonuca 128 ekleyerek yeni rengi oluşturursak kabartma etkisi vermiş oluruz. Ekleme işleminden sonra sekiz bitlik renk bilgisini aşmaması için 255 e eşikleme yapıyoruz (2[SUP]8[/SUP]=256 seviye)
[TABLE="class: cms_table_cms_table_codeBlock, width: 100%"]
[TR]
[TD]if(pictureBox1.Image==null)
{
MessageBox.Show("Önce bir resim Seçin");
}
else
{
progressBar1.Visible=true;
int i,j;
Color renk1,renk2,renk3;
Bitmap bmp=new Bitmap(pictureBox1.Image);
int r,g,b;
progressBar1.Maximum=bmp.Width*bmp.Height;
for(i=0;i<=bmp.Width-2;i++)
{
for(j=0;j<=bmp.Height-2;j++)
{
renk1=bmp.GetPixel(i,j);//i,j noktasının rengini öğren
renk2=bmp.GetPixel(i+1,j+1);//sonraki noktanın rengini öğren
r=Math.Abs((int)(renk1.R)-renk2.R)+128;
if(r>255)
r=255;
g=Math.Abs((int)(renk1.G)-renk2.G)+128;
if(g>255)
g=255;
b=Math.Abs((int)(renk1.B)-renk2.B)+128;
if(b>255)
b=255;
renk3=Color.FromArgb(r,g,b);
bmp.SetPixel(i,j,renk3);
if((i%10)==0)//her on satırda bir göstergeyi güncelle
{
progressBar1.Value=i*bmp.Height+j;
Application.DoEvents();
}
}
}
pictureBox2.Image=bmp;
progressBar1.Visible=false;
}//else sonu[/TD]
[/TR]
[/TABLE]


mk1_2.jpg


Bir resmi siyah beyaz yapma (gri tonlara çevirme)

Bu etkimizdeki temel mantık her bir renk bileşenlerinin aritmetik ortalamasını alıp çıkan sonucu her üç renk bileşenine atamak olacaktır. Diğer işlemeler önceki etkilerimiz ile aynıdır.

[TABLE="class: cms_table_cms_table_codeBlock, width: 100%"]
[TR]
[TD]if(pictureBox1.Image==null)
{
MessageBox.Show("Önce bir resim Seçin");
}
else
{
progressBar1.Visible=true;
int i,j;
Color renk;//Color sınıfından bir renk nesne tanımlıyoruz.
Bitmap bmp=new Bitmap(pictureBox1.Image);
//int r,g,b;
progressBar1.Maximum=bmp.Width*bmp.Height;//İşlem çubuğunun maksimim olduğu yer for döngüsünün sonundaki piksel değerine erişmemiz durumundadır.
for(i=0;i<=bmp.Width-1;i++)//dikey olarak görüntümüzü tarıyoruz.
{
for(j=0;j<=bmp.Height-1;j++)//yatay olarak görüntümüzü tarıyoruz.
{
renk=bmp.GetPixel(i,j);
renk=Color.FromArgb((byte)((renk.R+renk.G+renk.B)/3),(byte)((renk.R+renk.G+renk.B)/3),(byte)((renk.R+renk.G+renk.B)/3));
bmp.SetPixel(i,j,renk);
if((i%10)==0)//her on satırda bir göstergeyi güncelle
{
progressBar1.Value=i*bmp.Height+j;
Application.DoEvents();
}
}
}
pictureBox2.Image=bmp;
progressBar1.Visible=false;
}//else sonu[/TD]
[/TR]
[/TABLE]




Dosyadan resim açmak:

Aşağıdaki kodu bir düğme olayına eklersek belirtilen dosya biçimlerinde dosyaları açabiliriz. Yeni bir dosya açmak istersek işlem yapmış olduğumuz ikinci pictureBox daki resim sıfırlanacaktır.

[TABLE="class: cms_table_cms_table_codeBlock, width: 100%"]
[TR]
[TD]openFileDialog1.Filter="Resim Dosyaları|"+"*.bmp;*.jpg;*.gif;*.wmf;*.tif;*.png";
if(openFileDialog1.ShowDialog()==DialogResult.OK)
{
pictureBox2.Image=null;
pictureBox1.Image=Image.FromFile(openFileDialog1.F ileName);
}[/TD]
[/TR]
[/TABLE]


Ayrıca belirtmem gereken bir şeyde pictureBox’ların özellik kısımlarından SizeMode özelliğini(properties)StretchImage yaparak resmi pictureBox boyutuna sığdırabilirsiniz. Aksi takdirde resmin sadece bir kısmını görürüz.
 
Konu Detaylı Şekilde Sabitte Olan "http://www.turkmmo.com/c-c-python/3171322-c-c-python-hakkinda-hersey.html" Bu Konuda Açıklanmıştır.
 
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst