Elektrotekno.com Ana Sayfa || Kitaplar, Dergiler (E-Books, Magazines)


görüntü işleme (c#)

Açıklama:
Elektrik, Elektronik, Haberleşme ve Otomasyon konularının ağırlıklı olarak konuşulduğu, tartışıldığı ve bilgi paylaşımı yapıldığı forumumuza hoşgeldiniz.
Şu an E-kütüphane (Elektrik, elektronik ve haberleşme konularında) kategorisi içerisindeki Kitaplar, Dergiler (E-Books, Magazines) forumunda bulunuyorsunuz.
Bu sayfada üyelerimizin "görüntü işleme (c#)" konusundaki problem, görüş ve önerileri okuyabilir ayrıca konu hakkındaki doküman, resim, proje, devre ve programlara ücretsiz olarak ulaşabilirsiniz. Üye olduktan sonra sizler de konu hakkında sorular sorabilir ya da yorum ve paylaşım yaparak birikimlerinizi aktarabilirsiniz.
Forumdan tam olarak yararlanabilmek için üye olmayı unutmayınız!
Kayıt: 28 Hzr 2009
Mesajlar: 21

Offline
imotephcadi
Tarih: 14 10 2009 13:38

Görüntü İşleme : Ölçülmüş veya kaydedilmiş olan elektronik (dijital) görüntü verilerini, elektronik ortamda (bilgisayar ve yazılımlar yardımı ile) amaca uygun şekilde değiştirmeye yönelik olarak yapılan bilgisayar çalışması.
görüntü işleme (c#)
Bir görüntü gözek(pixel)lerden, gözeklerde kırmızı(R)-yeşil(G)-mavi(B) renk değerlerinden oluşur. Gözeklerin rengi RGB olarak üç ana rengin birleşimi şeklinde ifade edilir. R-G-B renk değerleri 0 ila 255 arasında değişir. 0 en koyu ton iken 255 e gittikçe açılır. Örneğin mavi rengin değeri Sad0,0,255) kırmızın :(255,0,0) ve yeşilin de Sad0,255,0) dir. Diğer renkler bu değerlerin değişmesi ile elde edilir. Artı olarak 32bitlik bir görüntünün gözekleri 4 kısından oluşur ve 4 kısımda görüntüye saydamlık derecesini veren 'Alpha' kanalıdır.

Görüntünün bir satırda bulundurduğu gözeklerin sayısı o görüntünün genişliğini(width), satır sayısıda o resmin boyunu(height) verir.Boyutlarda (800x600), (1024x768) gibi iki değerli şeklinde yazılır. Bu değerlerden ilki görüntünün genişliğini, ikinci değer ise boyunu verir.

C# ile görüntü işlemek için bir çok yöntem mevcut olmasına rağmen daha hızlı bir yöntem olduğu için pointer kullanacağım. Kullandığım yöntemin ana kalıbı aşağıdaki gibidir.

24bitlik format için ;
Kod
  public Bitmap griton(Bitmap resim)

        {
            unsafe
            {
                BitmapData bmpdata = resim.LockBits(new Rectangle(0, 0, resim.Width, resim.Height),
                        ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

                byte* p = (byte*)bmpdata.Scan0;
                int atıl = bmpdata.Width*3 - bmpdata.Stride;

                for (int i = 0; i < bmpdata.Height; i++)
                {
                    for (int h = 0; h < bmpdata.Width; h++)
                    {
                        byte ort = Convert.ToByte((p[0] + p[1] + p[2]) / 3);
                        p[0] = p[1] = p[2] = ort;
                        p += 3;
                    }
                    p += atıl;
                }

                resim.UnlockBits(bmpdata);

                return resim;
            }
        }

32bitlik format için ;

Kod
public Bitmap griton(Bitmap resim)

        {
            unsafe
            {
                BitmapData bmpdata = resim.LockBits(new Rectangle(0, 0, resim.Width, resim.Height),
                        ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

                byte* p = (byte*)bmpdata.Scan0;

                for (int i = 0; i < bmpdata.Height; i++)
                {
                    for (int h = 0; h < bmpdata.Width; h++)
                    {
                        byte ort = Convert.ToByte((p[0] + p[1] + p[2]) / 3);
                        p[0] = p[1] = p[2] = ort;
                        p += 4;
                    }
                }

                resim.UnlockBits(bmpdata);

                return resim;
            }
        }

Dikkat ettiyseniz 24bitlik formatın aksine burada atıl oluşmamaktadır.

Kodları unsafe bloğunun içinde yazabileceğimiz gibi metodu aşağıdaki gibi de tanımlayabiliriz.

Kod
  public unsafe Bitmap griton(Bitmap resim)

        {
            BitmapData bmpdata ...
            ....
       }

Yukarıdaki kodları satır satır açıklarsak;

İlk olarak pointerlar olarak çalışacağımız için kodları "unsafe" bloğu içinde yazmalıyız veya metodu tanımlarken "unsafe" özlelliğini kullanmalıyız. Yalnız projemizde unsafe komutunu kullanabilmemiz için öncelikli olarak projenin ayarlarından unsafe kullanımına izin vermeliyiz. Bunun için, 'Project' menüsünden, '[Proje ismi] Properties', açılan pencerede 'Build' seçeneğine girip 'Allow unsafe code' seçeneğini aktif hale getiriyoruz.

Kod
BitmapData bmpdata = resim.LockBits(new Rectangle(0, 0, resim.Width, resim.Height),

           ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);


Resmin bitlerini ramde kitleyerek üzerinde işlem yapabilceğimiz hale getiriyor. Aldığı parametreler ;

"new Rectangle(0, 0, resim.Width, resim.Height) " , resmin üzerinde işlem yapılacak alanı belirtir. Yazıldığı şekilde, resmin (0,0) noktasında sonuna kadar tüm alanı kullanır.

"ImageLockMode.ReadWrite" , kilitli alan üzerinde işlem izni. ".ReadWrite" hem okumaya hem yazmaya, ".ReadOnly" adından da anlaşılacağı gibi sadece okurken, ".WriteOnly" sadece yazmaya izin verir.

"PixelFormat.Format24bppRgb" kilitli alanın kullanacağı formatı belirtir.Genel olarak ".Format32bppArgb" ve ".Format24bppRgb formatları kullanılmaktadır. 32 bit formatın 24 formata göre farkı, bir gözekin 3 (r-g-b) yerine 4 (r-g-b-a) parçası olması.

Kod
byte* p = (byte*)bmpdata.Scan0;


görüntü işleme (c#)
Bu komut ile kilitli bellek alanının ilk noktasına ulaşılmaktadır. Resim verilerinin ram üzerinde yerleşimini, resmin gözek yerleşiminin(2 boyutlu) tersine tek satır olarak yerleşmiş olduğunu düşünebiliriz. Yani bir gözekin 3 renk değeri(b-g-r) bitince diğer gözeğin ilk renk değeri (b) gelmektedir. Yukarıdaki resimde de temsili olarak gösterildiği şekilde, p=p[0] ilk renk değerini(mavi) verirken p[1] bir sonraki(yeşil) vermektedir. Eğer p yi bir artırırsak p[0] artık 2. renk değerini(yeşil) verirken p[1] 3. renk değerini(kırmızı) verir. Gözeklerin renk değerlerine ulaşmak için; eğer p değeri gözeğin başındaysa p[0] o gözeğin mavi(b), p[1] yeşil(g) ve p[3] de kırmızı(r) bileşenini vermektedir. Dikkat ettiysenin dizilimler standart r-g-b diziliminin tersine bellekte b-g-r (mavi-yeşil-kırmızı) şeklinde dizilmiştir. Eğer 32bit formatını seçtiyseniz, p[3] değeri bize o gözekin saydamlık derecesini verir. Tam görünür bir gözek için bu değer255 , hiç görünmemesi içinde bu değer 0'a ayarlanır. 32bitlik formatta bir sonraki gözeğe ulaşmak için p, 4 artırılır.
Kod


for (int i = 0; i < bmpdata.Height; i++)
{
    for (int h = 0; h < bmpdata.Width; h++)
    {
        byte ort = Convert.ToByte((p[0] + p[1] + p[2]) / 3);
        p[0] = p[1] = p[2] = ort;
        p += 4;
    }
}

Görüntü üzerinde gözek gözek yapılacak (noktasal) işlemler için (parlaklık, gri ton, negatif gibi) tüm gözekleri dolaşacak şekilde içiçe iki döngü yapıyoruz. İçteki döngü bir satırın tüm gözeklerini dolaşırken, dıştaki döngü hangi satırda olduğumuzu belirliyor. Satır içinde dolaştığımız için bir gözekle işimiz bittiğinde bir sonraki gözeke geçmek için iç döngüde p'yi 3 artırıyoruz(32bit te 4). Bir satır bittiğinde de dıştaki döngünün sonunda p'ye atılı ekliyoruz(sadece 24bit için). Yukarıda ki kodda 32bitlik kullanılarak, bir resmi gri tonlarına çevirme uygulanmıştır. Bir gözekin tüm renk değerlerinin ortalaması alınıp, tüm renk değerlerine bu ortalama değeri atanmaktadır. Bir gözekle işimiz bittiğine bir sonraki gözeğe "p+=4;" kodu ile geçebiliyoruz. Artık p[0] değeri bize diğer gözeğin mavi renk değerini verecektir.
Kod
resim.UnlockBits(bmpdata);

Burada ise daha önce ram üzerinde kilitleyip üzerinde işlemler yaptığımız bellek alanını resme geri atıyoruz.

Kaynak: http://www.gencisbb.com/
Başa dön



görüntü işleme (c#)


Benzer Konular
- Görüntü İşleme- Onur Güleryiz ders notları Brooklyn Uni.
- görüntü işleme tekniği ile mesafe, hız, yön ölçümü projesi
- seri iletişimli kablosuz görüntü aracı projesi

- yardım!!! spektral görüntü filtreleme

- görüntü yakalama kartı yardım
- MATLAB ile ses okuma ve işleme projesi...
- MATLAB - Görüntü işleme ile lastik izi tanıma projesi...
- Matlab Görüntü işleme...
- Receiver Tuneri ile1500mhzde görüntü aktarma

- Gurur verici bir görüntü.

- İmge işleme konu anlatımı - Soru - Çözümleri

Sitemize üyelik ve içeriğin indirilmesi tamamen ücretsizdir. Sitemizde paylaşılan tüm dokümanlar (Tezler, makaleler, ders notları, sınav soru cevaplar, projeler) paylaşımcıların bireysel çalışmaları olup telif hakları kendilerine aittir ya da açık bir şekilde kamusal alana yerleştirilmiş dokümanların birer kopyalarıdır. Kişilerin bireysel çalışmalarını sitemizde yüklemesinde, sitemizde paylaşıma teşvik eden puanlama sisteminin de etkisi büyüktür. Bunlara rağmen hala size ait olan ve burada bulunmasına izin vermediğiniz dokümanlar varsa iletişim bölümünden yöneticilere bildirmeniz durumunda derhal silineceklerdir.
Powered by phpBB | Translated by phpBB Türkiye | Ads by Google Adsense | Design by Crazy Bat based
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72