OpenCV Piksel İşlemleri

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.