元胞自動機: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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章