<p>通过从RGB图像上的颜色识别和分析切换到对相机的深度信息进行边缘检测,我能够获得更好的物体轮廓。在</p>
<p>以下是我为找到更好的边缘贴图而采取的一般步骤。在</p>
<ol>
<li><p>将深度信息保存在NxMx1矩阵中。其中N,M值是图像分辨率的形状。对于480640图像,我有一个矩阵(480640,1),其中每个像素(I,j)存储该像素坐标对应的深度值。</p></li>
<li><p>使用二维高斯核平滑和填补我的深度矩阵中的任何缺失数据,使用astropy的卷积方法。</p></li>
<li><p>找到我的深度矩阵的梯度和梯度中每个像素对应的大小。</p></li>
<li><p>基于均匀深度过滤数据。其中均匀深度意味着一个平面物体,所以我发现我的量值的高斯分布(从深度梯度)和那些填充在X标准偏差内的值被设置为零。这减少了图像中的一些附加噪声。</p></li>
<li><p>然后我将我的幅值矩阵的值从0规范化为1,这样我的矩阵就可以被认为是通道1图像矩阵。</p></li>
</ol>
<p>因为我的深度矩阵是(480640,1)的形式,当我找到相应的梯度矩阵,也是(480640,1)时,我将值(:,:,1)从0缩放到1。这样以后我可以用灰度或二值图像来表示它。在</p>
<pre><code>def gradient_demo(self, Depth_Mat):
"""
Gradient display entire image
"""
shape = (Depth_Mat.shape)
bounds = ( (0,shape[0]), (0, shape[1]) )
smooth_depth = self.convolve_smooth_Depth(Depth_Mat, bounds)
gradient, magnitudes = self.depth_gradient(smooth_depth, bounds)
magnitudes_prime = magnitudes.flatten()
#hist, bin = np.histogram(magnitudes_prime, 50) # histogram of entire image
mean = np.mean(magnitudes_prime)
variance = np.var(magnitudes_prime)
sigma = np.sqrt(variance)
# magnitudes_filtered = magnitudes[(magnitudes > mean - 2 * sigma) & (magnitudes < mean + 2 * sigma)]
magnitudes[(magnitudes > mean - 1.5 * sigma) & (magnitudes < mean + 1.5 * sigma)] = 0
magnitudes = 255*magnitudes/(np.max(magnitudes))
magnitudes[magnitudes != 0] = 1
plt.title('magnitude of gradients')
plt.imshow(magnitudes, vmin=np.nanmin(magnitudes), vmax=np.amax(magnitudes), cmap = 'gray')
plt.show()
return magnitudes.astype(np.uint8)
def convolve_smooth_Depth(self, raw_depth_mtx, bounds):
"""
Iterate over subimage and fill in any np.nan values with averages depth values
:param image:
:param bounds: ((ylow,yhigh), (xlow, xhigh)) -> (y,x)
:return: Smooted depth values for a given square
"""
ylow, yhigh = bounds[0][0], bounds[0][1]
xlow, xhigh = bounds[1][0], bounds[1][1]
kernel = Gaussian2DKernel(1) #generate kernel 9x9 with stdev of 1
# astropy's convolution replaces the NaN pixels with a kernel-weighted interpolation from their neighbors
astropy_conv = convolve(raw_depth_mtx[ylow:yhigh, xlow:xhigh], kernel, boundary='extend')
# extended boundary assumes original data is extended using a constant extrapolation beyond the boundary
smoothedSQ = (np.around(astropy_conv, decimals= 3))
return smoothedSQ
def depth_gradient(self, smooth_depth, bounds):
"""
:param smooth_depth:
:param shape: Tuple with y_range and x_range of the image.
shape = ((0,480), (0,640)) (y,x) -> (480,640)
y_range = shape[0]
x_range = shape[1]
:return:
"""
#shape defines the image array shape. Rows and Cols for an array
ylow, yhigh = bounds[0][0], bounds[0][1]
xlow, xhigh = bounds[1][0], bounds[1][1]
gradient = np.gradient(smooth_depth)
x,y = range(xlow, xhigh), range(ylow, yhigh)
xi, yi = np.meshgrid(x, y)
magnitudes = np.sqrt(gradient[0] ** 2 + gradient[1] ** 2)
return gradient, magnitudes
</code></pre>
<p>使用这个方法/代码,我能够得到下面的图像。仅供参考,我稍微改变了一下场景。在</p>
<p><a href="https://i.stack.imgur.com/vTGYO.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/vTGYO.png" alt="enter image description here"/></a></p>
<p>我问了另一个相关的问题:<a href="https://stackoverflow.com/questions/54849567/how-to-identify-contours-associated-with-my-objects-and-find-their-geometric-cen">How to identify contours associated with my objects and find their geometric centroid</a></p>
<p>这说明了如何在图像中找到物体的轮廓,质心。在</p>