Маскировка изображения в градациях серого с помощью 2D гауссовой маски завершается неудачно - PullRequest
0 голосов
/ 11 июня 2018

Это кажется довольно простым, но я не получаю желаемого результата.Может кто-нибудь, пожалуйста, объясните мне, почему?У меня есть код ниже, чтобы сгенерировать 2D гауссовскую маску со средним значением в центре и сигмой как 1/3 высоты изображения для изображения 32x32 пикселей следующим образом:

def gauss2D(image):
    x,y = image.shape[:2]
    shape = (x,y)
    sigma = 1/3 * min(x,y)
    m,n = [(ss-1.)/2. for ss in shape]
    y,x = np.ogrid[-m:m+1,-n:n+1]
    h = np.exp( -(x*x + y*y) / (2.*sigma*sigma) )
    h[ h < np.finfo(h.dtype).eps*h.max() ] = 0
    h = h / h.max() 
    return h

Ниже приведено маскирующее изображениеЯ хочу использовать:

enter image description here

Код, который я использую для маскировки изображения, выглядит следующим образом:

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
msk = gauss2D(gray)
masked_data = gray * msk

И полученныйизображение таково:

enter image description here

Пустое белое изображение, иногда несколько углов в углах просвечивают для некоторых разных изображений.

Я также пытался поразрядно И применить маску, но продолжаю получать эту ошибку, которую не могу исправить:

res = cv2.bitwise_and(gray, gray, mask = msk)

cv2.error: OpenCV (3.4.1)/Users/travis/build/skvark/opencv-python/opencv/modules/core/src/arithm.cpp:241: ошибка: (-215) (mtype == 0 || mtype == 1) && _mask.sameSize (* psrc1) в функции binary_op

1 Ответ

0 голосов
/ 11 июня 2018

Попробуйте, у меня все работает.

import numpy as np
import scipy.stats as st

def gkern(kernlen=21, nsig=3):

"""Returns a 2D Gaussian kernel array."""

interval = (2*nsig+1.)/(kernlen)
x = np.linspace(-nsig-interval/2., nsig+interval/2., kernlen+1)
kern1d = np.diff(st.norm.cdf(x))
kernel_raw = np.sqrt(np.outer(kern1d, kern1d))
kernel = kernel_raw/kernel_raw.sum()
return kernel

Ввод:

import matplotlib.pyplot as plt
plt.imshow(gkern(21), interpolation='none')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...