2015-10-15 91 views
1

好的,所以我有一个由具有任意单位的numpy值数组生成的图像。图像显示了一个旋转的正方形,并带有一个洞。我想要做的是编写一些代码来查找这个正方形的边缘,然后将一个数组中的正方形值存储在一个数组中的正方形内。应该排除孔中的值。 这整个过程我想用于许多图像,但都在他们的相同的广场。在NumPy数组生成的图像中寻找边缘

我真的不知道如何处理这个问题,但一直在考虑让循环尝试找到值快速变化的位置(即作为边缘),但由于单位是任意的,所以值的变化会变得复杂每个图像都不一样。

我试图使用canny plot没有任何运气,因为它只发现了图中另一部分的真正尖锐的边缘。

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

因此,这是图像: Rotated square ,这是示出了用于一个Y值的值: One y value, all x values

+0

肯定与循环先试,如果这被证明是缓慢的,你可能看其后向量化这将作为基准。 – Divakar

+0

一个样本图像或两个将是一个很大的帮助。 –

+0

@WarrenWeckesser我现在添加了两个图像。 –

回答

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) 

这产生了另一个被过滤的图像,并增强了图像的边缘。它基本上会产生一个图像渐变,其中可以在图像的边缘找到最大的渐变。接下来,您可以执行一些二进制过滤以使边显示得更好。

:基本上,你想用不到一半等于零,像这样超过一半的最大索贝尔滤波值等于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

+0

您可以将掩码矢量化为'bn_img = np.abs(img_sobel)> =(sbl_max/2.0)'。 –

+0

感谢您的提示,能够清理代码总是很好的。 – tmwilson26