Python 马尔科夫图像分割代码

# -*- coding: utf-8 -*-
"""
Created on Wed Jun  6 13:38:42 2018


@author: Administrator
"""


import cv2
import numpy as np
import scipy.signal


img = cv2.imread('img_roi_4.bmp', 0)


img_double = np.array(img, dtype = np.float64)


cluster_num = 2


max_iter = 200


label  = np.random.randint(1, cluster_num + 1, size = img_double.shape)
#label = 2 * np.ones((70, 70))
iter  = 0
 
f_u = np.array([0,1,0,0,0,0,0,0,0]).reshape(3, 3)
f_d = np.array([0,0,0,0,0,0,0,1,0]).reshape(3, 3)
f_l = np.array([0,0,0,1,0,0,0,0,0]).reshape(3, 3)
f_r = np.array([0,0,0,0,0,1,0,0,0]).reshape(3, 3)
f_ul = np.array([1,0,0,0,0,0,0,0,0]).reshape(3, 3)
f_ur = np.array([0,0,1,0,0,0,0,0,0]).reshape(3, 3)
f_dl = np.array([0,0,0,0,0,0,1,0,0]).reshape(3, 3)
f_dr = np.array([0,0,0,0,0,0,0,0,1]).reshape(3, 3)


   
while iter < max_iter:
    iter = iter + 1
    print(iter)


    
    label_u  = cv2.filter2D(np.array(label, dtype = np.uint8), -1 , f_u)
    label_d  = cv2.filter2D(np.array(label, dtype = np.uint8), -1 , f_d)
    label_l = cv2.filter2D(np.array(label, dtype = np.uint8), -1 , f_l)
    label_r = cv2.filter2D(np.array(label, dtype = np.uint8), -1 , f_r)
    label_ul = cv2.filter2D(np.array(label, dtype = np.uint8), -1 , f_ul)
    label_ur = cv2.filter2D(np.array(label, dtype = np.uint8), -1 , f_ur)
    label_dl = cv2.filter2D(np.array(label, dtype = np.uint8), -1 , f_dl)
    label_dr = cv2.filter2D(np.array(label, dtype = np.uint8), -1 , f_dr)
   
    #label_u_out = cv2.filter2D(np.array(label, dtype = np.uint8), -1 , f_u)
    m, n = label.shape
    p_c = np.zeros((cluster_num, m ,  n))
    for i in range(cluster_num):
        label_i = (i+1) * np.ones((m, n))
        u_T = 1 * np.logical_not(label_i - label_u)
        d_T = 1 * np.logical_not(label_i - label_d)
        l_T = 1 * np.logical_not(label_i - label_l)
        r_T = 1 * np.logical_not(label_i - label_r) 
        ul_T = 1 * np.logical_not(label_i - label_ul)
        ur_T = 1 * np.logical_not(label_i - label_ur)
        dl_T = 1 * np.logical_not(label_i - label_dl)
        dr_T = 1 * np.logical_not(label_i - label_dr)
        temp1 = u_T + d_T + l_T + r_T + ul_T + ur_T + dl_T + dr_T
#        temp = 1 * np.logical_not(label_i - label_u) + 1 * np.logical_not(label_i - label_d)
#        +1 * np.logical_not(label_i - label_l) + 1 * np.logical_not(label_i - label_r) 
#        + 1 * np.logical_not(label_i - label_ul) + 1 * np.logical_not(label_i - label_ur) 
#        + 1 * np.logical_not(label_i - label_dl) + 1 * np.logical_not(label_i - label_dr) 
        p_c[i, :] = (1.0/8) * temp1
        
    p_c[p_c == 0] = 0.001
    mu = np.zeros((1, cluster_num))
    sigma = np.zeros((1, cluster_num))
    for i in range(cluster_num):
        index = np.where(label == (i+1))
        data_c = img[index]
        mu[0, i] = np.mean(data_c)
        sigma[0, i] = np.var(data_c)
        
    p_sc = np.zeros((cluster_num, m , n))
    one_a = np.ones((m, n))
    
    for j in range(cluster_num):
        MU = mu[0, j]* one_a
        p_sc[j, :] = (1.0/np.sqrt(2 * np.pi * sigma[0, j])) * np.exp(-1. * (( img - MU)**2) /(2 * sigma[0, j]))
    
    X_out =  np.log(p_c) + np.log(p_sc)   
    label_c = X_out.reshape(2, m * n)
    label_c_t = label_c.T
    label_m = np.argmax(label_c_t, axis = 1)
    label_m = label_m + np.ones(label_m.shape)
    #label_1= label_m.reshape(m, n)
    label= label_m.reshape(m, n)
    


label = label -  np.ones(label.shape)
lable_w = 255 * label


cv2.imwrite('label_4.bmp', lable_w)

你可能感兴趣的:(图像处理,MRF)