【问题标题】:Translating 2D image with RGB colours along axes沿轴转换 RGB 颜色的 2D 图像
【发布时间】:2016-01-11 18:37:11
【问题描述】:

我正在尝试创建自己的 voronoi 图。我有一个由存储在单独向量中的 x 和 y 坐标定义的任意形状。在这个形状内部是一些兴趣点(具有已知坐标),它们属于两个不同的组并充当 voronoi 图的种子。例如,整个图的范围从 x=-10 到 x=90 和 y=-20 到 y=60。边界形状不是矩形,而是在上面的轴范围内。

到目前为止,我所做的是创建一个 3D 矩阵 (100 X 80 X 3),C 和所有的,以便默认颜色为白色。然后我从 i=1:100, j=1:80 开始循环,测试单个像素以查看它们是否在使用多边形的形状内。如果是这样,我会找出最接近的像素点,并根据最近的点属于第 1 组还是第 2 组为其分配颜色。

到目前为止一切都很好。然后我使用 imagesc 显示具有自定义轴范围的图像。问题是 voronoi 图具有一般形状,但由于像素坐标与实际世界坐标不同,因此在位置方面有所偏差。

我尝试使用 imref2d 对其进行映射,但我不知道它的实际工作原理或使用 imref2d 后如何显示图像。请帮我解决这个问题。

我也愿意接受其他方法!

谢谢!

编辑: 根据要求,让我给出一个更详细的例子和解释我的问题。

让我们假设一个简单的菱形边界具有以下向量和 4 个点具有以下坐标向量:

%Boundary vectors
Boundary_X = [-5 40 85 40 -5];
Boundary_Y = [20 50 20 -10 20];

%Point vectors
Group_One_X = [20 30];
Group_One_Y = [10 40];
Group_Two_X = [50 70];
Group_Two_Y = [5 20];

接下来我将它们全部绘制出来,不同的组有不同的颜色。

%Plot boundary and points
hold on
plot(Boundary_X,Boundary_Y)
scatter(Group_One_X,Group_One_Y,10,'MarkerFaceColor','Black',...
'MarkerEdgeColor','Black')
scatter(Group_Two_X,Group_Two_Y,10,'MarkerFaceColor','Red',...
'MarkerEdgeColor','Red')
hold off
axis([-10, 90, -20, 60])

这是结果: Boundary with points

接下来,我逐个像素地测试整个图形区域,并根据它们是否更接近第 1 组或第 2 组点将它们着色为青色或黄色。

%Create pixel vector with default white colour
C=ones(100,80,3);
Colour_One = [0 1 1];
Colour_Two = [1 1 0];

%Loop through whole diagram
for i=1:100
    for j=1:80
    x=i;
    y=j
        if inpolygon(x,y,Boundary_X,Boundary_Y)
            %Code for testing which point is pixel closest to
            %If closest to group 1, assign group 1 colour, else group 2
            %colour
        end
    end
end

%Display image
hold on
imagesc(C)
hold off

这是结果 Failed Voronoi Diagram

右侧的形状有些正确,但其他形状不正确。我明白这是因为我的世界坐标从负值开始,但像素坐标从 1 开始。

因此,我不知道该如何解决这个问题。

谢谢!

【问题讨论】:

标签: matlab


【解决方案1】:

需要注意的一点是您必须convert between image and plot coordinates。绘图坐标为(x,y),其中x 向右,y 向上。矩阵坐标是(i,j),其中i 向下,j 向右。一个简单的方法是使用vec_X,vec_Y,如下所示。

对于较新的 Matlab 版本的另一种解决方案是 - 正如你所说 - 使用 imref2d 但不幸的是我没有使用该命令的经验。

%Boundary vectors
Boundary_X = [-5 40 85 40 -5];
Boundary_Y = [20 50 20 -10 20];

%Point vectors
Group_One_X = [20 30];
Group_One_Y = [10 40];
Group_Two_X = [50 70];
Group_Two_Y = [5 20];

%Coordinate system
min_X = -10;
max_X = 90;
min_Y = -20;
max_Y = 60;
axis([min_X, max_X, min_Y, max_Y])

%Create pixel vector with default white colour
rows_N = 100;
columns_N = 80;
C=ones(rows_N,columns_N,3);

%These vectors say where each of the pixels is in the plot coordinate
%system
vec_X = linspace(min_X,max_X,columns_N);
vec_Y = linspace(min_Y,max_Y,rows_N);
Colour_One = [0 1 1];
Colour_Two = [1 1 0];

%Loop through whole diagram
for i=1:100
    for j=1:80
        if inpolygon(vec_X(j),vec_Y(i),Boundary_X,Boundary_Y)
            %calculate distance to each point
            Distances_One = zeros(size(Group_One_X));
            Distances_Two = zeros(size(Group_Two_X));
            for k=1:numel(Group_One_X);
                Distances_One(k) = norm([Group_One_X(k),Group_One_Y(k)]-[vec_X(j),vec_Y(i)]);%assuming euclidean norm, but can be adjusted to whatever norm you need
            end
            for k=1:numel(Group_Two_X);
                Distances_Two(k) = norm([Group_Two_X(k),Group_Two_Y(k)]-[vec_X(j),vec_Y(i)]);%assuming euclidean norm, but can be adjusted to whatever norm you need
            end
            if min(Distances_One) < min(Distances_Two);
                C(i,j,:) = Colour_One; 
            else
                C(i,j,:) = Colour_Two;
            end  
        end
    end
end

%Display image

imagesc(vec_X,vec_Y,C) %lets you draw the image according to vec_X and vec_Y
%Plot boundary and points
hold on
plot(Boundary_X,Boundary_Y)
scatter(Group_One_X,Group_One_Y,10,'MarkerFaceColor','Black',...
'MarkerEdgeColor','Black')
scatter(Group_Two_X,Group_Two_Y,10,'MarkerFaceColor','Red',...
'MarkerEdgeColor','Red')

hold off

【讨论】:

  • 谢谢你!这帮助我解决了我的问题。与使用 imref2d 相比,您解决它的方法更简单、更容易遵循。干杯!
猜你喜欢
  • 2018-08-26
  • 1970-01-01
  • 2019-01-01
  • 2011-07-10
  • 2011-06-07
  • 2018-04-09
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
相关资源
最近更新 更多