Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 沿轴平移带有RGB颜色的二维图像_Matlab - Fatal编程技术网

Matlab 沿轴平移带有RGB颜色的二维图像

Matlab 沿轴平移带有RGB颜色的二维图像,matlab,Matlab,我正在尝试创建自己的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循环,测试各个像素,看看它们是否在使用inpolygon的形状内

我正在尝试创建自己的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循环,测试各个像素,看看它们是否在使用inpolygon的形状内。如果他们这样做,我就会找出哪个点是最接近的像素,并根据最近的点是属于第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])
结果是:

接下来,我逐像素测试整个图形区域,并根据它们是否接近第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
这就是结果

右侧的形状有些正确,但其他部分则不正确。我理解这一点,因为我的世界坐标从负值开始,但像素坐标从1开始

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


谢谢大家!

需要注意的一点是,你必须这样做。绘图坐标为
(x,y)
,其中
x
向右,而
y
向上。矩阵坐标为
(i,j)
,其中
i
向下,右侧为
j
。一个简单的方法是使用
vec_X,vec_Y
,如下所示

更新版本的Matlab的另一个解决方案是——正如您所说——使用,但不幸的是,我没有使用该命令的经验

%边界向量
边界_X=[-5408540-5];
边界_Y=[20 50 20-10 20];
%点向量
组(1)(X=[20 30];;
第1组Y=[10 40];
第二组X=[50 70];
第二组Y=[5 20];
%坐标系
最小值X=-10;
max_X=90;
最小值Y=-20;
最大Y=60;
轴([min_X,max_X,min_Y,max_Y])
%使用默认白色创建像素向量
行数N=100;
列N=80;
C=一(第N行、第N列、第3列);
%这些向量表示每个像素在绘图坐标中的位置
%系统
vec_X=linspace(minu X,max X,columns N);
vec_Y=linspace(最小、最大、行数);
颜色=0 1 1;
颜色二=[1 1 0];
%循环浏览整个图表
对于i=1:100
对于j=1:80
如果是多边形(向量X(j),向量Y(i),边界X,边界Y)
%计算到每个点的距离
距离_One=零(大小(组_One_X));
距离_Two=零(大小(组_Two_X));
对于k=1:numel(一组X);
距离(k)=范数([组X(k),组Y(k)]-[向量X(j),向量Y(i)];%假设欧几里德范数,但可以调整到任何你需要的范数
结束
对于k=1:numel(两组X);
距离(k)=范数([组(k),组(k)]-[向量(j),向量(i)];%假设欧几里德范数,但可以调整到任何你需要的范数
结束
如果最小(距离)小于最小(距离);
C(i,j,:)=颜色;
其他的
C(i,j,:)=颜色;
结束
结束
结束
结束
%显示图像
imagesc(vec_X,vec_Y,C)%用于根据vec_X和vec_Y绘制图像
%绘制边界和点
等等
绘图(边界X,边界Y)
散布(组X,组Y,10,'MarkerFaceColor','Black',。。。
“MarkerEdge颜色”、“黑色”)
散射(第二组X,第二组Y,10,'MarkerFaceColor','Red',。。。
“MarkerEdge颜色”、“红色”)
拖延

@failr嘿,我已根据要求提供了一个示例。非常感谢。谢谢你,伙计!这帮我解决了我的问题。与使用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