当前位置: 首页 > news >正文

2024.9.14 Python与图像处理新国大EE5731课程大作业,马尔可夫随机场和二值图割,校正立体图像的深度

1.马尔科夫随机场和二值图割

马尔可夫随机场(MRF, Markov Random Field):
MRF 是一种用来描述图像像素之间空间关系的概率模型。它假设图像中的像素不仅取决于自身的值,还与周围像素有关。这种模型经常用于图像分割、去噪等任务。
在去噪问题中,MRF 可以用于表示像素之间的关联性,确保去噪过程中不仅关注单个像素,还考虑周围像素的影响。
二值图割(Binary Graphcuts):
图割算法是一种常用于图像分割和去噪的技术。它通过将图像像素建模为图中的节点,并使用图割技术来最小化能量函数,从而实现分割或去噪。
二值图割的意思是将像素分类为两个类别,通常是“前景”和“背景”,或者“噪声”和“非噪声”。
结合图论中的最小割问题,可以找到一种最优的像素分割方式,从而去除噪声。

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy import linalg
import random as rm
import math
import cv2
import random
import gco# foreground blue
fg = np.array([0,0,255])
# background yellow
bg = np.array([245,210,110])im = cv2.imread('bayes_theorem.jpg',cv2.IMREAD_COLOR)
im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)#show the original figure
plt.figure( figsize=(15,15) )
plt.imshow(im)# distance
def dis(xi,xj):return np.sum(np.abs(xi - xj))/3/255# generate nodes
def nodes(im,lmd,fg,bg):[row,col,c] = im.shapeunary = np.zeros([row,col,2])for x in range(0,col):for y in range(0,row):# pixel colorpc = im[y,x,:]# data termfdf = dis(pc,fg)fdb = dis(pc,bg)# prior term# right neighbor pixelfpr = 1# below neighbor pixelfpb = 1unary[y,x,0] = fdf + lmd*(fpr + fpb)unary[y,x,1] = fdb + lmd*(fpr + fpb)return unary# graph cut
def gcut(unary,lmd):[row,col,c] = unary.shapesmooth = 1 - np.eye(2)labels = gco.cut_grid_graph_simple(unary, smooth*lmd, n_iter=-1)labels = labels.reshape(row,col)return labels# original iamge denoise
def dimage(im,labels):[row,col,c] = im.shapedim = np.zeros(im.shape)for i in range(0,row):for j in range(0,col):# backgroundif labels[i,j] == 1:dim[i,j] = bgelif labels[i,j] == 0:dim[i,j] = fgreturn dim.astype(int)# lambda = 1
lmd = 1
# nodes
unary = nodes(im,lmd,fg,bg)
# graphcut
label = gcut(unary,lmd)
# image denoising
dim = dimage(im,label)

这个代码实现了一个使用图割算法(Graph Cut)进行图像去噪的简单例子。代码的主要思想是使用马尔可夫随机场(MRF)模型,将图像像素分为两类:前景(蓝色)和背景(黄色),并通过图割来优化像素的分割,以达到去除噪声的目的。
1.距离函数dis():这个函数用于计算两个像素点之间的色彩距离。这里计算的是每个像素的绝对色差,然后进行归一化处理(将颜色差值除以 255,保持在 0-1 之间)
2.生成节点:nodes(),这个函数的作用是构建每个像素的代价(unary term),即每个像素分别属于前景和背景的代价。
3.gcut()图割算法通过最小化能量函数,分割前景和背景,返回每个像素的标签(0:前景,1:背景)在这一步中已经进行了最小化处理了,给每个像素一个前景或者后景的标签
4.def dimage(im,labels):这个函数染色
5.通过设置 lambda 参数来调整平滑项的权重。较大的 lambda 会增强对像素间平滑性的惩罚,使图像看起来更平滑,但也可能会损失细节。生成 unary 代价矩阵,执行图割,最终生成去噪后的图像。
在这里插入图片描述

效果图:
请添加图片描述
在这里插入图片描述

2.校正立体图像的深度

主要任务是图像匹配和视差计算,用来将两个深度图像进行对比,从而估计深度信息。具体来说,通过计算两幅图像中对应像素点之间的匹配,生成一个视差图,进而可能用于3D重建或者深度信息提取。

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy import linalg
import random as rm
import math
import cv2
import random
import gcoim1 = cv2.imread('depth_im1.png',cv2.IMREAD_COLOR)
im1 = cv2.cvtColor(im1, cv2.COLOR_BGR2RGB)
im2 = cv2.imread('depth_im2.png',cv2.IMREAD_COLOR)
im2 = cv2.cvtColor(im2, cv2.COLOR_BGR2RGB)im = np.hstack((im1,im2))
#show the original figure
plt.figure( figsize=(15,15) )
plt.imshow(im)

使用 OpenCV 读取两张深度图(im1 和 im2),并将它们水平拼接成一张图,然后显示出来。
在这里插入图片描述

# distance
def distance(xi,xj):return np.sum(np.abs(xi - xj))/3def median(data):data.sort()half = len(data) // 2return (data[half] + data[~half])/2def mode(data):data = list(data)return max(set(data),key=data.count)

distance:计算两个像素的欧几里得距离
median:返回列表的中值
mode:返回列表的众数值

def Ddistribution(im1,im2):size1 = im1.shapesize2 = im2.shapeif size1 != size2 : raise ValueError('input shape not matches')dis_col = []for i in range(size1[0]):Dis = np.zeros(size1[1])for j in range(size1[1]):pixel = im1[i,j]im2_pixel = im2[i,j:]difference = abs(im2_pixel - pixel)dis = np.sum(difference,axis = 1) / 3disparity = np.argmin(dis)if dis[disparity] < 5 :Dis[j] = disparitydisp = [p for p in Dis if p > 0]dis_col.append(mode(disp))return dis_col

分布:遍历一幅图像中的所有像素,得到两幅图像的视差值范围
计算图像 im1 和 im2 之间的视差分布,逐行计算每个像素在 im1 和 im2 之间的最小差异,并且记录最匹配的位移量(视差)。

# generate nodes
def nodes(im1,im2,Disparity,depth = None):# input protection size1 = im1.shapesize2 = im2.shapeif size1 != size2 : raise ValueError('input shape not matches')[row,col,c] = size1# preprocessing: get the disparity distribution first for getting D: dmin and dmax 
#     Disparity = Ddistribution(im1,im2)dmin = min(Disparity) dmax = max(Disparity) if depth == None:depth = int(dmax - dmin)else :depth = int(depth)step = (dmax - dmin) / depth
#     print(Disparity)print('dmin:',dmin,'dmax',dmax)unary = np.zeros([row,col,depth])for x in range(0,row):for y in range(0,int(col - dmax)):# pixel colorpixel1 = im1[x,y]labels = np.zeros(depth)for i in range(depth):if i < depth - 1:pixel2_index_start = round(i * step + dmin)pixel2_index_end = round((i+1) * step + dmin)elif i == depth - 1:pixel2_index_start = round(i * step + dmin)pixel2_index_end = int(dmax)pixel2 = im2[x,y+pixel2_index_start:y+pixel2_index_end]dis = []for p in pixel2:dis.append(distance(pixel1,p))dis_min = min(dis)labels[i] = dis_min / 255unary[x,y] = labels#         print('label computing: %.2f%%'%(x/row)*100)unary_cut = unary[:,:int(col-dmax),:] * depthreturn unary_cut, depth

节点:根据计算出的视差生成数据项,D(dmax - dmin)的深度等于视差的最大值减去视差的最小值
生成图像匹配的能量(unary)矩阵,每个像素点有多个视差候选值(基于不同的深度),该函数计算每个像素与可能的匹配点之间的差异并归一化为能量值。
Disparity 用于确定视差的上下限。
作用: 这个步骤通过遍历图像中的每一个像素点,计算它在不同视差下的匹配质量,输出的 unary 是图像的视差匹配成本图,后续会用于图割算法。

# graph cut
def gcut(unary,depth,lmd):[row,col,c] = unary.shapefp = np.zeros([depth,depth])for i in range(depth):for j in range(depth):fp[i,j] = abs(i-j)labels = gco.cut_grid_graph_simple(unary, fp*lmd, connect = 8, n_iter=-1)labels = labels.reshape(row,col)labels = labels[:,depth:]return labelsDisparity = Ddistribution(im2,im1)
print(min(Disparity),max(Disparity))unary,depth = nodes(im2,im1,Disparity)

gcut:先生成先验项,然后进行图切割并返回标签
使用图割算法(graph cut)对能量矩阵进行全局优化,最终得到每个像素点的最佳视差值(标签)。这里的图割通过计算视差标签之间的平滑约束,确保邻近的像素视差值不会有太大跳变。
作用: 在视差图中,优化每个像素点的视差标签,使得输出的结果更连贯和自然。

lmd = 0.1
labels = gcut(unary,depth,lmd)plt.figure( figsize=(8,8) )
plt.imshow(labels,'gray')

主要逻辑和输出
读取图像:首先读取并拼接两张图像,用于可视化差异。
计算视差分布:通过 Ddistribution 函数计算 im1 和 im2 之间的像素差异,提取视差分布。
生成能量矩阵:通过 nodes 函数计算能量矩阵,每个像素点在不同视差下的匹配成本。
图割优化:通过 gcut 函数使用图割算法对能量矩阵进行全局优化,得到最佳视差标签。
可视化视差图:最终输出视差标签,并可视化为灰度图。
lmd=0.1噪声大,锯齿明显
lmd=0.1
lmd=0.5鲁棒性更好
在这里插入图片描述

lmd=5
在这里插入图片描述
现在手动设定depth为10,之前的depth差不多是50左右
在这里插入图片描述
深度图像不明显。
depth 代表的是离散的深度层数,用于分离图像中不同像素的深度信息。它决定了在图像的视差计算过程中,离散化深度的精细程度。depth 的计算方式与视差范围有关,即两幅图像之间像素点位移的可能值范围(最小视差到最大视差之间的距离)

现在通过更改lmd的值可以看到不同的效果,lmd小的时候,噪声很大,lmd大的时候,深度信息就看不清了,对比相同lambda,不同dpeth的深度图,在dmin和dmax不变的情况下,深度层数越少,深度图中的噪声越小。同时lambda值和数据项、先验项的值有关,其实lambda和数据项平均值的比值很重要。

相关文章:

2024.9.14 Python与图像处理新国大EE5731课程大作业,马尔可夫随机场和二值图割,校正立体图像的深度

1.马尔科夫随机场和二值图割 马尔可夫随机场&#xff08;MRF, Markov Random Field&#xff09;&#xff1a; MRF 是一种用来描述图像像素之间空间关系的概率模型。它假设图像中的像素不仅取决于自身的值&#xff0c;还与周围像素有关。这种模型经常用于图像分割、去噪等任务。…...

工业大模型市场图谱:53个工业大模型全面梳理

工业场景要求严谨、容错率低&#xff0c;核心业务场景对模型准确率的要求达到95%以上、对幻觉的容忍率为0&#xff0c;因此通用基础大模型的工业知识往往不足以满足工业场景的应用需求。 根据沙丘智库发布的《2024年中国工业大模型应用跟踪报告》&#xff0c;工业大模型是指在…...

【代码随想录训练营第42期 Day58打卡 - 图论Part8 - 拓扑排序

目录 一、拓扑排序介绍 定义 特点 实现方法&#xff08;2种&#xff09; 应用 二、题目与题解 题目&#xff1a;卡码网 117. 软件构建 题目链接 题解&#xff1a;拓扑排序 - Kahn算法&#xff08;BFS&#xff09; 三、小结 一、拓扑排序介绍 对于拓扑排序&#xff0c…...

JVM内部结构解析

Java虚拟机&#xff08;JVM&#xff09;是Java程序运行的基础环境&#xff0c;它为Java程序提供了一个与平台无关的执行环境。了解JVM的内部结构对于Java开发者来说至关重要&#xff0c;因为它可以帮助开发者优化程序性能&#xff0c;理解垃圾回收机制&#xff0c;以及诊断和解…...

誉龙视音频综合管理平台 RelMedia/FindById SQL注入漏洞复现

0x01 产品简介 誉龙视音频综合管理平台是深圳誉龙数字技术有限公司基于多年的技术沉淀和项目经验,自主研发的集视音频记录、传输、管理于一体的综合解决方案。该平台支持国产化操作系统和Windows操作系统,能够接入多种类型的记录仪,实现高清实时图传、双向语音对讲、AI应用…...

MATLAB系列01:MATLAB介绍

MATLAB系列01&#xff1a;MATLAB介绍 1. MATLAB介绍1.1 MATLAB的优点1.2 MATLAB的缺点1.3 MATLAB的开发环境1.3.1 获取帮助的方法&#xff1a;1.3.2 一些重要的命令&#xff1a;1.3.3 MATLAB搜索路径 1. MATLAB介绍 MATLAB(矩阵实验室的简称)是一种专业的计算机程序&#xff0…...

GEE 按范围导出 Sentinel-2 卫星影像

Sentinel-2 卫星提供了高分辨率的地表覆盖图像&#xff0c;广泛应用于农业监测、城市规划、环境变化分析等诸多领域。在 Google Earth Engine (GEE) 中&#xff0c;我们能够按特定地理范围导出这些影像&#xff0c;以支持更深入的研究和分析。 使用方法 &#x1f4bb; GEE 提供…...

队列OJ题——用队列实现栈

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 用队列实现栈 二、解题思路 三、解题代码 class MyStack {public Queue<Integer> queue1;public Queue<Integer> queue2;public int usedSize;public MyStack() {queue1 new LinkedList<>()…...

RK3588镜像打包制作,替换文件系统

1.在开发板上安装async apt-get async 2.在另一台linux机器上执行命令拷贝文件系统 注意&#xff1a; 这里使用root权限或者账户 mkdir rootfs rsync -avx root192.168.1.3:/ rootfs 3.制作空镜像文件 先去开发板上验证自己的系统使用了多少空间&#xff0c;然后输入命令制…...

Open-Sora代码详细解读(2):时空3D VAE

Diffusion Models视频生成 前言&#xff1a;目前开源的DiT视频生成模型不是很多&#xff0c;Open-Sora是开发者生态最好的一个&#xff0c;涵盖了DiT、时空DiT、3D VAE、Rectified Flow、因果卷积等Diffusion视频生成的经典知识点。本篇博客从Open-Sora的代码出发&#xff0c;深…...

基于微信平台的旅游出行必备商城小程序+ssm(lw+演示+源码+运行)

摘 要 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…...

AI绘画:科技赋能艺术的崭新时代

&#x1f4af;AI绘画&#xff1a;走进艺术创新的新时代 人工智能在改变世界的过程中&#xff0c;AI绘画工具逐渐成为创新的典范。 本文将为您揭示AI绘画背后的技术秘密、潜在的应用场景&#xff0c;并为您推荐几款出色的AI绘画工具&#xff0c;助您领略这一技术带来的艺术新体…...

性能诊断的方法(四):自下而上的资源诊断方法和发散的异常信息诊断方法

关于性能诊断的方法&#xff0c;我们可以按照“问题现象—直接原因—问题根源”这样一个思路去归纳。我们先从问题的现象去入手&#xff0c;包括时间的分析、资源的分析和异常信息的分析。接下来再去分析产生问题现象的直接原因是什么&#xff0c;这里我们归纳了自上而下的资源…...

GDPU Vue前端框架开发 计数器

计数器算不到你双向绑定的进度。 重要的更新公告 &#xff01;&#xff01;&#xff01;GDPU的小伙伴&#xff0c;感谢大家的支持&#xff0c;希望到此一游的帅哥美女能有所帮助。本学期的前端框架及移动应用&#xff0c;采用专栏订阅量达到50才开始周更了哦( •̀ .̫ •́ )✧…...

最大流笔记

概念 求两点间的路径中可在同一时间内通过的最大量 EK算法 通过bfs找通路&#xff0c;找到后回溯&#xff1b; 每确定一条边时&#xff0c;同时建立一天反方向的边以用来进行反悔操作&#xff08;毕竟一次性找到正确方案的概率太低了&#xff09; code #include<bits/st…...

el-tree父子不互相关联时,手动实现全选、反选、子级全选、清空功能

el-tree父子不互相关联时&#xff0c;手动实现全选、反选、子级全选、清空功能 1、功能实现图示 2、实现思路 当属性check-strictly为true时&#xff0c;父子节点不互相关联&#xff0c;如果需要全部选中或选择某一节点下的全部节点就必须手动选择每个节点&#xff0c;十分麻…...

模板与泛型编程笔记(一)入门篇

1. 推荐书籍 《C新经典 模板与泛型编程》难得的很容易看得懂的好书&#xff0c;作者讲技术不跳跃&#xff0c;娓娓道来&#xff0c;只要花点时间就能看懂。 2. 笔记 2.1 模板基础 模板为什么要用尖括号&#xff1f;因为便于编译器解析&#xff0c;可以将模板和普通函数声明…...

浅谈WebApi

一、基本介绍 Web API&#xff08;Web应用程序编程接口&#xff09;是一种用于构建应用程序的接口&#xff0c;它允许软件应用程序通过HTTP请求与Web服务器进行交互。Web API通常用于构建客户端-服务器应用程序&#xff0c;其中客户端可以是Web浏览器、移动应用程序、桌面应用程…...

9月14日,每日信息差

第一、宝马集团宣布对设计部门进行重组&#xff0c;并将于 2024 年 10 月 1 日成立一个跨品牌设计团队&#xff0c;由范・霍伊顿克领导。该团队将引入极星汽车设计主管马克西米利安・米索尼&#xff0c;负责宝马中高档和豪华车型以及宝马 Alpina 的设计工作。 第二、小鹏汇天飞…...

无人机控制与三维AI感知处理平台正式上线!

低空经济被誉为推动我国经济高质量发展的全新增长引擎&#xff0c;是一种以民用有人驾驶和无人驾驶航空器的各类低空飞行活动为牵引&#xff0c;辐射带动相关领域融合发展的综合性经济形态&#xff0c;2024年全国两会首次被纳入政府工作报告。 大势智慧积极响应国家低空经济政…...

9.11-kubeadm方式安装k8s

一、安装环境 编号主机名称ip地址1k8s-master192.168.2.662k8s-node01192.168.2.773k8s-node02192.168.2.88 二、前期准备 1.设置免密登录 [rootk8s-master ~]# ssh-keygen [rootk8s-master ~]# ssh-copy-id root192.168.2.77 [rootk8s-master ~]# ssh-copy-id root192.168…...

限流,流量整形算法

写在前面 源码 。 本文看下流量整形相关算法。 目前流量整形算法主要有三种&#xff0c;计数器&#xff0c;漏桶&#xff0c;令牌桶。分别看下咯&#xff01; 1&#xff1a;计数器 1.1&#xff1a;描述 单位时间内只允许指定数量的请求&#xff0c;如果是时间区间内超过指…...

【C++知识扫盲】------C++ 中的引用入门

在 C 中&#xff0c;引用&#xff08;reference&#xff09; 是一个非常重要的概念&#xff0c;它提供了一种别名机制&#xff0c;让我们可以给已经存在的变量起一个新的名字&#xff0c;并且能够通过这个别名直接操作原始变量。本文将详细介绍引用的定义、使用场景及其与指针的…...

【机器学习】6 ——最大熵模型

机器学习6——最大熵模型 目录 机器学习6——最大熵模型最大熵&#xff08;maximum entropy&#xff09;模型模型模型学习&#xff08;估计参数&#xff09;模型评价应用 最大熵&#xff08;maximum entropy&#xff09;模型 选择熵最大的概率模型 熵是衡量不确定性的&#xf…...

小程序——生命周期

文章目录 运行机制更新机制生命周期介绍应用级别生命周期页面级别生命周期组件生命周期生命周期两个细节补充说明总结 运行机制 用一张图简要概述一下小程序的运行机制 冷启动与热启动&#xff1a; 小程序启动可以分为两种情况&#xff0c;一种是冷启动&#xff0c;一种是热…...

基于微信小程序的宠物之家的设计与实现

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSpringBootVueMySQL的宠物之家/宠物综合…...

自定义EPICS在LabVIEW中的测试

继续上一篇&#xff1a;LabVIEW中EPICS客户端/服务端的测试 变量定义 You can use CaLabSoftIOC.vi to create new EPICS variables and start them. CA Lab - LabVIEW (Realtime) EPICS INPUT: PV set Cluster-array of names, data types and field definitions to crea…...

基于深度学习的农作物病害检测

基于深度学习的农作物病害检测利用卷积神经网络&#xff08;CNN&#xff09;、生成对抗网络&#xff08;GAN&#xff09;、Transformer等深度学习技术&#xff0c;自动识别和分类农作物的病害&#xff0c;帮助农业工作者提高作物管理效率、减少损失。 1. 农作物病害检测的挑战…...

【C#】命名规范

文章目录 C# 命名规范使用Pascal case使用Camel case方法、属性、类命名见名知义LINQ查询变量使用有意义的名称如何声明成员变量和字段正确格式化和缩进代码如何撰写备注 通用C#编码最佳实践如何将值与空字符串进行比较使用异常处理使用&&和||可获得更好的性能单一职责…...

超级帐本(Hyperledger)

1. Hyperledger 项目 Hyperledger 下有两类项目:第一类是区块链框架项目;第二类是支持这些区块链的相关工具或模块。 在 Hyperledger 框架下&#xff0c;目前有 5 个区块链框架项目&#xff1a;Fabric、Sawtooth Lake、Iroha、Burrow 和 Indy。 在模块类下&#xff0c;则有 Hyp…...