Почему мое размытие по Гауссу не выглядит так же, как 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.