Image 在图片中创建一个菱形

Image 在图片中创建一个菱形,image,matlab,image-processing,Image,Matlab,Image Processing,我要写一个程序,在一个特定的图像中画一个钻石 我写了这段代码 Img=zeros(256,256); for x=1:256 for y=1:256 if(y-x==128)||(y-x==-128)||(y+x==128) Img(x,y)=1; end end end imshow(Img); 我可以画三面菱形。 如何绘制第四面؟缺少的条件是y+x==384。因此,将if行替换为 if (y-x==128)||(y-x==-12

我要写一个程序,在一个特定的图像中画一个钻石 我写了这段代码

Img=zeros(256,256);
for x=1:256
    for y=1:256
     if(y-x==128)||(y-x==-128)||(y+x==128)
           Img(x,y)=1;
     end

    end
end
imshow(Img);

我可以画三面菱形。
如何绘制第四面؟

缺少的条件是
y+x==384
。因此,将
if
行替换为

if (y-x==128)||(y-x==-128)||(y+x==128)||(y+x==384)
如果坐标以
0
为中心,例如
-128:128
:

Img=zeros(257,257);
for x=-128:128
    for y=-128:128
        if(y-x==128)||(y-x==-128)||(y+x==128)||(y+x==-128)
           Img(129+x,129+y)=1;
        end
    end
end
imshow(Img);

正如@kkuilla所指出的,这很容易矢量化。请参见。

Luis Mendo在循环的
if
语句中确定了最后一个条件以绘制最后一条线。他的解决方案就是您想要的
for
循环解决方案

然而,如果你想要更矢量化的东西,一个更有效的方法是使用定义一个坐标网格,然后简单地应用一系列
逻辑
操作来获得你的菱形。换言之:

[x,y] = meshgrid(1:256, 1:256);
Img = abs(x-y) == 128 | x+y == 384 | x+y == 128;
imshow(Img);
因此,我们得到:


通常,对于给定大小的正方形图像,您可以通过以下方式使其适应任何大小的图像:

N = 256; %// Change here - width/height of your image
[x,y] = meshgrid(1:N, 1:N);
Img = abs(x-y) == floor(N/2) | x+y == floor(3*N/2) | x+y == floor(N/2);
imshow(Img);

我放置了一个
floor
操作,以防您想要指定一个不能被2平均整除的图像大小。然而,钻石的对称性看起来可能不正确,但无论如何代码都会工作。

我在等待矢量化解决方案…:-)@kkuilla Hahaha。我没想到,但是是的,这很容易做到。我正在删除矢量化部分,因为它已经出现在@kkuilla中。我想通过furie系列使用此代码对图像进行压缩。好吗?@LuisMendo-我希望你不介意我使用你最后的
if
语句并将其矢量化:)我不想在你发现问题的时候蒙蔽你首先是代码。顺便说一句,谢谢你链接到我的答案:)