在图片中创建一个钻石

时间:2014-12-11 15:11:58

标签: 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);

enter image description here

我可以画三面钻石。 我如何画出第四面?

2 个答案:

答案 0 :(得分:3)

您缺少的条件是y+x==384。因此,请将<{1}}行替换为

if

如果你的坐标以if (y-x==128)||(y-x==-128)||(y+x==128)||(y+x==384) 为中心,那么条件会更加对称,比如0

-128:128

如@kkuilla所述,这可以很容易地进行矢量化。请参阅@rayryeng's answer

答案 1 :(得分:3)

Luis Mendo在你的循环的if语句中指定最后一个条件以绘制最后一行。如果您想要for循环解决方案,那么他的解决方案就是您正在寻找的。

但是,如果你想要更多矢量化的东西,更有效的方法是使用meshgrid定义一个坐标网格,然后简单地应用一系列logical操作来获得你的钻石。换句话说:

[x,y] = meshgrid(1:256, 1:256);
Img = abs(x-y) == 128 | x+y == 384 | x+y == 128;
imshow(Img);

我们得到:

enter image description here


通常,对于正方形的给定尺寸图像,您可以通过以下方式将其调整为任何尺寸的图像:

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整除的图像大小。但是,钻石的对称性可能看起来不正确,但代码无论如何都会起作用。