元胞自動機是一種由元胞、元胞狀態、以及狀態更新規則構成的一個自動機。最有名的元胞自動機是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()