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);
    }
}
Bulaniklastirma

   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.

   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;

2 Comments

  1. 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…

    1. 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ü 🙂

Leave a Comment

en_USEnglish