我有一个二进制图像,如下图所示,
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)如何在空间坐标系中得到分数像素的值?
感谢。
答案 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变换的图像
答案 2 :(得分:0)
我会使用meshgrid
为图像生成坐标系。您可以通过矩阵乘法用rotation matrix旋转此坐标系。这应该为您提供变换后的坐标,但您需要来自它们的值,正如您所说,它们将是小数像素。由您决定插值的最佳方式。一种方法是仅使用最近像素(也称为最近邻居)的值。线性插值通常会产生更好的结果 - 取相邻像素并将它们相加,然后根据它们与目标坐标的接近程度进行加权。如果结果不令人满意,我只会打扰使用高阶插值方法。
您提出的方法的替代方法是使用imrotate
以45度旋转变换图像,然后计算您感兴趣的列中垂直像素的线积分(和)。 / p>