C# Görüntü İşleme Uygulaması -1

Görüntü işlemenin “hello world” u olan bir resmi gri tona çevirme ile işe başlıyoruz. Buradaki ilk amacımız resmin piksellerine ulaşabilmek ve yeni değer verebilmektir. Bunu C# da en basit şekilde aşağıdaki kod ile yapılabilir.

 

Color c = alınanres.GetPixel(i, j);

Color nesnesi üç rengi tutan bir değişkendir. Resimin (İ,j) kordinatındaki piksel değerine bu şekilde ulaşılır.

Gri ton dediğimiz ise bir pikseldeki 3 rengin ortalama değeridir. Bu bilgi ışığında bir pixelin yeni renk değerini şu şekilde veririz.

 

alınanres.SetPixel(i, j, Color.FromArgb(c.B , c.G , c.R ));

Yine yukarıda görüldüğü gibi nokta operatörü kullanılarak resimin renk değerlerine direkt olarak ulaşılabiliyor

Yukarıdaki şekilde piksellere erişebiliyoruz ve değerini değiştirebiliyoruz fakat bir problemimiz var.Performans!!. Basit bir gri tona çevirme işleminde bile biraz çözünürlüğü yüksek bir resimle işlem yaptığımız da azımsanmayacak bir sürede işlemlerin gerçekleştirildiğini görüyoruz. Bu nedenle C# ın sadece güvensiz modda (unsafe) izin verdiği pointer ları ele alcağız ve kullanacağız.

Öncelikle Bitmap olan resim nesnemizi Bitmapdata formatına dönüştürmemiz gerekiyor. Resmimiz Bitmapdata formatına geldikten sonra resmi belleğe kilitlememiz ve bu alanın bellekteki ilk adresini elde etmemiz gerekli. Aşağıda bitmapdatanın oluşturulması ve bunun belleğe kilitlenip ilk adresinin nasıl alındığını gösteren kod parçası yer almaktadır.

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

 

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

Kullandığımız resimin piksel formatı 32bbArgb olduğunda bir pikselin içinde barındırdığı 3 renk dışında birde Alpha değeri vardır.Böylece bir piksel 4X8 bitten 4 baytlık alan kaplar.

Bellekte bir pikselin renk değerleri sıralaması ; ilk değer mavi ikincisi yeşil üçte ise kırmızı yer alır. Son baytta ise alpha değeri yer alır. Bu nedenle p pointerimizin;

P[0]=mavi ,p[1]=yeşil,p[2]=kırmızı şeklinde ilk pikselin değerlerini verir. Diğer pikselin değerlerini almak için ise pointeri 4 bayt ileri adrese öteleriz. p=p+4; şeklinde…

Resmimize uygulayacağımız ikinci basit işlem ise resmi siyah beyaz yani binary moda çevirmek olacak. Bunun için yapacağımız işlem ise resmi öncelikle yukarıdaki şekilde gri tona çevirmek ve pikselin gri ton değerini belli bir eşik değerine göre siyah renge yada beyaz renge sabitlemek olacaktır. Yani belli bir parlaklık değerinin üzerinde olan yerler beyaz altında olan yerler siyah olacaktır.

Eşik değerin hesaplanması otsu diye bilinen bir algoritma ile gerçekleştirilir.

Histogram

Histogramın tanımı kısaca ,resimde hangi tonda kaç tane piksel değeri olduğunu gösteren tablo, şeklinde yapılabilir. Aşağıda resim ve onun histogramı görülmektedir.

Görüntü histogramı görüntüde piksellerin gri değerlerine ilişkin bağıl sıklık ölçütünü oluşturur. Şekildeki histogram da yatay eksen gri değer aralığını, düşey eksen de her bir aralıktaki piksel sayısını göstermektedir. Böylelikle görüntünün kontrastına ilişkin bilgi elde etmek mümkün olmaktadır.

Histogramdan yararlanılarak görüntüdeki kontrastın zenginleştirilmesi mümkündür.

Histogram eşitleme de kontrast zenginleştirme yöntemlerinden biridir. Histogram eşitlemesi ile görüntüde parlaklık en çok toplandığı alana en büyük kontrast zenginleştirmesi uygulanmaktadır.

Bir resmin histogram bileşenlerinin istenen değerlere sahip olacak şekilde değiştirilmesine histogram eşitleme denir. Histogram eşitleme sayesinde resim üzerindeki pek çok detay daha belirgin hale gelmiştir. Histogram eşitlemeden sonra tabii ki tamamen düz seviyeli bir histogram elde etmiyoruz ama yatay eksendeki bölgesel toplamlara baktığınızda birbirine daha yakın değerler oluştuğunu görebiliriz. Resmin tümüne uygulanabileceği gibi sadece belli bir bölgesine de uygulanabilir. Tüm resme uygulanırsa global histogram eşitleme, resmin belli bir bölgesine uygulandığında ise lokal histogram eşitleme adını alır. Bu yöntem histogramı dar olan resimler ya da resim içindeki bölgeler için daha iyi sonuç verir.

Uygulanışı: Resmin histogramı bulunur.

Histogramdan yararlanılarak kümülatif histogram bulunur. Kümülatif histogram, histogramın her değerinin kendisinden öncekiler ve kendisinin toplamı ile elde edilen değerleri içeren grafiktir.

Kümülatif histogram değerleri yeni resimde olmasını istediğimiz max. renk değerleri ile çarpılıp resimdeki toplam nokta sayısına bölünerek normalize edilir.

Normalize olmuş histogram değerleri ile resmin renk değerlerini tekrar güncellersek o resme histogram eşitleme metodunu uygulamış oluruz.

Filtreleme

Filtreleme resmin üzerinde bir filtre varmış gibi düşünüp her piksel değerinin yeniden hesaplanmasıdır. . Bu filtrenin büyüklüğü ve hangi çevresindeki piksellerin kullanılacağı bize kalmıştır. Bu resimlere uygulayacağımız filtre türüne ve çözünürlüğümüze göre çeşitlilik gösterir.

Genelde 3×3 (piksel) matris halinde bir çekirdek görüntü üzerinde gezdirilir. Her piksel değeri gezdirilen nesnenin altında kalan değer ile çarpılır ve filtre içindeki elemanların toplamına bölünür.

Bu işlemler resmin her pikseli için hesaplanıp güncellendiğinde filtre uygulanmış olur.

Alçak geçirgenli filtreler-Mean filtresi

Bu işlem ortalama alma işlemine karşılık gelir. Filtre çekirdeği büyüdükçe resim daha yumuşak geçişlere sahip olur.

Median filtreleme

Resmi yumuşatmayı amaçlayan bu algoritmadan programda genel olarak 3×3 ve 5×5 matrisler halinde ya da istenilen boyutta filtre kullanılarak faydalanıldı. Bu filtreyi kullanmaktaki amaç resim üzerindeki gürültülerin bu yöntemle yok edilmesiydi. Filtre uyguladığımız alandaki piksel değerleri alınarak, küçükten büyüğe sıralanır, ortadaki değer filtrenin ortasına yazılır. Ancak bu işlemin dezavantajları da unutulmamalıdır. Çünkü bu işlem resimdeki kenarların yumuşamasına neden olur. Eğer biz projemizde kenar belirleme ihtiyacı duyuyorsak bu işlem bu noktada zarar verebilir.

Yüksek geçirgenli filtreler

Yüksek geçirgen filtreler genel olarak kenarları belirlemek için kullanıyoruz. Yüksek geçirgen filtrede pozitif ve negatif değerlerin ikisi de yer alır. Burada dikkat edilmesi gereken nokta ise filtrelerdeki negatif değerlerden dolayı hesaplanan piksel değeri negatif çıkabilir. Bu durumda bu değerlere dikkat etmemiz ve pozitif yapmamız gereklidir.

Kenar bulma işlemi görüntü işlemede çok sık kullanılacak bir yöntemdir. Kenar bulma renklerde meydana gelen ani değişimleri algılamak üzerine kurulu bir mantıkla çalışır. Kenar bulunurken resim üzerinde bazı işlemlerin yapılması gerekir. Bunlardan kısaca bahsetmek gerekirse ;

  1. Gürültü azaltma: daha önce bahsedilen alçak geçirgen filtreler kullanılarak yapılabilir. Fakat anlamlı kenarların bulunmasını engelliyorsa bu işlemden kaçınılmalıdır.
  2. Kenarlarda yüksek tepki veren bir filtrenin kullanılarak kenarları belirgin hale getirmek.
  3. Filtre uygulandıktan sonra sonuçlardan hangilerin anlamlı hangilerin anlamsız olduğuna karar verilmesi.

SOBEL FİLTRESİ

Adaptive Treshold

Bu yöntemde yine kenar bulmaya yöneliktir. Çalışma mantığı diğer kenar bulma algoritmalarına benzer şekilde çevresindeki piksellerle belli bir eşik seviyesi farkı gözetilerek yapılan karşılaştırmadır. Burada diğer yöntemlerden en önemli farkı bir eşik seviyesine göre yapılmasıdır. Bu eşik seviyesini biz belirliyoruz. Fakat bu eşik seviyesi iyi sonuç almak için her resme özel olarak belirlenmelidir.

LAPLACİAN

Laplas filitresi bastiçe bir resimdeki kenar hatlarını belirlemek için kullanılır. Burada kenar ile kastedilen objeleri genelde arka plandan ayıran keskin renk ayrılıklarıdır. Keskinleştirme Filitresi (Sharpening Filter) ismi ile de anılır.

GAUSSIAN

Resimi yumuşatma için kullanılır. Keskin kenarlar bulanıklaşır. Gürültü gidermek için kullanılabilir.

GENIŞLETMEK

Sayısal bir resmi genişletmek demek resmi yapısal elemanla kesiştiği bölümler kadar büyütmek demektir. Bunu yapabilmek için yapısal eleman resim üzerinde piksel piksel dolaştırılır. Eğer yapısal elemanın orjini resim üzerinde “0” değerli bir piksel ile karşılaşırsa herhangi bir değişiklik meydana gelmez. Eğer değeri “1” olan bir piksel ile karşılaşırsa yapısal elemanla yapısal elemanın altında kalan pikseller mantıksal “or” işlemine tabi tutulurlar. Yani herhangi “1” değeriyle sonuç “1” e çevrilir.

Genişletme (dilation) ile resim üzerindeki objeler şişer. Obje içinde delikler var ise bunlar kapanma eğilimi gösterirler. Ayrık nesneler birbirine yaklaşır ya da bağlanır.

Aşağıda 3×3 yapısal elemanı ile sayısal resim üzerine genişletme uygulanması ifade edilmiştir. 3×3 lük yapısal elemanın tüm değerleri “1” dir.

AŞINDIRMAK

Aşındırma işlemi bir bakıma genişletmenin tersi gibi görülebilir. Burada yine aynı şekilde yapısal eleman resim üzerinde piksel piksel dolaştırılır fakat bu defa yapısal elemanın merkez pikseli “1” değeri ile karşılaşırsa yapısal eleman içerisindeki piksellerin durumuna bakılır. Eğer yapısal eleman içerisindeki “1” olan piksellerden herhangi biri altında resme ait “0” değeri varsa yapısal elemanın diğer “1” lerinin altındakilerle beraber bu piksel “0” a dönüştürülür.

Aşındırma (erozyon, erosion) işlemi ile sayısal resim aşındırılmış olur. Yani resim içerisindeki nesneler ufalır, delik varsa genişler, bağlı nesneler ayrılma eğilimi gösterir.

Aşağıda 3×3 yapısal elemanı ile sayısal resim üzerine aşındırma uygulanması gösterilmiştir. 3×3 lük yapısal elemanın tüm değerleri “1” dir.

AÇMAK

Sayısal bir resme önce aşındırma daha sonra genişletme uygulanırsa resme Açma(Opening) işlemi uygulanmış olur.Açma işlemine tabi tutulmuş bir görüntü ve değişimi aşağıda gösterilmiştir. Burada yine 3×3 lük yapısal eleman kullanılmıştır.

KAPATMAK

Sayısal resme önce genişletme daha sonra aşındırma uygulanırsa Kapatma(Closing) işlemi uygulanmış olur.

Açma işlemi ile birbirine yakın iki obje görüntüde fazla değişime sebebiyet vermeden ayrılmış olurlar. Kapatmada ise birbirine yakın iki nesne görüntüde fazla değişiklik yapılmadan birbirine bağlanmış olurlar.

DISCRETE WAVELET TRANSFORM (DWT)

Görüntü alçak frekans bileşenlerini incelemek için alçak geçirgen bir filtre , yüksek frekanslı bileşenler için ise yüksek geçirgen filtre kullanılarak görüntünün farklı frekan bileşenlerinin ortaya çıkarmak için yapılan dönüşümdür. Yüksek frakanslı bileşenler kenarları belli ederken alçak frakanslı bölge ortalama resmi verir. Ortalama resimde gürültüler azalmıştır. Yüksek frekanslı bölgelerde gürültü kendini belli eder. Ortalama resmin elde edildiği bölge tekrar tekrar aynı dönüşüme tabi tutulabilir. Bu da dönüşümün derecesine bağlıdır.

DISCRETE COSINE TRANSFORM (CDT)

Discrete Cosine Transform(DCT) yani Ayrık Kosinüs Dönüşümü  resmin dikey ve yatay orijinal renk değerleri,özel bir formül yardımıyla hesaplanır ve frekanslarının en yüksek ve düşük olduğu noktalar saptanır. Bu işlemin sebebi aslında en yüksek frekanslardaki renklerin tespit edilmesidir. İnsan gözü yüksek frekansları ayırt etmekte zorlandığı için bunları düşürmek ve hatta sıfıra indirmek mümkündür. Böylece bu değerler çıkarılarak resim sıkıştırılabilir. Daha çok anlam taşıyan değerler sol üst köşede toplanmıştır. En az değerli değerler ise orta band olarak düşünülebilir.

Uygulama tasarımı

Uygulama içerisindeki yapılan işlemleri rahatlıkla test edebilmek ve sonuçları görebilmek için uygun bir program tasarımı gerçekleştirildi. Yan yana bulunan iki picturebox nesnesi sayesinde resimin orjinali ile çıktısını karşılaştırma,ortadaki listboxlardın biri uygulanacak fonksiyonun seçimi diğeri ise işlemin yapılma sürelerinin gösterilmesi amacı ile yerleştirildi.

En altta ise yatay bir panel konuldu ve buraya resimlerin eklenebilmesini sağlayacak bir yöntem yazıldı Bu yöntem yeni picturebox nesneleri oluşturarak resimlerimizi burada tutmayı ve istediğimiz zaman kullanabilmemizi sağlıyor. Ayrıca programa resimlerin rahat eklenebilmesi için dışarıdan bir resim dosyasının yada dosyalarının sürüklenmesi halinde hepsini bu panel üzerine sıralanmasını sağlayacak drag-drop olayları gerçekleşiyor.

Program içindeki pictureboxlar üzerinden yapılan sürükle bırak işlemleri ilede bu panele resimleri ekleyebiliriz.

Görüntü işlemenin “hello world” u olan bir resmi gri tona çevirme ile işe başlıyoruz. Buradaki ilk amacımız resmin piksellerine ulaşabilmek ve yeni değer verebilmektir. Bunu C# da en basit şekilde aşağıdaki kod ile yapılabilir.

Color c = alınanres.GetPixel(i, j);

Color nesnesi üç rengi tutan bir değişkendir. Resimin (İ,j) kordinatındaki piksel değerine bu şekilde ulaşılır.

Gri ton dediğimiz ise bir pikseldeki 3 rengin ortalama değeridir. Bu bilgi ışığında bir pixelin yeni renk değerini şu şekilde veririz.

 

alınanres.SetPixel(i, j, Color.FromArgb(c.B , c.G , c.R ));

Yine yukarıda görüldüğü gibi nokta operatörü kullanılarak resimin renk değerlerine direkt olarak ulaşılabiliyor

Yukarıdaki şekilde piksellere erişebiliyoruz ve değerini değiştirebiliyoruz fakat bir problemimiz var.Performans!!. Basit bir gri tona çevirme işleminde bile biraz çözünürlüğü yüksek bir resimle işlem yaptığımız da azımsanmayacak bir sürede işlemlerin gerçekleştirildiğini görüyoruz. Bu nedenle C# ın sadece güvensiz modda (unsafe) izin verdiği pointer ları ele alcağız ve kullanacağız.

Öncelikle Bitmap olan resim nesnemizi Bitmapdata formatına dönüştürmemiz gerekiyor. Resmimiz Bitmapdata formatına geldikten sonra resmi belleğe kilitlememiz ve bu alanın bellekteki ilk adresini elde etmemiz gerekli. Aşağıda bitmapdatanın oluşturulması ve bunun belleğe kilitlenip ilk adresinin nasıl alındığını gösteren kod parçası yer almaktadır.

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

 

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

Kullandığımız resimin piksel formatı 32bbArgb olduğunda bir pikselin içinde barındırdığı 3 renk dışında birde Alpha değeri vardır.Böylece bir piksel 4X8 bitten 4 baytlık alan kaplar.

Bellekte bir pikselin renk değerleri sıralaması ; ilk değer mavi ikincisi yeşil üçte ise kırmızı yer alır. Son baytta ise alpha değeri yer alır. Bu nedenle p pointerimizin;

P[0]=mavi ,p[1]=yeşil,p[2]=kırmızı şeklinde ilk pikselin değerlerini verir. Diğer pikselin değerlerini almak için ise pointeri 4 bayt ileri adrese öteleriz. p=p+4; şeklinde…

Resmimize uygulayacağımız ikinci basit işlem ise resmi siyah beyaz yani binary moda çevirmek olacak. Bunun için yapacağımız işlem ise resmi öncelikle yukarıdaki şekilde gri tona çevirmek ve pikselin gri ton değerini belli bir eşik değerine göre siyah renge yada beyaz renge sabitlemek olacaktır. Yani belli bir parlaklık değerinin üzerinde olan yerler beyaz altında olan yerler siyah olacaktır.

Eşik değerin hesaplanması otsu diye bilinen bir algoritma ile gerçekleştirilir.

Histogram

Histogramın tanımı kısaca ,resimde hangi tonda kaç tane piksel değeri olduğunu gösteren tablo, şeklinde yapılabilir. Aşağıda resim ve onun histogramı görülmektedir.

Görüntü histogramı görüntüde piksellerin gri değerlerine ilişkin bağıl sıklık ölçütünü oluşturur. Şekildeki histogram da yatay eksen gri değer aralığını, düşey eksen de her bir aralıktaki piksel sayısını göstermektedir. Böylelikle görüntünün kontrastına ilişkin bilgi elde etmek mümkün olmaktadır.

Histogramdan yararlanılarak görüntüdeki kontrastın zenginleştirilmesi mümkündür.

Histogram eşitleme de kontrast zenginleştirme yöntemlerinden biridir. Histogram eşitlemesi ile görüntüde parlaklık en çok toplandığı alana en büyük kontrast zenginleştirmesi uygulanmaktadır.

Bir resmin histogram bileşenlerinin istenen değerlere sahip olacak şekilde değiştirilmesine histogram eşitleme denir. Histogram eşitleme sayesinde resim üzerindeki pek çok detay daha belirgin hale gelmiştir. Histogram eşitlemeden sonra tabii ki tamamen düz seviyeli bir histogram elde etmiyoruz ama yatay eksendeki bölgesel toplamlara baktığınızda birbirine daha yakın değerler oluştuğunu görebiliriz. Resmin tümüne uygulanabileceği gibi sadece belli bir bölgesine de uygulanabilir. Tüm resme uygulanırsa global histogram eşitleme, resmin belli bir bölgesine uygulandığında ise lokal histogram eşitleme adını alır. Bu yöntem histogramı dar olan resimler ya da resim içindeki bölgeler için daha iyi sonuç verir.

Uygulanışı: Resmin histogramı bulunur.

Histogramdan yararlanılarak kümülatif histogram bulunur. Kümülatif histogram, histogramın her değerinin kendisinden öncekiler ve kendisinin toplamı ile elde edilen değerleri içeren grafiktir.

Kümülatif histogram değerleri yeni resimde olmasını istediğimiz max. renk değerleri ile çarpılıp resimdeki toplam nokta sayısına bölünerek normalize edilir.

Normalize olmuş histogram değerleri ile resmin renk değerlerini tekrar güncellersek o resme histogram eşitleme metodunu uygulamış oluruz.

 

Görüntü işleme uygulamama aşağıdaki linkten ulaşabilirsiniz.

https://drive.google.com/open?id=1w_JKmQ90Ckpau3S1ICPzjEPOSXr7ZiPR

 

Mehmet Salih Deveci

I am Founder of IT Tutorial and Certified Expert about Oracle & SQL Server database, Goldengate, Exadata Machine, Oracle Database Appliance administrator with 10+years experience. I have OCA, OCP, OCE RAC Expert Certificates I have worked 100+ Banking, Insurance, Finance, Telco and etc. clients as a Consultant, Insource or Outsource. I have done 200+ Operations in this clients such as Exadata Installation & PoC & Migration & Upgrade, Oracle & SQL Server Database Upgrade, Oracle RAC Installation, SQL Server AlwaysOn Installation, Database Migration, Disaster Recovery, Backup Restore, Performance Tuning, Periodic Healthchecks. I have done 2000+ Table replication with Goldengate or SQL Server Replication tool for DWH Databases in many clients. If you need Oracle DBA, SQL Server DBA, APPS DBA,  Exadata, Goldengate, EBS Consultancy and Training you can send my email adress mehmetsalih.deveci@outlook.com. -                                                                                                                                                                                                                                                 - Oracle DBA, SQL Server DBA, APPS DBA,  Exadata, Goldengate, EBS ve linux Danışmanlık ve Eğitim için  mehmetsalih.deveci@outlook.com a mail atabilirsiniz.