Почему мое размытие по Гауссу не выглядит так же, как GaussianBlur в OpenCV?

Я написал код фильтра Гаусса, но он не похож на GaussianBlur OpenCV с теми же параметрами:

#!/usr/bin/env python3

import numpy as np
import math
import cv2


def get_raw_data(image_dims, rescale_factor=5):
    img = np.random.rand(
        image_dims[0] // rescale_factor, image_dims[1] // rescale_factor, 1)
    return cv2.resize(img, (0, 0),
                      fx=rescale_factor, fy=rescale_factor,
                      interpolation=cv2.INTER_NEAREST)


def psf(diameter):
    radius = diameter / 2
    kernel = np.zeros((diameter, diameter, 1), dtype="float")
    for i in range(-diameter // 2, diameter // 2 + 1):
        for j in range(-diameter // 2, diameter // 2 + 1):
            new_val = normal_pdf(i, 0, radius) * \
                normal_pdf(j, 0, radius)
            kernel[i + diameter // 2, j + diameter // 2] = new_val
    return kernel


def normal_pdf(x, m, s):
    inv_sqrt_2pi = 0.3989422804014327
    a = (x - m) / s
    return inv_sqrt_2pi / s * math.exp(-0.5 * a * a)


def main():
    print(psf(5))
    raw_data = get_raw_data((50, 100))
    blurred = cv2.filter2D(raw_data, -1, psf(5))
    cv2.imshow("raw", cv2.resize(raw_data,
                                 (1800, 900),
                                 interpolation=cv2.INTER_NEAREST))
    cv2.waitKey()
    cv2.imshow("blurred", cv2.resize(blurred,
                                     (1800, 900),
                                     interpolation=cv2.INTER_NEAREST))
    cv2.waitKey()
    blurred = cv2.GaussianBlur(raw_data, (5, 5), 0, 0)
    cv2.imshow("blurred", cv2.resize(blurred,
                                     (1800, 900),
                                     interpolation=cv2.INTER_NEAREST))
    cv2.waitKey()

if __name__ == '__main__':
    main()

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

РЕДАКТИРОВАТЬ: замена blurred = cv2.GaussianBlur(raw_data, (5, 5), 0, 0) с blurred = cv2.GaussianBlur(raw_data, (5, 5), 5, 5) помогло, хотя мое размытие по-прежнему дает более темное значение, чем у OpenCV.

0 ответов

Другие вопросы по тегам