Contour Extraction Using OpenCV

In image processing, the concept called stroke is a closed curve that connects all continuous points that a color or density has. Strokes represent the shapes of objects in an image. Stroke detection is a useful technique for Shape analysis and object detection and recognition. When we do edge detection, we find points where the color density changes significantly, and then we turn those pixels on. However, strokes are abstract collections of points and segments that correspond to the shapes of objects in the image. As a result, we can process strokes in our program, such as counting the number of contours, using them to categorize the shapes of objects, cropping objects from an image (image partitioning), and much more.

Computer Vision

🖇 Contour detection is not the only algorithm for image segmentation, but there are many other algorithms available, such as state-of-the-art semantic segmentation, hough transform, and K-Means segmentation. For better accuracy, all the pipelines we will monitor to successfully detect strokes in an image:

  • Convert image to binary image, it is common practice for the input image to be a binary image (it must be a result of threshold image or edge detection).
  • FindContours( ) by using the OpenCV function.
  • Draw these strokes and show the image on the screen.

Apply Contour on Photoshop

Adobe PS
Before moving on to the encoding of contour extraction, I will first give you an example of Photoshop to give you better acquisitions.
Katmandan kontur çıkarımı
As a first step, to access the window you see above, right-click on any layer in Photoshop’s Layers window and select blending options.
🔎 If the Layers window is not active, you must activate the layers by clicking the Window menu from the top menu. The hotkey for Windows is F7.
It is possible to select the Contour color and opacity you want to create in the image by selecting the Contour tab from the left section. Then, background extraction is made to distinguish the contour extraction that will occur in the image first.
People siluet
After removing the background in the image you see here, I made a selection in yellow tones so that the object is visible in the foreground. After the background is removed, the outer contour will be applied to the image and the detection will be more successful.
People contour

Contour Extraction with Python OpenCV

I use Google Colab and Python programming language as a platform. If there are those who regularly code Python, it is a platform that I can definitely recommend! Come on, let’s start coding step by step.
📌 Let’s import the libraries required for our project as follows.
Gerekli Kütüphanelerin Yüklenmesi
📌 As the second step, we get our image with the imread function.
Görüntünün Alınması
📌 As you know in the world of image processing, our images come in BGR format. The BGR image must first be converted to RGB format and then assigned to the grayscale color channel.
Converting Color Spaces
📌 As the fourth step, a binary threshold operation is performed by specifying a threshold value in the image. To access the mathematics that the binary threshold function runs in the background, you must examine the following formula 👇
Formula
Binary threshold
If you have noticed, the image on which threshold will be applied is selected as a gray level image, not RGB. Please pay attention at this stage. When you follow these steps in order, you will receive the following feedback.
Background
📌In this step, we will use the findContours function to find the contours in the image. The image where the contours will be determined will be the binary image that we have realized the threshold.
Find Contours
📌 We will use drawContours function to draw these contours visually.
Draw Contours
🖇 The parameter cv2.CHAIN_APPROX_SIMPLE in the method removes all unnecessary points and saves memory by compressing the contour.
📌 Now we can print our contour extracted image on the screen.
Imshow contours

In this way, we made our inference. Hope to head to the world of other projects in another article … Stay healthy ✨

REFERENCES

  1. Contour Tracing, http://www.imageprocessingplace.com/downloads_V3/root_downloads/tutorials/contour_tracing_Abeer_George_Ghuneim/intro.html.
  2. Edge Contour Extraction, https://www.cse.unr.edu/~bebis/CS791E/Notes/EdgeContourExtraction.pdf, Pitas, section 5.5, Sonka et al., sections 5.2.4-5.2.5.
  3. https://www.thepythoncode.com/article/contour-detection-opencv-python adresinden alınmıştır.
  4. https://www.subpng.com/png-m7emk6/ adresinden alınmıştır.
  5. OpenCV, https://docs.opencv.org/master/d7/d4d/tutorial_py_thresholding.html.
  6. OpenCV, https://docs.opencv.org/master/d4/d73/tutorial_py_contours_begin.html.

OpenCV Kullanımı ile Kontur Çıkarımı

Görüntü işlemede kontur denilen kavram, bir rengin veya yoğunluğunun sahip olduğu tüm sürekli noktaları birleştiren kapalı bir eğridir. Konturlar bir görüntüde bulunan nesnelerin şekillerini temsil eder. Kontur algılama, şekil analizi ve nesne algılama ve tanıma için yararlı bir tekniktir. Kenar tespiti yaptığımızda, renk yoğunluğunun önemli ölçüde değiştiği noktaları buluruz ve sonra bu pikselleri açarız. Bununla birlikte, konturlar, görüntüdeki nesnelerin şekillerine karşılık gelen soyut nokta ve segment koleksiyonlarıdır. Sonuç olarak, programımızda kontür sayısını saymak, bunları nesnelerin şekillerini kategorize etmek için kullanmak, bir görüntüden nesneleri kırpmak (görüntü bölümleme) ve çok daha fazlası gibi konturları işleyebiliriz.

Computer Vision
🖇 Kontur tespiti, görüntü segmentasyonu için tek algoritma değildir ancak mevcut son teknoloji semantik segmentasyon, hough dönüşümü ve K-Means segmentasyonu gibi başka birçok algoritma vardır. Daha iyi bir doğruluk için, bir görüntüdeki konturları başarılı bir şekilde tespit etmek için izleyeceğimiz tüm ardışık düzenler:

  • Görüntüyü ikili görüntüye dönüştürün, giriş görüntüsünün ikili görüntü olması yaygın bir uygulamadır (eşikli görüntü veya kenar algılamanın bir sonucu olmalıdır).
  • FindContours( ) OpenCV işlevini kullanarak konturları bulma.
  • Bu konturları çizin ve resmi ekrana gösterin.

Photoshop Üzerinde Kontur Uygulama

Adobe PS
Kontur çıkarımının kodlamasına geçmeden önce sizlere daha iyi edinimler kazandırmak için öncelikle Photoshop üzerinde örnek vereceğim.
Katmandan kontur çıkarımı
İlk adım olarak yukarıda gördüğünüz pencereye erişmek için Photoshop üzerinde bulunan Katmanlar penceresindeki herhangi bir katmana sağ tıklayarak karıştırma seçeneklerini seçiniz.
🔎 Katmanlar penceresi aktif değil ise üst menüden Pencere menüsüne tıklayarak katmanları aktif etmelisiniz. Windows için  kısayol tulu F7′ dir.
Sol bölümden Kontur sekmesini seçerek görüntüde oluşturmak istediğiniz kontur rengini ve opaklığını seçmeniz mümkündür. Ardından önce görüntüde oluşacak kontur çıkarımının iyi ayrıtlandırılabilmesi için arka plan çıkarımı yapılmaktadır.
People siluet
Burada gördüğünüz görselde arka plan çıkarıldıktan sonra nesnenin ön planda belirgin olabilmesi için sarı tonlarında bir seçim gerçekleştirdim. Arka plan çıkarıldıktan sonra görüntüde dış kontur uygulanarak tespitin daha başarılı olması sağlanacaktır.
People contour

Python OpenCV ile Kontur Çıkarımı

Platform olarak Google Colab ve Python programlama dilini kullanmaktayım. Düzenli olarak Python kodlayanlar var ise mutlaka tavsiyede bulunabileceğim bir platform! Haydi gelin, adım adım kodlamaya başlayalım.
📌 Projemiz için gerekli olan kütüphaneleri aşağıdaki gibi import ile yükleyelim.
Gerekli Kütüphanelerin Yüklenmesi
📌 İkinci adım olarak görüntümüzü imread fonksiyonu ile elde ediyoruz.
Görüntünün Alınması
📌 Görüntü işleme dünyasında bildiğiniz üzere görsellerimiz BGR formatında gelmektedir. BGR görüntünün ilk olarak RGB formatına dönüştürülmesi ve ardından gri skala renk kanalına atanması gerekmektedir.
Converting Color Spaces
📌 Dördüncü adım olarak görüntüde bir eşik değeri belirtilerek binary threshold (ikili eşikleme) işlemi yapılmaktadır. Binary threshold fonksiyonunun arka planda çalıştırdığı matematiğe erişmek için aşağıdaki formülü incelemelisiniz 👇
Formula
Binary threshold
Dikkat ettiyseniz threshold uygulanacak görüntü RGB değil gri seviye görüntü seçilmiştir. Lütfen bu aşamada dikkat edelim. Bu adımları sırası ile takip ettiğinizde aşağıdaki dönütü alacaksınız.
Background
📌 Bu adımda ise görüntüde yer alan konturların bulunması için findContours fonksiyonunu kullanacağız. Konturların belirleneceği görüntü ise threshold gerçekleştirdiğimiz binary görüntü olacaktır.
Find Contours
📌 Oluşturulan bu konturların görselde çizilmesi için drawContours fonksiyonunu kullanacağız.
Draw Contours
🖇 Metotta yer alan cv2.CHAIN_APPROX_SIMPLE parametresi, tüm gereksiz noktaları kaldırır ve konturu sıkıştırarak hafızadan tasarruf sağlar.
📌 Artık kontur çıkarımı yapılmış görüntümüzü ekrana bastırabiliriz.
Imshow contours

Bu şekilde çıkarımımızı yapmış olduk. Bir başka yazımda başka projelerin dünyasına yönelmek dileğiyle… Sağlıcakla kalın ✨

REFERANSLAR

  1. Contour Tracing, http://www.imageprocessingplace.com/downloads_V3/root_downloads/tutorials/contour_tracing_Abeer_George_Ghuneim/intro.html.
  2. Edge Contour Extraction, https://www.cse.unr.edu/~bebis/CS791E/Notes/EdgeContourExtraction.pdf, Pitas, section 5.5, Sonka et al., sections 5.2.4-5.2.5.
  3. https://www.thepythoncode.com/article/contour-detection-opencv-python adresinden alınmıştır.
  4. https://www.subpng.com/png-m7emk6/ adresinden alınmıştır.
  5. OpenCV, https://docs.opencv.org/master/d7/d4d/tutorial_py_thresholding.html.
  6. OpenCV, https://docs.opencv.org/master/d4/d73/tutorial_py_contours_begin.html.