这看起来有点奇怪,但我觉得应该有一个相对简单的解决方案。基本上我有一个3D numpy数组(x,y,color)形式的图像。我和this tutorial一起关注的产品区域略有不同,发现这些方法并没有很好地扩展。
因此,我正在为我的用例制作修改后的边缘检测算法。到目前为止,这只是1d阵列上的一些基本信号处理。如果我只想在x
和y
方向进行采样,这很有效,因为我可以使用数组的现有行和列。
然而,为了确定这些边缘的方向,我希望能够在下面的图像中采样任意向量的图像,以帮助说明:
我尝试将一些只会在像素交叉时附加像素的东西混合在一起,但它在许多方面效率低下,不优雅且不理想。我觉得必须有一些相对优雅的方式来做到这一点。
有什么想法吗?如果这使得事情变得更容易,那么整个向量中的样本大小对我来说并不重要。
答案 0 :(得分:1)
我会为你要剪切的线制作一个等式,然后在它周围制作一个遮罩,并保留所有像素的宽度。例如,假设您希望沿着i = 2*j + 34
进行剪切,其中i
和j
以像素为单位进行测量:
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();
}