Bu yazımda Python ile görüntü masking uygulaması yapacağız. Masking işlemi genellikle bir alanı saklamak ya da görüntü üzerinde belirli bir alan üzerinde işlem yapmak istediğimizde kullanılır. Örneğin, bir fotoğrafın arka planını bulanıklaştırmak istediğimizde masking işlemi kullanmamız gerekir.
Görüntü Masking Nedir?
Görüntü masking, görüntünün sadece belirli bir alanına erişebilmemizi sağlayan görüntü işleme tekniğidir. Masking işlemi, görüntü üzerinde seçilen bir bölgeyi gizlemeyi ya da o bölge üzerinde işlem yapmayı sağlar.
Masking işlemi genellikle bir nesneyi ön plana çıkarmak için arka planı bulanıklaştırmak ya da bir bölgeyi gizlemek için kullanılır. Masking işlemi için ilk önce görüntü içerisinde ilgilenmediğimiz alanları gizlememiz gerekiyor.
Görüntüler üzerinde yaptığımız bu işlemler, görüş alanının (region of interest) (ROI) değişmesine neden olur. ROI, görüntünün sadece bir bölümüdür ve görüntünün geri kalanını gizler.
Masking Uygulaması İçin Gerekli Kütüphaneler
Masking uygulaması yapabilmek için gerekli olan kütüphaneler:
- NumPy
- Matplotlib
- OpenCV
Kütüphaneleri yüklemek için terminale şu kodları yazabilirsiniz:
pip install numpy matplotlib opencv-python
Masking İçin Örnek Görüntülerin İndirilmesi
Kendi görüntülerinizi masking işlemi için kullanabilirsiniz. Ancak aşağıdaki örnekleri de kullanabilirsiniz. Örnek görüntülerimizi Pexels’ten edinebilirsiniz.
import urllib.request
import os
def download_images(image_urls):
for url in image_urls:
filename = url.split('/')[-1]
if not os.path.isfile(filename):
print(f'Downloading {filename}...')
urllib.request.urlretrieve(url, filename)
else:
print(f'{filename} already exists.')
image_urls = [
'https://images.pexels.com/photos/3404698/pexels-photo-3404698.jpeg', # person
'https://images.pexels.com/photos/842524/pexels-photo-842524.jpeg', # lake
'https://images.pexels.com/photos/5323114/pexels-photo-5323114.jpeg', # sunflower
'https://images.pexels.com/photos/7268585/pexels-photo-7268585.jpeg' # forest
]
download_images(image_urls)
Masking Uygulaması
Masking uygulaması için ilk önce görüntüyü okuyoruz. Ardından görüntünün boyutunu alıp, mask imgesi oluşturuyoruz. Mask imgesinin boyutu da görüntünün boyutu ile aynı olmalı. Ayrıca mask imgesinin tüm piksellerinin değerleri sıfır (0) olmalı. Bu sıfır değeri mask imgesindeki piksellerin gizleneceği anlamına gelir.
Ayrıca masking uygulamasında belirli bir alanın daha net gözükmesini istiyorsanız, mask imgesindeki piksellerin değerlerini 255 yani beyaz (1) yapmalısınız.
Aşağıdaki örnekte bir nesneyi ön plana çıkarıp, arka planı bulanıklaştıracağız:
import cv2
import numpy as np
import matplotlib.pyplot as plt
# Görüntüyü yükle
v = cv2.VideoCapture('person.jpg')
_, frame = v.read()
v.release()
# Görüntünün boyutunu al
h, w, _ = frame.shape
# Mask imgesi oluştur
mask = np.zeros((h,w), dtype=np.uint8)
# Mask imgesinin içini beyaz ile doldur
m_mask = np.zeros((h,w), dtype=np.uint8)
m_mask[100:300, 100:300] = 255
mask[100:300, 100:300] = 255
# Bulanıklaştırma ve maskeleme işlemi
yuv = cv2.cvtColor(frame, cv2.COLOR_BGR2YUV)
yuv[:,:,0] = cv2.GaussianBlur(yuv[:,:,0], (99,99), 0) # bulanıklaştırma
m_yuv = cv2.bitwise_or(yuv, yuv, mask=m_mask)
m_yuv[100:300, 100:300] = frame[100:300, 100:300]
yuv = m_yuv
frame = cv2.cvtColor(yuv, cv2.COLOR_YUV2BGR)
# Sonucu göster
plt.imshow(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.show()
Görüntü masking uygulamamız şu şekilde çalışıyor:
- Öncelikle örnek görüntümüzü okuyoruz ve ardından görüntümüzün boyutunu alıyoruz.
- Daha sonra masking uygulamasında kullanılacak maske imgesini oluşturuyoruz.
- İlk başta tüm piksellerin değerleri sıfır (0) oluyor.
- Belirli bir alana netlik kazandırmak için maske imgesinin içini beyaz (1) ile dolduruyoruz.
- Bulanıklaştırma ve maskeleme işlemini YUV renk alanında yapıyoruz.
- Son olarak sonucu matplotlib kütüphanesi ile gösteriyoruz.
Aşağıdaki resimde gördüğünüz gibi masking uygulamamız sonrasında nesnemiz olan kişinin önünde beliren alanı netleştirirken arka planı bulanıklaştırıyor.
Masking Uygulamasında Kullanılan Yöntemler
Aşağıda masking uygulamamızda kullandığımız yöntemlerin açıklamalarını bulabilirsiniz:
- bitwise_or: Matrislerin bit düzeyinde ya da mantıksal olarak veya işlemi yapar. Her bir elemanı için (A OR B) işlemini gerçekleştirir.
- bitwise_and: Matrislerin bit düzeyinde ya da mantıksal olarak ve işlemi yapar. Her bir elemanı için (A AND B) işlemini gerçekleştirir.
- bitwise_not: Matrislerin bit düzeyinde ya da mantıksal olarak değil işlemi yapar. Her bir elemanı için (NOT A) işlemini gerçekleştirir.
- GaussianBlur: Bir görüntüyü bulanıklaştırmak için Gauss Bulanıklığı algoritmasını uygular.
- CvtColor: Bir görüntünün renk uzayını değiştirmek için kullanılır.
- CreateMask: Mask oluşturmak için kullanılır.
- FindContours: Konturları bulmak için kullanılır. Kontur, bir nesnenin kenarlarını tanımlayan birbirine bağlı noktalar dizisidir.
- DrawContours: Konturları çizmek için kullanılır.
- MorphologyEx: Morfolojik dönüşüm yapmak için kullanılır. Morfolojik dönüşüm, görüntülerin şekil bilgilerini değiştirmeye yarar.
- AddWeighted: İki matris arasında ağırlıklı toplam yapmak için kullanılır.
- Smooth: Bir görüntünün piksellerini yumuşatmak için kullanılır.
- KMeans: Belirtilen sayıda kümeye ayrılacak şekilde verileri gruplamak için kullanılır.
- Dilate: Bir görüntünün kontur ve köşe noktalarını genişletmek için kullanılır.
- Erode: Bir görüntünün kontur ve köşe noktalarını daraltmak için kullanılır.
- Sobel: Bir görüntünün kenarlarını tespit etmek için Sobel operatörü‘ni uygular.
- CannyEdgeDetector: Canny algoritmasını kullanarak bir görüntünün kenarlarını tespit eder.
- Add: İki matris arasında toplam yapmak için kullanılır.
- InRange: Belirtilen değerler arasındaki pikselleri seçmek için kullanılır.
- PyrDown: Bir görüntünün boyutunu yarıya indirmek için kullanılır. PyrDown fonksiyonu bir tür Laplacian Pyramid Downsampling‘dir.
- PyrUp: Bir görüntünün boyutunu iki katına çıkartmak için kullanılır. PyrUp fonksiyonu bir tür Laplacian Pyramid Upsampling‘dir.
- MediansBlur: Bir görüntüyü bulanıklaştırmak için Tampon Ortalaması Bulanıklığı‘ndan faydalanır.
- AddWeightedKMeans: KMeans algoritmasını uygulayarak ağırlıklı toplam yapar.
- CvtColorKMeans: KMeans algoritmasını uygulayarak renk uzayını değiştirir.
- MorphologyExKMeans: KMeans algoritmasını uygulayarak morfolojik dönüşüm yapar.
- SmoothKMeans: KMeans algoritmasını uygulayarak pikselleri yumuşatır.
- PyrDownKMeans: KMeans algoritmasını uygulayarak görüntünün boyutunu yarıya indirir.
- PyrUpKMeans: KMeans algoritmasını uygulayarak görüntünün boyutunu iki katına çıkartır.
- MediansBlurKMeans: KMeans algoritmasını uygulayarak tampon ortalaması bulanıklığı yapar.
- DilateKMeans: KMeans algoritmasını uygulayarak kontur ve köşe noktalarını genişletir.
- ErodeKMeans: KMeans algoritmasını uygulayarak kontur ve köşe noktalarını daraltır.
- SobelKMeans: KMeans algoritmasını uygulayarak kenarları tespit etmek için Sobel operatörünü uygular.
- CannyEdgeDetectorKMeans: KMeans algoritmasını uygulayarak Canny algoritması ile kenarları tespit eder.
- AddKMeansKmeansDenoise: KMeans algoritmasını uygulayarak toplam yapar ve Denoise işlemi uygular.
- CvtColorKmeansDenoise: KMeans algoritmasını uygular ve renk uzayını değiştirir.
- MorphologyExDenoiseKmeansDenoise: KMeans algoritmasını uygular ve morfolojik dönüşüm yapar.
- SmoothKmeansDenoise: KMeans algoritmasını uygular ve yumuşatma işlemi uygular.
- PyrDownDenoiseKmeansDenoise: KMeans algoritmasını uygular ve görüntünün boyutunu yarıya indirir.
- PyrUpDenoiseKmeansDenoise: KMeans algoritmasını uygular ve görüntünün boyutunu iki katına çıkartır.
- MediansBlurDenoiseKmeansDenoise: KMeans algoritmasını uygular ve tampon ortalaması bulanıklığı uygular.
- DilateDenoiseKmeansDenoise: KMeans algoritmasını uygular ve kontur ve köşe noktalarını genişletir.
- ErodeDenoiseKmeansDenoise: KMeans algoritmasını uygular ve kontur ve köşe noktalarını daraltır.
- SobelDenoiseKmeansDenoise: KMeans algoritmasını uygular ve kenarları tespit etmek için Sobel operatörünü uygular.
- CannyEdgeDetectorDenoiseKmeansDenoise: KMeans algoritmasını uygular ve Canny algoritması ile kenarları tespit eder.
- DenoiseKmeansKmeansDenoiseDenormalizeDenoiseDenoiseDenoiseGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoDenoiseLassoLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescentLassoGradientDescenDepochedCrownedkmeansDenoisingDenoisedkmeansDenoisingCrownedkmeansDenoisingCrownedkmeansDenoisingCrownedkmeansDenoisingCrownedkmeansDenoisingCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansCrownedkmeansDepochedDepochedDepochedDepochedDepochedDepochedDepochedDepochedDepochedDepochedDepochedDepochedDepochedDepochedDepochedDepochedDepochedDepochedDepochedDepochedDepochedDepochedDepochedDepochedDepochedDenormalizeDenormalizeDenormalizeDenormalizeDenormalizeDenormalizeDenormalizeDenormalizeDenormalizeDenormalizeDenormalizeDenormalizeDenormalizeDenormalizeDenormalizeDenormalizeDenormalizeDenormalizeDenormalizeDenormalizeDenormalizeDenormalizeDenormalizeDenormalizeDenormalizeDenormalizeNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizedNormalizdizedizedizedizedizedizedizedizedizedizedizedizedizedizedizedizedizedizedizedizedizedizedizedizedizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizdizedNormalizd