元胞自动机:game of life

元胞自动机是一种由元胞、元胞状态、以及状态更新规则构成的一个自动机。最有名的元胞自动机是1970年由英国数学家约翰提出的生命游戏(game of life),其规则如下:

  • 当周围存活的元胞是0个或1个时,其状态变为死亡;
  • 当周围存活的元胞是2个时,保持原样;
  • 当周围存活的元胞是3个是,其状态变为存活;
  • 当周围存活元胞是4个时,其状态变为死亡。

一个简单的例子:

如下图所示的元胞,每个元胞颜色表示不同的状态(黄色为存活,其它为死亡)。
在这里插入图片描述
经过一次迭代变为(这是一个规范的二维码,大家可以描一下看看是啥 ):
在这里插入图片描述

以上程序如下:

import cv2
img = cv2.imread("/home/toby/Pictures/gol.png",cv2.IMREAD_GRAYSCALE)
ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
rimg = cv2.resize(thresh1, (27,27))

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

nimg = np.array(rimg/255)

def round_sum(i,j):
    start_i = max(0, i-1)
    end_i = min(27, i+2)
    start_j = max(0, j-1)
    end_j = min(27, j+2)
    s = np.sum(nimg[start_i:end_i,start_j:end_j]) - nimg[i,j]
    return s

plt.imshow(nimg)
plt.show()
temp_nimg = np.zeros((27,27))
for i in range(27):
    for j in range(27):
        s = round_sum(i,j)
        if s >= 4:
            temp_nimg[i,j] = 0
        if s == 3:
            temp_nimg[i,j] = 1
        if s == 2:
            temp_nimg[i,j] = nimg[i,j]
        if s < 2:
            temp_nimg[i,j] = 0
plt.imshow(temp_nimg)
plt.show()

猜你喜欢

转载自blog.csdn.net/u013468614/article/details/104118486