Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用水平内核进行卷积会产生奇怪的输出_Python_Image Processing_Python Imaging Library - Fatal编程技术网

Python 使用水平内核进行卷积会产生奇怪的输出

Python 使用水平内核进行卷积会产生奇怪的输出,python,image-processing,python-imaging-library,Python,Image Processing,Python Imaging Library,所以我试着用一个3x3的水平内核执行2D图像卷积,看起来像这样 horizontal=np.array([ [0, 0, 0], [-1, 0, 1], [0, 0, 0]]), 因此,我使用下面的卷积函数,在图像中循环,从忽略前几个像素(内核大小)开始,然后相乘和相加 def执行卷积(k_h,k_w,img_h,img_w,内核,图片): #k_w=内核宽度,k_h=内核高度 #img_h=图像高度,img_w=图像宽度 conv=np.zero(picture.shape) 对于范围内

所以我试着用一个3x3的水平内核执行2D图像卷积,看起来像这样

horizontal=np.array([
[0, 0, 0], 
[-1, 0, 1], 
[0, 0, 0]]),
因此,我使用下面的卷积函数,在图像中循环,从忽略前几个像素(内核大小)开始,然后相乘和相加

def执行卷积(k_h,k_w,img_h,img_w,内核,图片):
#k_w=内核宽度,k_h=内核高度
#img_h=图像高度,img_w=图像宽度
conv=np.zero(picture.shape)
对于范围内的i(k_h,img_h-(k_h)):
对于范围内的j(k_w,img_w-(k_w)):
tot=0
对于范围内的m(k_h):
对于范围内的n(k_w):
tot=tot+kernel[m][n]*图片[i-(k_h)+m][j-(k_w)+n]
conv[i][j]=tot
返回转换
但是我得到的结果是,非常奇怪,如下所示

或者,通过使用PIL的内核,我得到了一个像这样的适当的模糊图像

有人能帮我找出哪里出了问题吗

我用box内核尝试了相同的函数,它运行得很好,但我不明白为什么它的输出如此奇怪

我也尝试过分离RGB波段并单独卷积它们,但没有结果

原始图像是这样的


如果要获得与问题中模糊图像相同的图像,则需要对代码进行以下更改,除了边缘和对角线偏移1或2像素外:

horizontal=np.array([[0.0,0.0,0.0],
[0.5, 0.0, 0.5], 
[0.0, 0.0, 0.0]])
此外,不适用于此内核,但如果您希望看到以前内核的更真实输出,您还需要进行以下更改:

conv[i][j]=np.clip(tot,0255)
您所使用的内核是左右像素之间的差值,对于大多数图像,该差值约为0,并且通常在一个或多个通道中下溢,导致这些通道获得类似255的值

np.clip()
正是为了避免溢出和下溢(这不会发生在您想要的内核中,因为它是一个平均值)

更新:

您可能也需要此更改:

conv=np.zero(picture.shape,dtype=np.uint8)

如果希望获得与问题中模糊图像相同的图像,则需要对代码进行以下更改,除了边缘和对角线偏移1或2像素外:

horizontal=np.array([[0.0,0.0,0.0],
[0.5, 0.0, 0.5], 
[0.0, 0.0, 0.0]])
此外,不适用于此内核,但如果您希望看到以前内核的更真实输出,您还需要进行以下更改:

conv[i][j]=np.clip(tot,0255)
您所使用的内核是左右像素之间的差值,对于大多数图像,该差值约为0,并且通常在一个或多个通道中下溢,导致这些通道获得类似255的值

np.clip()
正是为了避免溢出和下溢(这不会发生在您想要的内核中,因为它是一个平均值)

更新:

您可能也需要此更改:

conv=np.zero(picture.shape,dtype=np.uint8)

首先,您使用的过滤器是梯度过滤器,在本例中,它给出的值在[-255255]范围内。这里要考虑的要点是,你得到的价值不只是幅度,你也在填补边缘的方向。因此,为了说明这一点,您可以在另一幅图像中存储相位信息,即正值为0度,负值为180度。最后,在可视化渐变图像时,您只需查看图像的大小,就可以知道存在一个确定渐变方向的相位图像

其次,您在问题中显示的稍微平滑的图像不能使用此内核创建


另外,根据经验,当您想要应用平滑过滤器时,始终确保内核中所有元素的总和为1。

首先,您使用的过滤器是梯度过滤器,在这种情况下,它给出的值在[-255255]范围内。这里要考虑的要点是,你得到的价值不只是幅度,你也在填补边缘的方向。因此,为了说明这一点,您可以在另一幅图像中存储相位信息,即正值为0度,负值为180度。最后,在可视化渐变图像时,您只需查看图像的大小,就可以知道存在一个确定渐变方向的相位图像

其次,您在问题中显示的稍微平滑的图像不能使用此内核创建


另外,根据经验,当您要应用平滑过滤器时,始终确保内核中所有元素的总和为1。

图片是如何定义的?im=Image.open('pp.jpg')picture=np.array(im)@waltertross这是整数值溢出/下溢的问题,和/或图像显示的问题。与内核的卷积结果的值超出[0255]范围,您需要弄清楚如何正确存储这些值以及如何有意义地显示它们。这是否回答了您的问题?图片是如何定义的?im=Image.open('pp.jpg')picture=np.array(im)@waltertross这是整数值溢出/下溢的问题,和/或图像显示的问题。与内核的卷积结果的值超出[0255]范围,您需要弄清楚如何存储这些值