Opencv C++ Ders 30 (Piksel İşlemleri)

talhakoc 2 Temmuz 2015OpenCv

Görüntüler piksellerden oluştuğu için görüntü işleme de en temelinde piksel işlemlerine dayanmaktadır. Bir resmin piksel değerleri değiştirilerek resmin tamamı veya bir kısmı değiştirilebilir. Piksel işlemleri daha çok siyah beyaz resimlerde yapılmaktadır. Piksel işlemleriyle bir resmin bir kısmı istenildiği gibi değiştirilebilir.

Opencv C++ kullanarak çeşitli piksel okuma ve değiştirme yöntemleri bulunmaktadır. Tek kanallı, gri veya siyah beyaz resimler ile üç kanallı renkli resimlerde piksel değerlerinin okunması ve değiştirilmesi işlemleri farklılık göstermektedir. Bunun için piksel işlemlerinde ilk dikkat edilmesi gereken konu resmin tipidir. Üç kanallı renkli bir resimde tek kanallıdaki gibi bir işlem ya da bunun tersini uygularsanız hata alırsınız. imread() fonksiyonu ile okunan resimlerin tipi belirtilmediği taktirde üç kanallı olarak alındığı göz önünde bulundurulmalıdır. Aşağıda tanımlanmış renkli, üç kanallı bir resmin piksel değerlerinin değiştirilmesi kodu gösterilmiştir.

for (int i = 0; i < resim.rows; i++)
{
for (int j = 0; j <resim.cols; j++)
{
resim.data[resim.channels()*(resim.cols*(i) +
(j))+0]=255;
resim.data[resim.channels()*(resim.cols*(i) +
(j))+1]=255;
resim.data[resim.channels()*(resim.cols*(i) +
(j))+2]=255;
}
}

Yukarıdaki kodda daha öncesinden oluşturulmuş bir “resim” değişkeninin bütün piksellerinin “RGB” değerlerine “255” değerleri verilerek beyaz bir resim oluşturulmuştur. “resim.rows” ifadesi “resim” değişkeninin satır sayısını, “resim.cols” ise sütün sayısını. göstermektedir. 

resim.data[resim.channels()*(resim.cols*(i) +
(j))+0]=255;

Yukarıdaki kod ise resmin i. satır ve j. sütununda bulunan piksel değerinin birinci kanalına “255” değeri atama işlemi yapar. C++ da matris indisleri “0” dan başladığı için birinci değer olarak “]” işaretinin yanında “+0” değeri verilmiştir. alt satırlarda verilen “+1” ve “+2” değerleri ise 2. ve 3. kanallarını belirtir. Buradan değerleri değiştirerek istenilen renkler oluşturulabilir. 1. kanal mavi, 2. kanal yeşil ve 3. kanal kırmızı renk kanallarını göstermektedir.

imread() fonksiyonunun eklenen resmi üç kanallı olarak aldığı söylenmişti. Bu fonksiyon ikinci parametre olarak resmin tipi girilebilir. örneğin CV_8UC1 parametresi tek kanallı “8” bitlik bir resim olacaktır. Ancak üç kanallı olarak yüklenilen resim aşağıdaki kod ile gri renk uzayına çevrilebilir.

cvtColor(renkli,gri,CV_RGB2GRAY); 

Yukarıdaki kod renkli isimli üç kanallı bir resim değişkenini gri renk uzayına çevirerek “gri” isimli değişkene atar. Aşağıda ise gri renk uzayında bir resimde piksel işlemi gösterilmiştir.

for (int i = 0; i < gri.rows; i++)
{
for (int j = 0; j <gri.cols; j++)
{
gri.at<uchar>(i,j)=255;
}
}

Burada da resim satır ve sütunlar ile piksel piksel incelenerek bütün piksel değerleri “255” yani beyaz yapılmaktadır. Bu değer düşürülerek gri tonları da oluşturulabilir. 0 ‘a ulaştığında ise siyah renk görünecektir. Bu şekilde istenilen pikseller değiştirilebilir ya da kontrol edilebilir.

Opencv de siyah-beyaz resimler giri tonlamalı resimlerle aynıdır. Siyah-beyaz yapmak için inRange() fonksiyonu kullanılır ve bir eşik değeri kullanarak eşik değerinin altı “0” üstü ise “255” değerlerine atanır.

inRange(gri,40,255,siyah);

Yukarıda gri isimli gri renk uzayında bir resim girerek piksel değeri “40” ın altında olanlara “0” üstünde olanlara “255” değeri verilerek siyah beyaz resim oluşturulmuştur ve “siyah” isimli değişkene atanmıştır. Görüldüğü üzere siyah-beyaz resimler de gri resimler gibidir. Buna göre işlemler yapılabilir.

 

3 thoughts on “Opencv C++ Ders 30 (Piksel İşlemleri)

Bir cevap yazın

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

WordPress spam blocked by CleanTalk.

Arama

Twitterda

© 2014 - Talha Koç. All Rights Reserved. Powered by Wordpress and Design by We Create Web Designs