首页 > 解决方案 > 图像与内核的卷积给出白色输出

问题描述

我有一个用 3x3 高斯内核过滤图像的代码,但输出是白色的。GuassianFilter 函数有效(输出正确),但卷积函数存在问题。

会有什么问题?我再次检查了代码,但无法解决这个问题。

import math
import numpy as np
import cv2
path="funny_hats.jpg"
inputImage = cv2.imread(path,cv2.IMREAD_GRAYSCALE)


def GaussianFilter(img): 
    #generating 3x3 kernel
    kernel = np.ones((3,3), dtype='float64')
    size = 3
    mean = int(size/2)
    sigma = 1 # standart deviation is 1
    sumAll = 0
    for i in range(size):
        for j in range(size):
            kernel[i,j] = math.exp(-1* ((math.pow( (i-mean)/sigma, 2.0) + (math.pow((j-mean)/sigma, 2.0)) ) / (2* math.pow(sigma,2)) )) / (sigma * math.pow(2*math.pi, 1/2))
            sumAll += kernel[i,j]
    # normalizing kernel
    for i in range(size):
        for j in range(size):
            kernel[i,j] /= sumAll
    # Filter image with created kernel   
    img = convolution(img, kernel) # filtered image
    print(img)
    cv2.imshow('aa', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

def convolution(img, dest):
    res = img
    [h,w] = img.shape
    [kh, kw] = dest.shape # kernel shape
    kr = int(kh/2) # kernel radius
    res = np.zeros(img.shape)

    for i in range(0+kr,h-kr):
        for j in range(0+kr,w-kr):
            for k in range(-1 * kr, kr + 1):
                for m in range(-1 * kr, kr + 1):
                    res[i,j] += dest[k,m]*img[i+k, j+m]
    res[:,0] = res[:, 1]
    res[:,w-1] = res[:, w-2]
    res[0,:] = res[1,:]
    res[h-1,:] = res[h-2,:]
    return res


GaussianFilter(inputImage)

标签: imageimage-processingconvolutiongaussian

解决方案


res = img

这是错误的。您必须创建所有像素都为零(黑色)的图像。


推荐阅读