Можно ли использовать код для дилатации при эрозии для получения необходимого результата? - PullRequest
0 голосов
/ 29 мая 2020

Выходные данные для применения эрозии с использованием встроенной функции cv2.erode() не совпадают с выходными данными без встроенной функции OpenCV для эрозии. И мой вопрос: «Является ли код для расширения с нуля (означает без использования cv2.dilate()) одинаковым для эрозии?»

#Code for Erosion from scratch :

import cv2
import numpy as np
from dataPath import DATA_PATH
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['figure.figsize'] = (6.0, 6.0)
matplotlib.rcParams['image.cmap'] = 'gray'

im = np.zeros((10,10),dtype='uint8')

im[0,1] = 1
im[-1,0]= 1
im[-2,-1]=1
im[2,2] = 1
im[5:8,5:8] = 1

element = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))

ksize = element.shape[0]
height,width = im.shape[:2]

border = ksize//2
# Create a padded image with zeros padding
#paddedIm = np.zeros((height + border*2, width + border*2))
paddedIm = cv2.copyMakeBorder(im, border, border, border, border, cv2.BORDER_CONSTANT, value = 1)
for h_i in range(border, height+border):
    for w_i in range(border,width+border):
        # When you find a white pixel
        if im[h_i-border,w_i-border]:
            print("White Pixel Found @ {},{}".format(h_i,w_i))

            paddedIm[ h_i - border : (h_i + border)+1, w_i - border : (w_i + border)+1] = \
                cv2.bitwise_and(paddedIm[ h_i - border : (h_i + border)+1, w_i - border : (w_i + border)+1],element)

            # Print the intermediate result
            print(paddedIm)
            plt.imshow(paddedIm);plt.show()

erodedImage = paddedIm[border:border+height,border:border+width]
plt.imshow(erodedImage)

Входное изображение: Изображение для эрозии

Выходное изображение с использованием cv2.erode() (Ожидаемое выходное изображение): Окончательное изображение с использованием cv2.erode

Выходное изображение без использования встроенной функции эрозии (Выходное изображение, которое я получаю): Выходное изображение без использования cv2.erode

1 Ответ

0 голосов
/ 08 июня 2020

Существуют разные способы реализации двоичного расширения и эрозии.

Код, который у вас есть для расширения, использует метод «штамповки», при котором для каждого пикселя переднего плана вы штампуете элемент структурирования (т.е. на передний план каждого пикселя, покрытого элементом структурирования с центром в данном пикселе).

Аналогом эрозии этому алгоритму является штамповка элемента структурирования для каждого пикселя фона: для каждого фона пикселя, установить на фон каждый пиксель, покрытый элементом структурирования с центром в данном пикселе.

Таким образом, if im[h_i-border,w_i-border]: становится if not im[h_i-border,w_i-border]:, а paddedIm[...] = cv2.bitwise_or(paddedIm[...],element) становится paddedIm[...] = cv2.bitwise_and(paddedIm[...],~element). (Вы можете предварительно вычислить ~element для повышения эффективности.)

...