查找由NumPy数组生成的图像中的边

时间:2015-10-15 17:55:04

标签: python numpy image-processing

好的,所以我有一个由任意单位的numpy数组生成的图像。图像显示旋转的方形,其中有一个洞。我想要做的是编写一些代码来找到这个方块的边缘,然后将方块中的值保存在一个数组中,并将方形外的值保存在一个数组中。并且应排除孔中的值。 这整个过程我想用于很多图像,但都有相同的正方形。

我真的不知道如何处理这个但是一直在考虑让循环试图找到值快速变化的位置(即作为边缘)但是由于单位是任意的而变得复杂,因此值的变化将是每张图片都有所不同。

我试图使用canny情节而没有任何运气,因为它只发现了图中另一部分真正锋利的边缘。

所以基本上我需要一些方法的想法,如果有很多循环,或者我应该尝试寻找其他方法。

所以这是图像: Rotated square 这显示了一个y值的值: One y value, all x values

1 个答案:

答案 0 :(得分:1)

对图像进行边缘检测的一种好方法是使用Sobel滤波器。使用以下包。

import numpy as np
import scipy.ndimage

...

#If your image is a 2D numpy array named "img", then do the following

img_sobel = scipy.ndimage.filters.sobel(img)

这会生成另一个被过滤的图像,并增强图像的边缘。它基本上产生一个图像渐变,其中可以在图像的边缘找到最大的渐变。接下来,您可以执行一些二进制过滤以使边缘更好地显示。基本上,你想要设置的值高于最大sobel过滤值等于1的一半,而值小于等于零的值是这样的(我已根据 imaluengo 的建议清理了代码) ):

bn_img = np.zeros([img_sobel.shape[0],img_sobel.shape[1]])
sbl_max = np.amax(abs(img_sobel))
bn_img = np.abs(img_sobel) >= (sbl_max/2.0) #You can change 
                                            #this threshold 
                                            #to suit your needs

下面是我如何使用它来查找月球图像边缘的示例图像,以便即使在月亮的黑暗面也看不到月球的中心。

Lunar Image using Sobel Filter