[Ana Link](https://www.geeksforgeeks.org/python/python-opencv-morphological-operations/)

Aşındırma (Erosion) ve Genişletme (Dilation) olarak iki temel yöntem ve bunlara ek olarak MorphologyEx içerisinde farklı bayraklarla bu iki temel yöntemin matematiksel karışımları vardır. Bu işlemler bir kernel ile yapılır ve bu kernel np ile tanımlanabilir (genellikle np.ones()) veya cv2.getStructeredElement fonksiyonuyla yapılabilir [[CV2 Kernel Oluşturma (getStructeredElement)]] .

!!! İkili görüntüler üzerinde yapılır. Yani genelde bir thresholing işleminden sonra gerçekleştirilir.

Yöntem olarak konvolüsyon işleminde gibi kernel gezdirilir ve merkezdeki pikselin değerini hesaplamak için kernelin taradığı alanda hedef değerden bir tane olup olmadığına  bakılır. Kernel genelde np.ones ile temsil edilse de buradaki 1'ler hesaplamaya dahil edilecek maskelemeyi işaret eder. Yani istenen duruma göre 0-1 ikili değerler içeren kerneller'de kullanılabilir.

```python
  img = cv2.imread(r"Downloads\test (2).png", 0) # Load grayscale image
  bin = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]  # Binarize
  
  k = np.ones((5, 5), np.uint8)  # Define 5x5 kernel
  inv = cv2.bitwise_not(bin)           
```

### Erosion
![Geek Link](https://media.geeksforgeeks.org/wp-content/uploads/20220302171319/0203221.png)
```python
out = cv2.erode(inv, k, 1)     
```
Aynı zamanda gürültü gidermek için de kullanılır.
Prensip: Kernel Konvolüsyon işleminde olduğu gibi görüntü boyunca gezdirilir. Eğer kernel içerisinde bir 0 değeri varsa kernel pikseli (yani ortadaki) '0' kabul edilir yoksa 255 kabul edilir (ikili görüntüler için). Yani kernelle taranan alanda bir tane küçük olması o kernel pikselinin değerini küçük yapar.

### Dilation
![Geek Link](https://media.geeksforgeeks.org/wp-content/uploads/20220302171735/0203222.png)
```python
  out = cv2.dilate(inv, k, 1)
```

Genellikle erozyondan sonra kullanılır. Erozyon gürültüyü giderir ama nesneleri de daraltır. Bu işlem sonrası gürültü kalmadıgı için sadece nesneler daha belirgin hale gelmiş olur.

Prensip: Erozyonun tersine taranan kernel'de bir tane bile 255 değeri varsa o kernel pixel'i 255'e eşitlenir. Yani kernelin taradıgı alanda bir tane bile 255 olması onu 255'e ittirir.

### Opening
![Geek Link](https://media.geeksforgeeks.org/wp-content/uploads/20220302190005/open.png)
![OpenCV Link](https://docs.opencv.org/4.x/opening.png)

```python
  opened = cv2.morphologyEx(bin, cv2.MORPH_OPEN, k)
```

### Closing
![Geek Link](https://media.geeksforgeeks.org/wp-content/uploads/20220302190059/close.png)
![OpenCV Link](https://docs.opencv.org/4.x/closing.png)

```python
  closed = cv2.morphologyEx(bin, cv2.MORPH_CLOSE, k)  # Apply closing
```

### Morphological Gradient
![Geek Link](https://media.geeksforgeeks.org/wp-content/uploads/20220302180501/0203226.png)
![OpenCV Link](https://docs.opencv.org/4.x/gradient.png)

```python
out = cv2.morphologyEx(inv, cv2.MORPH_GRADIENT, k) 
```

### Top hat
![Geek Link](https://media.geeksforgeeks.org/wp-content/uploads/20220302183949/02032271.png)
![OpenCV Link](https://docs.opencv.org/4.x/tophat.png)

```python
top = cv2.morphologyEx(bin, cv2.MORPH_TOPHAT, k)
```

### Black hat
![Geek Link](https://media.geeksforgeeks.org/wp-content/uploads/20220302184431/0203228.png)
![OpenCV Link](https://docs.opencv.org/4.x/blackhat.png)
```python
bh = cv2.morphologyEx(inv, cv2.MORPH_BLACKHAT, k)
```