在Matlab中,如何在旋转45度的二维坐标系中扫描二进制图像到实际坐标系?

时间:2012-01-04 21:19:01

标签: matlab image-processing geometry coordinate-systems

我有一个二进制图像,如下图所示,

enter image description here

x-y坐标系是MATLAB附带的默认坐标系。我能够获得x-y坐标系中每行和每列的像素总和。

但是我想通过逐步通过u-v坐标系来获得像素总和。我怎么能得到它?

我的想法是

1)将x-y坐标系转换为连续(实值)坐标系 2)找到对应于u-v坐标系中每个点的x-y坐标中的点。 u-v中的(1,1)对应于x-y中的(1.26,1.45)。 3)以u-v坐标获得行和列的总和。

在这方面, 1)创建空间坐标系并将像素坐标系转换为空间坐标系的方法有哪些? 2)如何在空间坐标系中得到分数像素的值?

感谢。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

对角度45,135使用氡变换。 它会给你完全你需要的东西 特定角度的像素总和。

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

答案 2 :(得分:0)

我会使用meshgrid为图像生成坐标系。您可以通过矩阵乘法用rotation matrix旋转此坐标系。这应该为您提供变换后的坐标,但您需要来自它们的值,正如您所说,它们将是小数像素。由您决定插值的最佳方式。一种方法是仅使用最近像素(也称为最近邻居)的值。线性插值通常会产生更好的结果 - 取相邻像素并将它们相加,然后根据它们与目标坐标的接近程度进行加权。如果结果不令人满意,我只会打扰使用高阶插值方法。


您提出的方法的替代方法是使用imrotate以45度旋转变换图像,然后计算您感兴趣的列中垂直像素的线积分(和)。 / p>