馬爾可夫隨機場的python實現

2021-09-22 13:13:52 字數 4308 閱讀 8731

前幾天看圖網路的時候,不知怎麼從貝葉斯網路突然跳到了馬爾科夫隨機場,感覺還有點意思,不過還是沒有完全理清其中的邏輯,網上講的比較亂,參考博主on2way這篇博文《從貝葉斯理論到影象馬爾科夫隨機場》我梳理了一下思路,找時間總結一下,先挖乙個坑吧,由於博主給出的是matlab實現,我本身不怎麼使用matlab,於是就簡單的用python復現了一下思路,由於沒有使用kmeans演算法初始化,結果差距比較明顯,但是還算不錯,其中應該是有一些問題,包括最後多分類的介面沒有調好,還有四分類顯示結果貌似不太對,由於後天要考英語今天看來是沒法調完了,依舊是放著這個坑,有時間的時候**改一下,以下是python3的**,直接用jupyter notebook寫的:

import numpy as np

import cv2

import copy

from scipy.stats import norm

import matplotlib as plot

img = cv2.imread('lena.jpeg',0)

cluster_num = 4

maxiter = 50

#隨機初始化標籤

label = np.random.randint(0,cluster_num,img.shape)

def cal_pp(label):

result = np.zeros((cluster_num, 8, label.shape[0], label.shape[1]))

statis_result = np.zeros((cluster_num, label.shape[0], label.shape[1]))

for i in range(cluster_num):

label_temp = copy.deepcopy(label)

#先設定為4再設定為0,防止處理0時出錯

label_temp[label_temp!=i] = 4

label_temp[label_temp==i] = 1

label_temp[label_temp==4] = 0

#根據label_temp可以計算出8個方向的標籤

#從左上角起順時針方向,依次為0-8

result[i][0][:,0] = 0

result[i][0][0,:] = 0

result[i][0][1:,1:] = label_temp[:-1,:-1]

result[i][1][:,0] = 0

result[i][1][1:,:] = label_temp[:-1,:]

result[i][2][:,0] = 0

result[i][2][0,:] = 0

result[i][2][1:,1:] = label_temp[1:,:-1]

result[i][3][:,0] = 0

result[i][3][:,1:] = label_temp[:,:-1]

result[i][4][:,-1] = 0

result[i][4][:,:-1] = label_temp[:,1:]

result[i][5][:,0] = 0

result[i][5][-1,:] = 0

result[i][5][1:,:-1] = label_temp[1:,:-1]

result[i][6][-1,:] = 0

result[i][6][:-1,:] = label_temp[1:,:]

result[i][7][:,-1] = 0

result[i][7][-1,:] = 0

result[i][7][:-1,:-1] = label_temp[1:,1:]

statis_result[i] = result[i][0]+result[i][1]+result[i][2]+result[i][3]+result[i][4]+result[i][5]+result[i][6]+result[i][7]

statis_result = np.array(statis_result,dtype=np.float) / 8

#防止出現0,原因不清楚

statis_result[statis_result==0] = 0.001

return statis_result

def cal_lf(img, label):

result = np.zeros((cluster_num, 8, label.shape[0], label.shape[1]))

distribution_parameter = np.zeros((cluster_num,2),np.float)

for i in range(cluster_num):

img_temp = copy.deepcopy(img)

img_temp[label!=i] = 0

#根據原圖灰度統計每乙個標籤的分布和方差

img_list = img_temp.tolist()

img_list = [item for sublist in img_list for item in sublist if item!= 0]

#再根據原圖的灰度數值算出似然函式值

distribution_parameter[i][0] = np.mean(img_list)

distribution_parameter[i][1] = np.std(img_list)

#計算每一點屬於不同型別的概率

result_lf = np.zeros((cluster_num,label.shape[0],label.shape[1]),np.float)

for i in range(cluster_num):

result_lf[i] = norm(distribution_parameter[i][0],distribution_parameter[i][1]).pdf(img)

return result_lf

def update_label(img, init_label, maxiter):

label = init_label

for i in range(maxiter):

prior_probability = cal_pp(label)

likelihood = cal_lf(img,label)

probability = np.zeros((cluster_num,label.shape[0],label.shape[1]))

for j in range(cluster_num):

probability[j] = prior_probability[j]*likelihood[j]

#根據概率值更新label

max_probability = probability.max(0)

#label_one不需要,這一部分**需要做一下調整,時間緊迫先演示一下

label_two = probability[1]-max_probability

label_two[label_two!=0] = 4

label_two[label_two==0] = 1

label_two[label_two==4] = 0

label_three = probability[2]-max_probability

label_three[label_three!=0] = 4

label_three[label_three==0] = 2

label_three[label_three==4] = 0

label_four = probability[3]-max_probability

label_four[label_four!=0] = 4

label_four[label_four==0] = 3

label_four[label_four==4] = 0

label= label_two + label_three + label_four

#每次繪製一張

cv2.imshow("test",label)

cv2.waitkey(500)

cv2.destroyallwindows()

return label

#main函式中執行,博主使用jupyter notebook就沒有改了,請需要的自行改一下

final = update_label(img,label,maxiter)

貼一下大致效果:

其中前兩排是第1-8次迭代結果,最後一排是第12、16、20、24次迭代結果,效果還行

馬爾可夫隨機場 馬爾可夫隨機鏈

馬爾可夫過程是指下乙個時間點的值只與當前值有關係,與以前沒有關係 馬兒可夫隨機場 1馬兒可夫性質 它指的是乙個隨機變數序列按時間先後關係依次排開的時候,第n 1時刻的分布特性,與n時刻以前的隨機變數的取值無關 2隨機場 當給每乙個位置中按照某種分布隨機賦予相空間的乙個值之後,其全體就叫做隨機場 馬爾...

簡單通俗理解MRF馬爾可夫隨機場

馬爾可夫隨機場 markov random field 也有人翻譯為馬爾科夫隨機場,它包含兩層意思 一是什麼是馬爾可夫,二是什麼是隨機場。1 馬爾可夫一般是馬爾可夫性質的簡稱。它指的是乙個 隨機變數序列按時間先後關係依次排開的時候,第n 1時刻的分布特性,與n時刻以前的隨機變數的取值無關。拿天氣來打...

馬爾科夫隨機場

馬爾可夫鏈因安德烈 馬爾可夫 andrey markov,1856 1922 得名,是數學中具有馬爾可夫性質的離散時間隨機過程。該過程中,在給定當前知識或資訊的情況下,過去 即當期以前的歷史狀態 對於 將來 即當期以後的未來狀態 是無關的。時間和狀態都是離散的馬爾可夫過程稱為馬爾可夫鏈,簡記為 馬爾...