Resmi Bulanıklaştırmak

   Görüntü işleme konusunda aldığım geri bildirimler sonrasında seriye yeni bir makale daha eklemenin yerinde olduğuna karar verdim. Bu makalemde sizlerle bir resmi nasıl bulanık (blur) hale getirebileceğimizi paylaşacağım.

   Bir resmin netliğinin kaybolmasının sağlandığı bulanıklaştırma, temel de belirli bir alan içerisindeki piksellerin renk ortalamasının alınması asasına dayalı bir yöntemdir. Daha önce detaylarını sizlerle paylaştığım pikselleştirme yöntemi gibi bulanıklaştırma da piksel bazlı değil resmin bütünü üzerinde yapılan bir işlemdir. Daha önce sizlerle paylaştığım görüntü işleme yöntemleri gibi bulanıklaştırma da, mantığı bilindiği sürece, zor bir işlem değildir.

oncesiSonrasi

   İşleme başlarken, öncelikle nihai görüntüyü saklayacağımız Bitmap nesnemizi oluşturmalıyız;

var goruntuGenislik = orjinalGoruntu.Width;
var goruntuYukseklik = orjinalGoruntu.Height;
 
var bulanikGoruntu = new Bitmap(goruntuGenislik, goruntuYukseklik);

   Ardından bulanıklaştırma işlemi için orjinal görüntü pikselleri içerisinde dolaşmaya başlayalım;

for (var x = 0; x < goruntuGenislik; x++) {
    for (var y = 0; y < goruntuYukseklik; y++) {
        //...
    }
}

   Devamında da belirlediğimiz boyut ile oluşturduğumuz alan içerisindeki piksellerin kırmızı, yeşil ve mavi kanallarının her birinin ayrı ayrı ortalamasını hesaplayalım. Bu ortalama daha sonra sonuç görüntümüzde bu alana denk gelen pikseller için kullanacağımız rengi belirlememize yardımcı olacak.

for (var bulanikX = x; bulanikX < x + bulaniklikBoyutu && bulanikX < goruntuGenislik; bulanikX++) {
    for (var bulanikY = y; bulanikY < y + bulaniklikBoyutu && bulanikY < goruntuYukseklik; bulanikY++) {
        var pixel = orjinalGoruntu.GetPixel(bulanikX, bulanikY);
 
        ortalamaR += pixel.R;
        ortalamaG += pixel.G;
        ortalamaB += pixel.B;
 
        bulanikPikselSayisi++;
    }
}
 
ortalamaR /= bulanikPikselSayisi;
ortalamaG /= bulanikPikselSayisi;
ortalamaB /= bulanikPikselSayisi;

   Dikkat ettiyseniz belirlediğimiz alanın ortasındaki piksel’in koordinatlarını hesaplarken aynı zamanda koordinatların görüntümüz sınırları içerisinde kaldığından da emin oluyoruz.

   Son olarak, alanımız içerisindeki tüm pikselleri hesapladığımız bu renge boyuyoruz;

for (var blurX = x; blurX < x + bulaniklikBoyutu && blurX < goruntuGenislik; blurX++) {
    for (var blurY = y; blurY < y + bulaniklikBoyutu && blurY < goruntuYukseklik; blurY++) {
        bulanikGoruntu.SetPixel(blurX, blurY, ortalamaRengi);
    }
}

   Orjinal görüntümüzdeki tüm pikseller için aynı işi tekrarlamamız sonrasında istediğimiz pikselleşmiş görüntüyü elde ediyor olacağız.Bulaniklastirma

   Yaptığımız işlemleri toparlayacak olursak, elimizde aşağıdaki gibi nihai bir kod parçacığı oluşacaktır;

var orjinalGoruntu = new Bitmap(pbOrjinal.Image);
const int bulaniklikBoyutu = 15;
 
var goruntuGenislik = orjinalGoruntu.Width;
var goruntuYukseklik = orjinalGoruntu.Height;
 
var bulanikGoruntu = new Bitmap(goruntuGenislik, goruntuYukseklik);
 
for (var x = 0; x < goruntuGenislik; x++) {
    for (var y = 0; y < goruntuYukseklik; y++) {
        var ortalamaR = 0;
        var ortalamaG = 0;
        var ortalamaB = 0;
 
        var bulanikPikselSayisi = 0;
        for (var bulanikX = x; bulanikX < x + bulaniklikBoyutu && bulanikX < goruntuGenislik; bulanikX++) {
            for (var bulanikY = y; bulanikY < y + bulaniklikBoyutu && bulanikY < goruntuYukseklik; bulanikY++) {
                var pixel = orjinalGoruntu.GetPixel(bulanikX, bulanikY);
 
                ortalamaR += pixel.R;
                ortalamaG += pixel.G;
                ortalamaB += pixel.B;
 
                bulanikPikselSayisi++;
            }
        }
 
        ortalamaR /= bulanikPikselSayisi;
        ortalamaG /= bulanikPikselSayisi;
        ortalamaB /= bulanikPikselSayisi;
 
        var ortalamaRengi = Color.FromArgb(ortalamaR, ortalamaG, ortalamaB);
 
        for (var blurX = x; blurX < x + bulaniklikBoyutu && blurX < goruntuGenislik; blurX++) {
            for (var blurY = y; blurY < y + bulaniklikBoyutu && blurY < goruntuYukseklik; blurY++) {
                bulanikGoruntu.SetPixel(blurX, blurY, ortalamaRengi);
            }
        }
    }
}
 
pbBulanik.Image = bulanikGoruntu;

Fatih Boy

Ankara'da yaşayan Fatih, bir kamu kurumunda danışman olarak çalışmaktadır. ALM süreçleri, kurumsal veri yolu sistemleri, kurumsal altyapı ve yazılım geliştirme konularında destek vermektedir. Boş zamanlarında açık kaynak kodlu projeler geliştirmeyi ve bilgisini yazdığı makalelerle paylaşmayı seven Fatih, aynı zamanda Visual C# ve Visual Studio teknolojileri konusundan Microsoft tarafından altı yıl üst üste MVP (En Değerli Profesyonel) ödülüne layık görülmüştür. İş hayatı boyunca masaüstü uygulamaları, web teknolojileri, akıllı istemciler gibi konularda Asp.Net, Php, C#, Java programlama dilleri ve MySql, MsSql ve Oracle gibi veritabanı yönetim yazılımları ile çalışmıştır. İngilizce ve Türkçe olarak yayınlanan makalelerini gerek İngilizce bloğunda, gerekse de Türkçe bloğunda bulabileceğiniz gibi web sitesinden de açık kaynak kodlu geliştirdiği yazılımlarına ulaşabilirsiniz. vCard - Twitter - Facebook - Google+

2 yorum

  1. Ahmet Karyalı   •  

    Yaptığınız işe saygı duyuyorum paylaşımlar için çok teşekkürler fakat; Şu gerizekalı Amerikan Türkçesini bir düzeltin lütfen. Paylaşıyor olacağım ne demek? Türkçe’de future continuous tense mi var ? Siz de bunu yaparsanız artık ne diyeyim…

    • Fatih Boy   •     Yazar

      Merhaba Ahmet Bey,
      Geri bildirim için teşekkürler. Şimdi okuyunca, gerçekten de “paylaşıyor olacağım” olmamış. Halbuki, saat 2 gibi gözüme oldukça normal gözükmüştü 🙂

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir