在Matlab中,如何扫描一个二进制图像在45度旋转的2D坐标系中,而该坐标系是相对于实际坐标系旋转的?

3
我有一幅二进制图像,如下图所示,x-y坐标系是MATLAB默认的坐标系。我能够得到在x-y坐标系中每行和每列上像素的总和。但是我想通过在u-v坐标系中逐步进行来获得像素的总和。我该怎么做呢?
我的想法是:
1)将x-y坐标系转换为连续(实值)坐标系 2)找到与u-v坐标系中每个点对应的x-y坐标系中的点,例如(1,1)在u-v中对应于(1.26,1.45)在x-y中。 3)在u-v坐标系中获取行和列的总和。
关于此问题,以下是需要翻译的内容:
1)创建空间坐标系和将像素坐标系转换为空间坐标系的方法有哪些? 2)如何获取空间坐标系中分数像素的值?
谢谢。
3个回答

1

如果您只想要恰好45度的对角线,并且您的像素是正方形的(这是大多数标准相机的安全假设),那么我认为您不需要进行任何坐标转换。您可以利用沿对角线的所有点都具有例如I(ix, ix), I(1 + ix, ix)形式的事实。计算极限有点棘手。尝试从左下角开始,沿着左边向上移动,然后横穿顶部,对于“列”(从左上到右下的对角线)总和,请使用以下方法:

I = eye(5, 4);
I(4, 1) = 1;

[nrows, ncols] = size(I);
colsums = zeros(nrows + ncols - 1, 1);

% first loop over each row in the original image except the first one
for ix = nrows : -1 : 2,
    JX = [0 : min(nrows - ix, min(nrows-1, ncols-1))];
    for jx = JX,
        colsums(nrows - ix + 1) = colsums(nrows - ix + 1) + I(ix + jx, jx + 1);
    end
end

% then loop over each column in the original image 
for ix = 1 : ncols,
    JX = [0 : min(nrows - ix - 1, min(nrows-1, ncols-1))];
    for jx = JX,
        colsums(nrows + ix - 1) = colsums(nrows + ix - 1) + I(1 + jx, ix + jx);
    end
end

请注意,如果您关心距离(听起来好像不是很重要),那么沿着这些对角线的距离会比直线距离长sqrt(2)/2

非常感谢。我认为这正是“radon”函数所做的事情。这帮助我理解了我在“radon”函数中没有理解的东西。 - Sulla

1

只需使用45度和135度的Radon变换即可。

它将精确地给出您所需的内容。
在特定角度上像素的总和。

http://en.wikipedia.org/wiki/Radon_transform

I = checkerboard(10,10);
figure;imshow(I)
R = radon(I,[45 135]);
figure;plot(R(:,1))

这里有一些图像,可以解释Radon变换

Image taken from wikipedia

Image taken from Matlab help


谢谢。我确实弄清楚了早期答案是一个 Radon 实现。但是我正在试验单位。1/ sqrt(2) 的长度和我的实现让我清楚地理解了它。 - Sulla

0

我会使用meshgrid为图像生成坐标系。您可以通过矩阵乘法与旋转矩阵旋转此坐标系。这应该会给您变换后的坐标,但您需要从中获取值,正如您所说,它们将是分数像素。由您决定最佳的插值方法。一种方法是只使用最近像素的值(即最近邻)。线性插值通常会产生更好的结果-取相邻像素并按其接近目标坐标的程度加权求和。如果结果不令人满意,我才会费心使用高阶插值方法。


一个替代你提出的方法是使用imrotate将图像旋转45度进行变换,然后计算所感兴趣的列中垂直像素的线积分(总和)。

“imrotate”方法的问题在于,旋转会引入空白像素。由于边缘引入了这些空白像素,线积分和会给出误导性信息。 - Sulla
但是空白像素不会影响总和,因为它们都是零。 - aganders3
会影响我的计算,因为我对具有最小像素值的行和列感兴趣。由于“imrotate”引入了空白行和列,这将成为我的最小行/列。 - Sulla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接