MATLAB | 我用MATLAB复刻了这场颜色图生成大赛的作品
Posted slandarer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB | 我用MATLAB复刻了这场颜色图生成大赛的作品相关的知识,希望对你有一定的参考价值。
我用MATLAB复刻了这场颜色图绘制大赛的作品
这场比赛居然已经是七年前的事情了,大佬A Frayed Knot在StackExchange上发起了挑战,举办了名为Tweetable Mathematical Art的比赛(实际上活动整整进行了一年半)
比赛规则如下:
使用C++代码或格式与C++类似的代码,使用不多于140个字符,通过输入x,y坐标输出R,G,B颜色值的形式构造函数,并生成一张1024x1024大小的图片。
挑战发起者给出了的一个基础示例:
3z2pa
/* RED */
return i&&j?(i%j)&(j%i):0;
/* GREEN */
return i&&j?(i%j)+(j%i):0;
/* BLUE */
return i&&j?(i%j)|(j%i):0;
但这个我拿c++和matlab跑了一下发现爱你效果完全不是那样的,应该是有点写错的地方,期待大家的指出,同时发现Wolfram中国区一行代码大赛杨永康作品和这个很相似,将其改写为matlab改写版:
[X,Y]=meshgrid(0:1023);
P(:,:,1)=bitand(bitand(mod(X,Y),mod(Y,X)),255);
P(:,:,2)=bitand(mod(X,Y)+mod(Y,X),255);
P(:,:,3)=bitand(bitor(mod(X,Y),mod(Y,X)),255);
imshow(uint8(P))
同时我自己做了很多尝试,同时发现若是将代码微调至如下代码,其结果也非常有意思:
% @author:slandarer
[X,Y]=meshgrid(0:1023);
P(:,:,1)=bitand(bitand(mod(X,Y),mod(Y,X)),255);
P(:,:,2)=bitand(bitxor(mod(X,Y),mod(Y,X)),255);
P(:,:,3)=bitand(bitor(mod(X,Y),mod(Y,X)),255);
imshow(uint8(P))
% [X,Y]=meshgrid(0:1023);
% P(:,:,1)=mod(bitand(mod(X,Y),mod(Y,X)),255);
% P(:,:,2)=mod(bitxor(mod(X,Y),mod(Y,X)),255);
% P(:,:,3)=mod(bitor(mod(X,Y),mod(Y,X)),255);
% imshow(uint8(P))
trichoplax大佬——方格布
正常方格布:
[i,j]=meshgrid(0:1023);
s=3./(j+99);DIM=1024;
P=(mod(round((i+DIM).*s+j.*s),2)+mod(round((DIM.*2-i).*s+j.*s),2)).*127;
imshow(uint8(P))
扭曲并添加颜色:
[i,j]=meshgrid(0:1023);
s=3./(j+99);DIM=1024;
y=(j+sin((i.*i+(j-700).^2.*5)./100./DIM).*35).*s;
P(:,:,1)=(mod(round((i+DIM).*s+y),2)+mod(round((DIM.*2-i).*s+y),2)).*127;
P(:,:,2)=(mod(round(5.*((i+DIM).*s+y)),2)+mod(round(5.*((DIM.*2-i).*s+y)),2)).*127;
P(:,:,3)=(mod(round(29.*((i+DIM).*s+y)),2)+mod(round(29.*((DIM.*2-i).*s+y)),2)).*127;
imshow(uint8(P))
Martin Ender大佬——随机油画及色带
以下代码因为跑的太慢了将更改颜色概率调到了1/100,想要还原原作品可以将各个数值进行调整。
function randpainter
r=@(n)randi([0,n-1],[1,1]);
R=zeros(1024,1024);G=zeros(1024,1024);B=zeros(1024,1024);
for i=1:1024
for j=1:1024
R(i,j)=RD(i,j);
G(i,j)=GR(i,j);
B(i,j)=BL(i,j);
end
end
P(:,:,1)=R;P(:,:,2)=G;P(:,:,3)=B;
imshow(uint8(P))
function C=RD(i,j)
if R(i,j)~=0
else
if r(99)~=0,R(i,j)=RD(mod(i+r(2),1024)+1,mod(j+r(2),1024)+1);
else,R(i,j)=r(256);disp('一缕数值填入完成');
end
end;C=R(i,j);disp([i,j,C]);
end
function C=GR(i,j)
if G(i,j)==0
if r(99)~=0,G(i,j)=GR(mod(i+r(2),1024)+1,mod(j+r(2),1024)+1);
else,G(i,j)=r(256);disp('一缕数值填入完成');
end
end;C=G(i,j);disp([i,j,C]);
end
function C=BL(i,j)
if B(i,j)==0
if r(99)~=0,B(i,j)=BL(mod(i+r(2),1024)+1,mod(j+r(2),1024)+1);
else,B(i,j)=r(256);disp('一缕数值填入完成');
end
end;C=B(i,j);disp([i,j,C]);
end
end
[i,j]=meshgrid(0:1023);
P(:,:,1)=cos(atan2(j-512,i-512)./2).^2.*255;
P(:,:,2)=(cos(atan2(j-512,i-512)./2-2.*acos(-1)/3)).^2*255;
P(:,:,3)=(cos(atan2(j-512,i-512)./2+2.*acos(-1)/3)).^2*255;
imshow(uint8(P))
大佬cjfaure——尖锐漩涡
C++有很多离谱的类型转换,这些特性用MATLAB来实现需要多写很多代码:
[i,j]=meshgrid(0:1023);
P(:,:,1)=floor(floor(sqrt((73-i).^2+(609-j).^2)+1)./(sqrt(abs(sin(floor(sqrt((860-i).^2+(162-j).^2))./115)))+1)./200).*90;
P(:,:,2)=floor(floor(sqrt((160-i).^2+(60-j).^2)+1)./(sqrt(abs(sin(floor(sqrt((86-i).^2+(860-j).^2))./115)))+1)./200).*90;
P(:,:,3)=floor(floor(sqrt((844-i).^2+(200-j).^2)+1)./(sqrt(abs(sin(floor(sqrt((250-i).^2+(20-j).^2))./115)))+1)./200).*90;
imshow(uint8(P))
对参数进行微调:
[i,j]=meshgrid(0:1023);
P(:,:,1)=fix(fix(sqrt((148-i).^2+(1000-j).^2)+1)./(sqrt(abs(sin(fix(sqrt((500-i).^2+(400-j).^2))./115)))+1)./200).*90;
P(:,:,2)=fix(fix(sqrt((610-i).^2+(60-j).^2)+1)./(sqrt(abs(sin(fix(sqrt((864以上是关于MATLAB | 我用MATLAB复刻了这场颜色图生成大赛的作品的主要内容,如果未能解决你的问题,请参考以下文章