OpenCV Arka Plan Temizleme
OpenCV ile arka plan temizleme işlemini absdiff() metoduile yapılmaktadır. Absdiff metodu parametre olarak verilen iki mat nesnesi yani matris arasında çıkarma işlemi yapar bu çıkarma işlemi sonucunda değişen kısımlar (hareketli kısımlar) sonuç olarak gösterilir ve çıkarma işlemi sonucu mutlak değer olarak döndürülür.
Arka plan temizleme, genellikle nesnelerin belirlenmesi, sayılması veya karşılaştırılması gibi işlemler için tercih edilir. Örneğin kapı girişlerine yerleştirilen bir kamera ile içeri giriş yapan kişi sayısı hesaplanabilir. Kamera yerleştirildikten sonra bir görüntü alınır ve arka plan olarak saklanır, daha sonraki her görüntü ile arka plan arasında bir çıkarma işlemi yapılır, çıkarma işlemi sonucunda oluşan görüntüye morfolojik operatörler ve thresholding uygulanarak fark sonucunda görüntü üzerindeki nesne belirlenir ve sayılır. Bu sayede giriş yapan kişi sayısı elde edilebilir. Bu algoritma kullanım alanı için basit bir örnek teşkil etmektedir.
Absdiff metodu Core içerisinde yer almaktadır.
Core.absdiff(src1, src2, dst);
Parametre olarak iki adet kaynak görüntüleri barındıran mat nesneleri ve işlem sonucu için hedef mat nesnesi almaktadır. src1 nesnesi karşılaştırma için kullanılacak anlık görüntü src2 ise arka planı temsil etmektedir. dst nesnesi ise işlem sonucunu barındıracaktır. Aşağıdaki örnekte parametre olarak verilen 2 görüntüye çıkartma işlemi uygulanacak ve sonuç yeni bir görüntü olarak yazılacaktır.
importorg.opencv.core.Core; importorg.opencv.core.Mat; importorg.opencv.imgcodecs.Imgcodecs; importorg.opencv.imgproc.Imgproc; publicclass ArkaplanTemizleme { publicstaticvoid main(String[] args) { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); Mat kaynakMatris = Imgcodecs.imread("/home/mesutpiskin/Goruntu1.jpg"); Mat kaynakMatrisGray = new Mat(); // Rgb renk uzayından gri renk uzayına çevirme Imgproc.cvtColor(kaynakMatris, kaynakMatrisGray, Imgproc.COLOR_RGB2GRAY); Mat hedefMatris = Imgcodecs.imread("/home/mesutpiskin/ Goruntu2.jpg"); Mat hedefMatrisGray = new Mat(); // Rgb renk uzayından gri renk uzayına çevirme Imgproc.cvtColor(hedefMatris, hedefMatrisGray, Imgproc.COLOR_RGB2GRAY); // Arka plan temi̇zlendi̇kten sonraki̇ veri̇ Mat islemSonucu = new Mat(); Core.absdiff(hedefMatrisGray, kaynakMatrisGray, islemSonucu); Imgcodecs.imwrite("/home/mesutpiskin/yeni.jpg", islemSonucu); } }
Soldaki görüntüyü arka plan olarak verdik ve çıkarma işlemi için ise sağdaki görüntüyü verdik, sonuç olarak ise ikinci resimde yer alan ve görüntüye sonradan dâhil olan arkadaki koli kaldı. Bu fonksiyon sayesinde görüntü üzerindeki değişiklikleri tespit ettik.
Çıktı olarak yakaladığımız görüntüyü daha net bir hale getirmek için threshold işlemi uygulayalım. Kenar çizgilerini daha net belirlemek ve görüntü üzerinde ki gürültüleri temizlemek için resim filtreleri uygulanabilir.
Mat thresholdCikti=new Mat(); Imgproc.threshold(yeni, thresholdCikti, 2, 255, Imgproc.THRESH_BINARY);
Yukarıdaki gibi thresh binary uyguladığımızda daha net bir sonuç elde ettik.