OpenCV Piksel İşlemleri
Piksel kavramını daha önce açıklamıştık, pikseller mat nesnesi içerisindeki dizi elemanlarına karşılık gelmektedir. Bir görüntü üzerinde işlem yapmak istediğimizde dizideki elemanları kullanmamız gerekmektedir. OpenCV içerisinde yer alan birçok metot piksel işlemlerini kendisi yapmaktadır. Örneğin bir görüntüyü kopyalamak istediğimizde copy metodunu kullanabiliriz fakat bu metotların nasıl çalıştığını anlamak için veya kendi algoritmanızı geliştirmek zorunda kaldığınızda bu bilgiler işinize yarayacaktır. Basit bir uygulama yazalım ve bu uygulama kameradan okunan görüntüyü mat nesnesi içerisinde tutalım ve bu nesneyi bir başka mat nesnesi içerisine kopyalayarak dosya sistemine kaydedelim. Bu örnek ile bir piksele nasıl ulaşabileceğimizi de öğrenmiş olacağız.
ÖN BİLGİ: Her görüntü renk uzayına göre çeşitli formatlarda, dijital olarak dizi şeklinde tutulur. Her piksel bir dizi elamanıdır ve görüntü üzerinde yapılan her işlem için dizi elemanları arasında dönülür ve istenilen işlem piksel bazında gerçekleştirilir. Görüntü işlemenin temelinde bu vardır.
public static void main(String[] args) { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); Mat imageArray = new Mat(); VideoCapture videoDevice = new VideoCapture(); videoDevice.open(0); if (videoDevice.isOpened()) { videoDevice.read(imageArray); videoDevice.release(); } else { System.out.println("Video aygıtına bağlanılamadı."); return; } //Okunan görüntüyü kopyalamak için yeni bir mat nesnesi Mat newimageArray=new Mat(); /* * Yeni nesnenin satır ve sutun sayısını alınan görüntünün satır sutun sayısına eşitliyoruz * create metodu ile oluşturakacaj nat nesnesinin satır ve sütünunu veriyoruz. */ newimageArray.create(imageArray.rows(), imageArray.cols(), CvType.CV_8UC1); //Döngü ile alınan görüntü dizisinin tüm elemanları arasında dönüyoruz for(int i=0; i<imageArray.rows();i++) { for(int j=0;j<imageArray.cols();j++) { /* put ile verilen indise yani piksele değer atanır * get ile verilen indisdeki piksel değeri okunur * / newimageArray.put(i, j, imageArray.get(i, j)); } } Imgcodecs.imwrite("KopyaGoruntu.jpg", newimageArray); System.out.println("Görüntü dosya sistemine yazıldı."); }
Bir piksele yani dizi elemanına erişmek için get() metodu, belirli indisteki bir piksele değer yazmak için ise set() metodu kullanılır.
Doğrudan hedef pikselin RGB değerlerini bu şekilde alabilir veya değiştirebiliriz. Unutmamanız gerek bir nokta ise OpenCV de RGB kodları BGR olarak tersen kullanılmaktadır, yani 255 255 0 sarı değerini atamak için 0 255 255 şeklinde tanımlamalıyız, aynı şekilde rgb kodunu çağırdığımızdada 0 255 255 olarak gelecektir.
double[] rgb = matNesnesi.get(300, 200); //Renk kodları artık bu dizi içerisinde tutulmaktadır rgb[0] rgb[1] rgb[2] //255 255 0 RGB kodunu bu 222 333 pikseline atar matNesnesi.put(222, 333, new double[]{255, 255, 0});
RGB yerine farklı bir renk uzayı kullanılmışsa get metodu o renk uzayının renklerini döndürür. Örneğin siyah beyaz renk uzayına sahip bir görüntü ise, get metodu sonucunda 2 elemanlı bir double dizi oluşacaktır.