应用高斯滤波器时,图像变暗

Mrc*_*mio 0 python opencv image-processing

当我运行以下代码时,输​​出结果变得模糊,但随着 sigma 值的增加,图像变得更暗。
进口

import numpy as np
import cv2
import matplotlib.pyplot as plt
%matplotlib inline
import math
import copy
Run Code Online (Sandbox Code Playgroud)

高斯滤波器代码

e = 2.71828182845904
pi = 3.1415926535897

def gaus(mat_l,sigma):
    Matrix = [[0.0 for x in range(mat_l)] for y in range(mat_l)] 
    for x in range(-(int(mat_l/2)),(int(mat_l/2))+1):
        for y in range(-(int(mat_l/2)),(int(mat_l/2))+1):
            ee = pow(e,(-(((pow(x,2)+pow(y,2))/(2*(pow(sigma,2)))))))
            aa = (1/(2*pi*pow(sigma,2)))
            result = ee*aa
            Matrix[x+int(mat_l/2)][y+int(mat_l/2)] = round(result,6)
    return Matrix
Run Code Online (Sandbox Code Playgroud)

卷积码

def matrix_convolve(image,kernel,a,b,mul=1):
    print(kernel)
    img_x, img_y = image.shape
    kernl_x, kernl_y = kernel.shape

    result = copy.deepcopy(image)
    for i in range(img_x-int(len(kernel)/2)):
        for j in range(img_y-int(len(kernel)/2)):
            result[i][j] = 0
            summ = 0
            for s in range(-a,a+1):
                for t in range(-b,b+1):
                    summ += kernel[s,t] * image[i+s,j+t]
            result[i][j] = math.ceil(mul*summ)
    return result
Run Code Online (Sandbox Code Playgroud)

司机

image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

kernal = gaus(5,5)
kernal = np.array([kernal[0],kernal[1],kernal[2],kernal[3],kernal[4]])

result3 = matrix_convolve(image,kernal,2,2)
plt.imshow(result3.astype(np.uint8),cmap='gray')
plt.show()
Run Code Online (Sandbox Code Playgroud)

当 sigma 为 5 时,输出图像为 output_with_sigma_5

当 sigma 为 2 时,输出图像为 output_with_sigma_2

image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

kernal = gaus(5,5)
kernal = np.array([kernal[0],kernal[1],kernal[2],kernal[3],kernal[4]])

result3 = matrix_convolve(image,kernal,2,2)
plt.imshow(result3.astype(np.uint8),cmap='gray')
plt.show()
Run Code Online (Sandbox Code Playgroud)

当使用 OpenCV 进行模糊处理时,以下是 sigma 5 的输出 opencv

Cri*_*ngo 5

问题是您仅对高斯内核的 5x5 网格进行采样。sigma 越大,切断的内核越多,损失的功率也越大。

模糊内核的总和应始终为 1。例如,如果加起来为 0.5,则输出图像的平均强度将是输入图像的平均强度的一半。

解决方案是双重的:

  1. 对内核的较大部分进行采样。至少1+ceil(2*sigma),但最好是 3 次而不是 2 次。

  2. 规范化你的内核。即使您从中心采样最多 3*sigma,您仍然会在采样中损失一些功率,尤其是对于小 sigma。规范化内核就像将所有内核值相加,然后将每个内核值除以该总和一样简单。