跨图像的采样矢量

时间:2014-04-04 03:45:04

标签: python arrays opencv numpy scipy

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

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

然而,为了确定这些边缘的方向,我希望能够在下面的图像中采样任意向量的图像,以帮助说明:

Image Sampling Predicament

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

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

2 个答案:

答案 0 :(得分: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 > 1),那么它们将从左到右,所以像你的绘图一样的切片的形状将是一个微小的z序列,而对于另一个方向,则是向后的z(s的?)。 / p>

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

答案 1 :(得分:1)

使用等式

 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();

}