【问题标题】:Sampling vector across image跨图像的采样向量
【发布时间】:2014-04-04 03:45:04
【问题描述】:

这可能看起来有点奇怪,但我真的觉得应该有一个相对简单的解决方案。基本上我有一个 3D numpy 数组(x,y,颜色)形式的图像。我和this tutorial 一起关注了一个稍微不同的产品领域,发现这些方法没有很好地扩展。

因此,我正在为我的用例改进边缘检测算法。到目前为止,这只是一维阵列之上的一些基本信号处理。如果我只想在 xy 方向上采样,这非常有用,因为我可以使用数组的现有行和列。

但是,为了确定这些边缘的方向,我希望能够在下图中对任意向量进行采样,以帮助说明:

我尝试将一些只会在穿过像素时附加像素的东西组合在一起,但它在许多方面效率低下、不优雅且不理想。我觉得必须有一些相对优雅的方式来做到这一点。

有什么想法吗?如果这会让事情变得更容易,那么整个向量的样本大小对我来说并不重要。

【问题讨论】:

  • 另外一个稍微不相关的问题,有人知道为什么我的图片没有显示吗?
  • 图像对我来说很好。
  • @askewchan 嗯,很奇怪。

标签: python arrays opencv numpy scipy


【解决方案1】:

我会为你想要切割的线做一个方程式,然后在它周围制作一个蒙版,并保持所有像素在它的某个宽度内。例如,假设您想要沿i = 2*j + 34 进行剪切,其中ij 以像素为单位:

h, w = im.shape[:2]
width = 2 # width of slice in pixels, too narrow and it will have gaps
i, j = np.ogrid[:h, :w]
mask = np.abs(2*j + 34 - i) < width
im[mask]

请注意,im[mask] 将是一个二维数组,因为它应该仍然具有颜色。它将被排序,以便最上面的像素在前,底部的像素在最后,与箭头所示相反,除非你的绘图中有origin=lower :) 如果在每一行中选择了几个像素(如果width &gt; 1),那么它们会从左到右移动,因此像您的绘图这样的切片的形状将是一个很小的 ​​z 序列,而对于另一个方向,则是向后 z(s?)。

请记住,对于一个数组来说,无论您的实现多么优雅,都不存在没有一些奇怪的锯齿形(或插值)的对角线切片。您可以旋转图像(通过某种算法)并进行水平切片。

【讨论】:

  • 所以...我想更多的是沿着这里的插值线。主要是因为这种曲折意味着边缘边界上的灾难,这主要是我在这里工作的原因。
【解决方案2】:

使用等式

 x2 = x1 + length * cos(θ)
 y2 = y1 + length * sin(θ) 

在哪里

θ = angle * 3.14 / 180.0

您可以使用角度和长度来遍历像素

int angle =45; //angle of iteration  
int length = 0; //Alternately you can skip the pixel by giving value other than 0 
Point P1(starX,startY); //Your starting point.
Point P2;//??

while(1){

  length++;
  P2.x =  (int)round(P1.x + length * cos(angle * CV_PI / 180.0));
  P2.y =  (int)round(P1.y + length * sin(angle * CV_PI / 180.0));

  if(P2_exceed_boundary()) break;
  do_Whatever_with_P2();

}

【讨论】:

  • 嗯...我不认为你的意思是增加角度?
  • @Slater Tyranus 你说得对,它应该是长度,谢谢你注意到我的错误。我会编辑它。
猜你喜欢
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
相关资源
最近更新 更多