Python复现颜色图绘制大赛的作品_果州做题家的博客-程序员宅基地

技术标签: python  其他  opencv  开发语言  

Python复现颜色图绘制大赛的作品

受slandarer大佬启发,自己用Python复现了一下七年前的一个颜色图绘图大赛的一些作品。把复现过程记录如下:
在这里插入图片描述
这场比赛居然已经是七年前的事情了,大佬A Frayed Knot在StackExchange
上发起了挑战,举办了名为“Tweetable数学艺术”的比赛(实际上活动整整进行了一年半)

比赛规则如下:

使用C++代码或格式与C++类似的代码,使用不多于140个字符,通过输入x,y坐标输出R,G,B颜色值的形式构造函数,并生成一张1024x1024大小的图片。

挑战发起者给出了的一个基础示例:

/* 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++和Python跑了一遍发现效果与之有差异,估计是有写错的地方或者C++各种版本不同格式转换的特性,期待大家的指出。我将其改写为python版本:

导入工具包

import cv2
import numpy as np
#导入python绘图matplotlib
import matplotlib.pyplot as plt
#使用ipython的魔法方法,将绘制出的图像直接嵌入在notebook单元格中
%matplotlib inline
#定义可视化图像函数
def look_img(img):
    '''opencv读入图像格式为BGR,matplotlib可视化格式为RGB,因此需将BGR转RGB'''
    try:  #显示彩图
        img_RGB = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
        plt.imshow(img_RGB)
        plt.show()
    except: #显示灰度图或黑白图
        plt.imshow(img,cmap="gray")
        #plt.axis('off')
        plt.show()

颜色图1

h = 1024
w = 1024
img = 255 * np.ones((h ,w , 3), dtype=np.uint8)  #生成一张1024*1024像素的白图
 
for i in range(h):  # 循环遍历所有像素点,替换像素点
    for j in range(w):        
        img[i,j,2] = ((i%j)&(j%i))&255 if (i&j) else 0
        img[i,j,1] = ((i%j)+(j%i))&255 if (i&j) else 0
        img[i,j,0] = ((i%j)|(j%i))&255 if (i&j) else 0
 
look_img(img)

在这里插入图片描述

同时自己也做了一些尝试,发现若是将代码微调,其结果也非常有意思:以下是改写版:

颜色图2

h = 1024
w = 1024
img = 255 * np.ones((h ,w , 3), dtype=np.uint8)  #生成一张1024*1024像素的白图
 
for i in range(h):  # 循环遍历所有像素点,替换像素点
    for j in range(w):        
        img[i,j,2] = ((i%j)&(j%i))&200 if (i&j) else 0
        img[i,j,1] = ((i%j)+(j%i))&200 if (i&j) else 0
        img[i,j,0] = ((i%j)|(j%i))&200 if (i&j) else 0
 
look_img(img)

在这里插入图片描述

颜色图3

h = 1024
w = 1024
img = 255 * np.ones((h ,w , 3), dtype=np.uint8)  #生成一张1024*1024像素的白图
 
for i in range(h):  # 循环遍历所有像素点,替换像素点
    for j in range(w):        
        img[i,j,2] = ((i%j)&(j%i))&255 if (i&j) else 0
        img[i,j,1] = ((i%j)^(j%i))&255 if (i&j) else 0
        img[i,j,0] = ((i%j)|(j%i))&255 if (i&j) else 0
 
look_img(img)

在这里插入图片描述

颜色图4

trichoplax大佬——方格布

正常方格布:

h = 1024
w = 1024
img = 255 * np.ones((h ,w , 3), dtype=np.uint8)  #生成一张1024*1024像素的白图
DIM=1024
 
for i in range(h):  # 循环遍历所有像素点,替换像素点
    for j in range(w):
        s=3./(j+99)        
        img[i,j,2] = (round((i+DIM)*s+j*s)%2+round((DIM*2-i)*s+j*s)%2)*127
        img[i,j,1] = (round((i+DIM)*s+j*s)%2+round((DIM*2-i)*s+j*s)%2)*127
        img[i,j,0] = (round((i+DIM)*s+j*s)%2+round((DIM*2-i)*s+j*s)%2)*127
 
look_img(img)

在这里插入图片描述

颜色图5

扭曲并添加颜色:

h = 1024
w = 1024
img = 255 * np.ones((h ,w , 3), dtype=np.uint8)  #生成一张1024*1024像素的白图
DIM=1024
 
for i in range(h):  # 循环遍历所有像素点,替换像素点
    for j in range(w):
        s=3./(j+99)
        y=(j+np.sin((i*i+(j-700)**2*5)/100./DIM)*35)*s        
        img[i,j,2] = (round((i+DIM)*s+y)%2+round((DIM*2-i)*s+y)%2)*127
        img[i,j,1] = (round(5*((i+DIM)*s+y))%2+round(5*((DIM*2-i)*s+y))%2)*127
        img[i,j,0] = (round(29*((i+DIM)*s+y))%2+round(29*((DIM*2-i)*s+y))%2)*127
 
look_img(img)

在这里插入图片描述

颜色图6

大佬cjfaure——尖锐漩涡

h = 1024
w = 1024
img = 255 * np.ones((h ,w , 3), dtype=np.uint8)  #生成一张1024*1024像素的白图
 
for i in range(h):  # 循环遍历所有像素点,替换像素点
    for j in range(w):        
        img[i,j,2] = int(int(np.sqrt((73-i)**2+(609-j)**2)+1)/(np.sqrt(abs(np.sin(int(np.sqrt((860-i)**2+(162-j)**2))/115)))+1)/200)*90
        img[i,j,1] = int(int(np.sqrt((160-i)**2+(60-j)**2)+1)/(np.sqrt(abs(np.sin(int(np.sqrt((86-i)**2+(860-j)**2))/115)))+1)/200)*90
        img[i,j,0] = int(int(np.sqrt((844-i)**2+(200-j)**2)+1)/(np.sqrt(abs(np.sin(int(np.sqrt((250-i)**2+(20-j)**2))/115)))+1)/200)*90
 
look_img(img)

在这里插入图片描述

颜色图7

对参数进行微调:

h = 1024
w = 1024
img = 255 * np.ones((h ,w , 3), dtype=np.uint8)  #生成一张1024*1024像素的白图
 
for i in range(h):  # 循环遍历所有像素点,替换像素点
    for j in range(w):        
        img[i,j,2] = int(int(np.sqrt((148-i)**2+(1000-j)**2)+1)/(np.sqrt(abs(np.sin(int(np.sqrt((500-i)**2+(400-j)**2))/115)))+1)/200)*90
        img[i,j,1] = int(int(np.sqrt((610-i)**2+(60-j)**2)+1)/(np.sqrt(abs(np.sin(int(np.sqrt((864-i)**2+(860-j)**2))/115)))+1)/200)*90
        img[i,j,0] = int(int(np.sqrt((180-i)**2+(100-j)**2)+1)/(np.sqrt(abs(np.sin(int(np.sqrt((5-3-i)**2+(103-j)**2))/115)))+1)/200)*90
 
look_img(img)

在这里插入图片描述

颜色图8

cjfaure大佬——音乐谱

h = 1024
w = 1024
img = 255 * np.ones((h ,w , 3), dtype=np.uint8)  #生成一张1024*1024像素的白图
 
for i in range(h):  # 循环遍历所有像素点,替换像素点
    for j in range(w):        
        img[i,j,2] = (((int(100*np.sin(int((i+400)*(j+100)/11115)))&i)*1029)%256)*5
        img[i,j,1] = (((int(100*np.sin(int((i+400)*(j+100)/11115)))&i)*1029)%256)*5
        img[i,j,0] = (((int(100*np.sin(int((i+400)*(j+100)/11115)))&i)*1029)%256)*5
 
look_img(img)

在这里插入图片描述

颜色图9

色带代码及图片:

h = 1024
w = 1024
img = 255 * np.ones((h ,w , 3), dtype=np.uint8)  #生成一张1024*1024像素的白图
 
for i in range(h):  # 循环遍历所有像素点,替换像素点
    for j in range(w):        
        img[i,j,2] = np.cos(np.arctan2(j-512,i-512)/2)**2*255
        img[i,j,1] = (np.cos(np.arctan2(j-512,i-512)/2-2*np.arccos(-1)/3))**2*255
        img[i,j,0] = (np.cos(np.arctan2(j-512,i-512)/2+2*np.arccos(-1)/3))**2*255
 
look_img(img)

在这里插入图片描述

颜色图10

Snake大佬——三色谢宾斯基三角形

h = 1024
w = 1024
img = 255 * np.ones((h ,w , 3), dtype=np.uint8)  #生成一张1024*1024像素的白图
 
for i in range(h):  # 循环遍历所有像素点,替换像素点
    for j in range(w):        
        img[i,j,2] = int(np.cos(i&j))*255
        img[i,j,1] = int(np.cos((1024-i)&(1024-j)))*255
        img[i,j,0] = int(np.tan((i|j)))*125
 
look_img(img)

在这里插入图片描述

(The End)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/baidu/article/details/126533883

智能推荐

实现一个通讯录; 通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名、性别、年龄、电话、住址_icehuyujie的博客-程序员宅基地

本篇文章用来实现一个简单的通讯录,如有不当的地方还希望能够多加指正。要求:实现一个通讯录; 通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名、性别、年龄、电话、住址 提供方法: 1. 添加联系人信息 2. 删除指定联系人信息 3. 查找指定联系人信息 4. 修改指定联系人信息 5. 显示所有联系人信息 6. 清空所有联系人 7. 以名字排序所有联系人 test.c#include "...

jpa01_weixin_30808253的博客-程序员宅基地

JPAJava Persistence API, 即Java 持久化APIJPA规范本质上就是一种ORM规范,提供了一些编程的API接口,但具体实现则由服务厂商来提供实现。 入门案例1.创建maven ,导入坐标2.配置jpa的核心配置文件,创建在META-INFO目录下,persistence.xml3.编写客户实体类4.配...

2021-05-08_步入中年的狗的博客-程序员宅基地

33事实证明我得每天写csdn,因为少写了25号的,就少报了一天,245块啊啊啊啊啊啊啊啊啊够我4天的饭钱了,又不敢重新跟老大讲,哭泣。不过想想人生找到的第一份实习,竟然钱给的还好,不用打卡能偷偷溜出去,迟到也没被说过(每次都是意外迟到,很不好我知道),晚上很早出去吃饭也没事,有三周左右没写代码只是在看,公司作为作为做算法的不算小有名气,算个中厂?环境特别好(桌子宽靠窗户亮),mentor虽然知道我比较菜平时也很忙,但是跟我讲东西的时候非常耐心(我很笨,听不懂人话的那种),感觉增删改查熟悉了很多,组件啊

gradle 安装错误:JAVA_HOME is set to an invalid directory: /usr/lib/jvm/default-java_矛盾论的博客-程序员宅基地

fromhttp://blog.csdn.net/newchenxf/article/details/53169016手动安装gradle时, 即sudo apt-get install gradle然后,要使用gradle,输入 gradle -version,结果,出现了一下错误:[email protected]:~$ gradle --version

mysql tode_【20201007】Python操作MySQL数据库_Dewey Frank的博客-程序员宅基地

介绍介绍今天我们学习如何通过Python操作MySQL数据库。在Python2.7下使用的是pymysql这个软件包,跟着福哥来操作吧。安装安装pymysql直接使用pip安装即可pip insall pymysql授权MySQL数据库服务器默认只能在安装了数据库服务器的本机操作,也就是在TFLinux上操作,但是我们的python是安装在TFWindows上的啊!所以,我们要授权任何电脑都可以操...

随便推点

剑指offer------递归------斐波那契数列_剑指offer-斐波那契数列_Jack-Curry的博客-程序员宅基地

题目大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。(n<=39)斐波那契数列公式为:思路这道题递归很好写,但是存在很严重的效率问题。我们以求解f(10)为例类分析递归的求解过程。想求f(10),需要先求得f(9)和f(8)。同样,想求得f(9),需要先求的f(8)和f(7)....我们可以用树形结构来表示这种依赖关系,如下图所示:我...

分享个WIFI 一键配置原理-以ESP8266为例_esp8266wifi模块控制开关_Surferqing_的博客-程序员宅基地

1wifi模块可以连接路由器,是不是就能实现远程控制呢?         wifi模块可以连接路由器,说明实现路由器的局域网控制没有问题。 2 远程控制的过程中,自己家里面搭建服务器可以吗?        远程控制需要服务器,但是用户通过自己的电脑在家里搭建服务器实现的可能性很小,因为搭建服务器需要公网的Ip还有服务器相关的软件开发,并且维护过程是一个成本较高的开支。3 现在...

BMZCTF:2020sdnisc-损坏的流量包_ctf 流量包损坏_末 初的博客-程序员宅基地

http://bmzclub.cn/challenges#2020sdnisc-%E6%8D%9F%E5%9D%8F%E7%9A%84%E6%B5%81%E9%87%8F%E5%8C%851.pcapng无法使用wireshark打开可能破坏了pcapng的文件结构,但是应该不会破坏数据内容,尝试使用foremost看看能不能从这个数据包中分离出什么东西得到一个zip压缩包,解压得到key.txtZmxhZ3tzZG5pc2NfbmV0X3NRMlgzUTl4fQ==PS C:\User

异步上传文件报错,重复使用java流_jackson1024的博客-程序员宅基地

如果上传的时候,是同步上传的,不会出现问题。如果是异步上传的,如果你传入的异步方法是 MultipartFile file,就会包下面的错java.io.FileNotFoundException: D:\usr\local\tomcat\work\Tomcat\localhost\upload_46ba607a_d50c_4618_9b66_234953a0ba1f_00000002.tmp...

莫比乌斯函数_weixin_34370347的博客-程序员宅基地

在讲这个函数之前。最好先了解欧拉函数。我们用 \ 记为整除。 记得小学的时候整除和整除以的概念么?别混淆。 2整除4 记作 2\4。欧拉函数用来表示。那么根据法里级数的展开(这个感觉和ACM关系不大就先不介绍了。大概讲的就是构造所有最简分数的一种树。而法里级数n定义分母<=n的最简分数。)比如对于分母为12.化简后:分别为:1/12 1/6 1/...