python实现MRF图像分割

MRF理论部分

理论部分可参考下面博客,我在这就不多赘述

https://blog.csdn.net/dlaicxf/article/details/52625932?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158748842719724845049845%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=158748842719724845049845&biz_id=0&utm_source=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v25-1

MRF实现

import matplotlib.pyplot as plt
import cv2
import numpy as np
from sklearn.cluster import k_means_

path = r"D:\360MoveData\Users\hp\Desktop\ForStudents2020\实验用图\1 kmeans\test.bmp"
img = np.array(plt.imread(path))
imgGray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
imgGray = imgGray / 255
imgCopy = imgGray.copy()
imgpixel = (imgCopy.flatten()).reshape((imgGray.shape[0]*imgGray.shape[1], 1))
kind = 2
kmeans = k_means_.KMeans(n_clusters=kind)
label = kmeans.fit(imgpixel)
imgLabel = np.array(label.labels_).reshape(imgGray.shape)
plt.figure()
plt.imshow(imgLabel, cmap="gray")
imgMrf = np.zeros_like(imgLabel)
cycle = 10
c = 0
sumList = [0] * kind
numList = [0] * kind
MeanList = [0] * kind
stdSumList = [0] * kind
stdList = [0] * kind
for i in range(1, imgLabel.shape[0] - 1):
    for j in range(1, imgLabel.shape[1] - 1):
        x = imgLabel[i, j]
        sumList[x] += imgGray[i, j]
        numList[x] += 1
for k in range(kind):
    MeanList[k] = sumList[k] / numList[k]

for i in range(1, imgLabel.shape[0] - 1):
    for j in range(1, imgLabel.shape[1] - 1):
        x = imgLabel[i, j]
        stdSumList[x] += (imgGray[i, j] - MeanList[x]) ** 2
for i in range(kind):
    stdList[i] = np.sqrt(stdSumList[i] / numList[i])
def gas(mean, std, x):
    return 1 / (np.sqrt(2 * np.pi) * std) * np.exp(-0.5 * (x - mean)**2 / std**2)

while c < cycle:
    for i in range(1, imgLabel.shape[0] - 1):
        for j in range(1, imgLabel.shape[1] - 1):
            uList = [0] * kind
            for k in range(kind):
                template = np.ones((3, 3)) * k
                template[1, 1] = np.inf
                u = np.exp(- np.sum(template == imgLabel[i - 1: i + 2, j - 1: j + 2]) + 8) *\
                    gas(MeanList[k], stdList[k], imgGray[i, j])
                uList[k] = u
                sumList[k] += imgGray[i, j]
                numList[k] += 1
            imgMrf[i, j] = uList.index(max(uList))
    for i in range(kind):
        MeanList[i] = sumList[i] / numList[i]
    for i in range(1, imgLabel.shape[0] - 1):
        for j in range(1, imgLabel.shape[1] - 1):
            x = imgLabel[i, j]
            stdSumList[x] += (imgGray[i, j] - MeanList[x]) ** 2
    for i in range(kind):
        stdList[i] = np.sqrt(stdSumList[i] / numList[i])
    imgLabel = imgMrf.copy()
    c += 1
    print("第{}代结束".format(c))
plt.figure()
plt.imshow(imgLabel, cmap="gray")
plt.figure()
plt.imshow(1-imgLabel, cmap="gray")
plt.show()

上述的思路为:先用kmean进行初始化得到每个像素属于哪一类,<>在假设每类的像素值属于高斯分布的情况下,估计出高斯分布的均值与方差,然后利用马尔科夫随机场中能量函数和朴素贝叶斯的概念,最大化后验概率的方法得到每一个像素值新的一轮的分类,然后在重新回到<>进行循环,知道迭代次数达到。

分割结果展示

以下分别是原图、2聚类、2分割的图像。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 8
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
MRF是指马尔可夫随机场(Markov Random Field),它是一种用于进行随机过程建模和分析的数学工具。具体到计算机视觉领域,MRF常被用于图像分割问题。 图像分割是指将一幅图像划分为具有一定语义意义的区域或对象的过程。而MRF图像分割中的应用,主要是通过考虑像素间的空间关系和像素之间的相似性来实现图像分割MRF假设图像中每个像素的标签(即所属的分割区域)是依赖于其周围邻居像素的标签的。具体地说,每个像素的标签被视为是一个随机变量,其取值受到其邻居像素标签的影响。MRF通过定义一个势能函数,衡量了每个像素的标签和其邻居像素标签之间的相似性。 而在使用Python进行MRF图像分割时,可以利用一些开源的图像处理,如OpenCV和scikit-image,结合MRF模型来实现分割算法。一般而言,大致的步骤包括: 1. 对输入图像进行预处理,如灰度化、去噪等。 2. 根据MRF模型的假设,定义相应的势能函数,如基于像素间灰度差异的势能函数。 3. 利用最大后验概率(MAP)或最大似然估计(MLE)方法,通过优化算法(如迭代条件随机场算法)来估计每个像素的标签。 4. 根据估计的标签,将图像进行分割,可采用阈值处理或区域生长等方法。 总之,MRF是一种有效的图像分割方法,通过考虑像素间的空间关系和相似性,能够准确地将图像划分为具有语义意义的区域。在Python中,利用相应的图像处理MRF模型,可以实现高效的图像分割算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值