Home TürkçeC# Resmi Bulanıklaştırmak

Resmi Bulanıklaştırmak

by Fatih Boy
2 comments

   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;

Şu Yazıları da Sevebilirsiniz

2 comments

Ahmet Karyalı 7 Eylül 2011 - 07:12

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…

Reply
Fatih Boy 7 Eylül 2011 - 08:15

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

Reply

Leave a Comment

* Bu formu kullanarak, verilerinizin bu web sitesi tarafından saklanması ve kullanılmasını kabul ediyorsunuz.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Bu web sitesi deneyiminizi geliştirmek için çerezleri kullanır. Bunu kabul ettiğinizi varsayacağız, ancak isterseniz vazgeçebilirsiniz. Kabul Et Daha Fazla Bilgi