def gaussian_filter_2d_variable_sigma(input, sigmas, window_radius=None, border_mode='zero' ): warnings.warn("gaussian_filter_2d_variable_sigma takes forever to compile.") def filter_sigma(idx, kernel): dimpattern_w = ('x', 'x', 'x', 0) dimpattern_h = ('x', 'x', 0, 'x') filter_w = kernel.dimshuffle(dimpattern_w) blur_w = T.nnet.conv2d( padded_input[idx:idx+1], filter_w, border_mode=_get_chained_w_h_conv_border(conv_border, 'w'), filter_shape=[1, 1, 1, None]) filter_h = kernel.dimshuffle(dimpattern_h) return T.nnet.conv2d( blur_w, filter_h, border_mode=_get_chained_w_h_conv_border(conv_border, 'h'), filter_shape=[1, 1, None, 1]) ndim = 4 assert input.ndim == ndim, \ "there must be {} dimensions, got {}".format(ndim, input.ndim) window_radius = gaussian_kernel_default_radius(sigmas, window_radius) padded_input, conv_border = add_border(input, window_radius, border_mode) kernel = gaussian_kernel_1d(sigmas, window_radius) blur, _ = theano.map( filter_sigma, sequences=[T.arange(sigmas.shape[0]), kernel]) return blur.reshape(input.shape)
def gaussian_filter_2d(input, sigma, window_radius=None, border_mode='zero'): bs, ch, h, w = input.shape ndim = 4 assert input.ndim == ndim, \ "there must be {} dimensions, got {}".format(ndim, input.ndim) window_radius = gaussian_kernel_default_radius(sigma, window_radius) input = input.reshape((bs*ch, 1, h, w)) filter_1d = gaussian_kernel_1d(sigma, window_radius) dimpattern_w = ('x', 'x', 0, 1) dimpattern_h = ('x', 'x', 1, 0) filter_w = filter_1d.dimshuffle(dimpattern_w) padded_input, conv_border = add_border(input, window_radius, border_mode) blur_w = T.nnet.conv2d( padded_input, filter_w, border_mode=_get_chained_w_h_conv_border(conv_border, 'w'), filter_shape=[1, 1, 1, None]) filter_h = filter_1d.dimshuffle(dimpattern_h) blured = T.nnet.conv2d( blur_w, filter_h, border_mode=_get_chained_w_h_conv_border(conv_border, 'h'), filter_shape=[1, 1, None, 1]) return blured.reshape((bs, ch, h, w))
def sobel(img, border_mode='zero'): filter = np.array([ [1, 0, -1], [2, 0, -2], [1, 0, -1], ], dtype=floatx()) img, conv_border = add_border(img, border=1, mode=border_mode) kernel_x = theano.shared(filter[np.newaxis, np.newaxis]) kernel_y = theano.shared(np.transpose(filter)[np.newaxis, np.newaxis]) conv_x = T.nnet.conv2d(img, kernel_x, border_mode=conv_border, input_shape=(None, 1, None, None), filter_shape=(1, 1, 3, 3)) conv_y = T.nnet.conv2d(img, kernel_y, border_mode=conv_border, input_shape=(None, 1, None, None), filter_shape=(1, 1, 3, 3)) return conv_x, conv_y