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和数据项平均值的比值很重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/424627.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】关键字、命名空间、输入和输出、缺省参数的深入了解

目录 一、C关键字二、命名空间2.1 为什么存在命名空间&#xff1f;2.2 命名空间定义2.3 命名空间使用 三、C输入&输出四、缺省函数4.1 缺省函数分类 总结 一、C关键字 C一共有63个关键字 其中红色圈出来的32个关键字同时也是C语言的 二、命名空间 2.1 为什么存在命名空间…

MySQL 按照条件(分组)只取一个形成列表 group max

方法一、通过Max形成where条件 SELECTt1.* FROMbiz_customer_hold AS t1 WHEREt1.ch_create_time ( SELECT MAX( ch_create_time ) FROM biz_customer_hold AS t2 WHERE t2.ch_cust_no t1.ch_cust_no ) ORDER BYt1.ch_create_time DESC,t1.ch_hold_time DESC 方法二、通…

LabVIEW编程快速提升的技术

在LabVIEW程序员的成长过程中&#xff0c;很多技术和概念看似简单、常用&#xff0c;但真正掌握并能熟练运用&#xff0c;往往需要踏踏实实的实践与积累。没有什么是能够一蹴而就的&#xff0c;唯有通过不断的专注与深入&#xff0c;才能获得显著的提升。要想在LabVIEW开发上取…

ICPC网络赛 以及ACM训练总结

一、训练反思 关于我自己暑假期间训练的反思&#xff0c;我承认无论是因为什么原因&#xff0c;我自己浪费我整整一个暑假的时间&#xff0c;暑假期间正是我们集训的关键时期&#xff0c;这期间没有任何的事情来打扰我们学习&#xff0c;而我却熬夜&#xff0c;白天训练懈怠&a…

力扣题解2390

大家好&#xff0c;欢迎来到无限大的频道。 今日继续给大家带来力扣题解。 题目描述​&#xff08;中等&#xff09;&#xff1a; 从字符串中移除星号 给你一个包含若干星号 * 的字符串 s 。 在一步操作中&#xff0c;你可以&#xff1a; 选中 s 中的一个星号。 移除星号…

GIS在线监测SF6密度微水传感器免焊接格兰头航插插头

概述 GIS&#xff08;气体绝缘金属封闭开关设备&#xff09;中的SF6&#xff08;六氟化硫&#xff09;气体密度微水传感器航插技术是指在GIS设备中安装SF6气体密度和微水传感器&#xff0c;以实现对SF6气体状态的在线监测。这些传感器能够实时监测SF6气体的密度、微水含量以及其…

Acrobat 9 安装教程

软件介绍 Adobe Acrobat 是由Adobe公司开发的一款PDF&#xff08;Portable Document Format&#xff0c;便携式文档格式&#xff09;编辑软件。借助它&#xff0c;可以以PDF格式制作和保存文档&#xff0c;以便于浏览和打印&#xff0c;同时还可以使用一些高级工具来创建、编辑…

CSS—4

1.定位 1.相对定位 2.绝对定位 3.固定定位 4.粘性定位 5.定位的特殊应用 2.布局-版心 3.布局-常用布局名词 4.布局-重置默认样式

PCIe进阶之TL:Memory, I/O, and Configuration Request Rules TPH Rules

1 Memory, I/O, and Configuration Request Rules 下述规则适用于 Memory 请求、IO 请求和配置请求。 除了公共的 header 字段外,所有 Memory 请求、IO 请求和配置请求还包括以下字段: (1)Requester ID[15:0] 和 Tag[9:0],组成了 Transaction ID 。 (2)Last DW BE[3:0]…

BERT 论文逐段精读【论文精读】

BERT: 近 3 年 NLP 最火 CV: 大数据集上的训练好的 NN 模型&#xff0c;提升 CV 任务的性能 —— ImageNet 的 CNN 模型 NLP: BERT 简化了 NLP 任务的训练&#xff0c;提升了 NLP 任务的性能 BERT 如何站在巨人的肩膀上的&#xff1f;使用了哪些 NLP 已有的技术和思想&#xff…

基于AutoDL部署langchain-chatchat-0.3.1实战

一、租用AutoDL云服务器&#xff0c;配置环境 1.1 配置AutoDL环境 注册好autodl账户之后&#xff0c;开始在上面租服务器&#xff0c;GPU我选择的是RTX4090*2&#xff0c;西北B区&#xff0c;基础镜像选择的是Pytorch-2.3.0-python-3.12&#xff08;ubuntu22.04&#xff09;-…

SAP Fiori UI5-环境搭建-2022-2024界面对比

文章目录 一、Fiori项目初始化实际操作第一步&#xff1a;新建文件夹&#xff08;项目文件&#xff09;第二步&#xff1a;打开我们项目第三步&#xff1a;打开终端 部署环境第四步: XML中新增文本 二、 2023年Vscode中Fiori界面三 、2024年Vscode中Fiori界面 一、Fiori项目初始…

PHP仓库物资出入库管理系统小程序源码

仓库物资出入库管理系统&#xff1a;让库存管理变得井井有条 **&#x1f4e6; 开篇&#xff1a;告别混乱&#xff0c;拥抱智能库存时代 还在为仓库里堆积如山的物资和繁琐的出入库记录而头疼吗&#xff1f;是时候告别那些混乱的日子了&#xff01;“仓库物资出入库管理系统”应…

Android平台RTMP|RTSP播放器如何回调YUV或RGB数据?

技术选型 我们知道&#xff0c;Android平台一般RTMP|RTSP播放器通常不直接提供回调YUV或RGB数据的功能。如果播放端有视觉分析或类似的需求&#xff0c;需要播放端&#xff0c;能支持YUV或ARG的数据回调&#xff0c;一般来说&#xff0c;可参考的方法如下&#xff1a; 1. 使用…

MacOS Catalina 从源码构建Qt6.2开发库之01: 编译Qt6.2源代码

安装xcode&#xff0c; cmake&#xff0c; ninja brew install node mac下安装OpenGL库并使之对各项目可见 在macOS上安装OpenGL通常涉及到安装一些依赖库&#xff0c;如MGL、GLUT或者是GLEW等&#xff0c;同时确保LLVM的OpenGL框架和相关工具链的兼容性。以下是一个基本的安装…

linux 定时将固态硬盘数据备份至机械硬盘

需求背景 为了加强公司数据的安全性和可靠性&#xff0c;我们将实施一项数据备份策略。该策略涉及将服务器上的固态硬盘&#xff08;SSD&#xff09;中的关键数据定期备份到机械硬盘&#xff08;HDD&#xff09;上。这一过程旨在保护数据免受意外删除、硬件故障或其他潜在风险…

数组及使用方法

1. 数组 数组是由相同类型的数据元素构成的有限集合。数组是顺序存储方式,存储在连续内存空间中,可以通过下标直接存取元素。 数组的下标从0开始,第3个元素的下标为2,第3个元素为vec[2],如图所示。 在第3个元素之前插入一个元素9,需要从最后一个元素开始,后移一位,……

Element UI:初步探索 Vue.js 的高效 UI 框架

Element UI&#xff1a;初步探索 Vue.js 的高效 UI 框架 一 . ElementUI 基本使用1.1 Element 介绍1.2 Element 快速入门1.3 基础布局1.4 容器布局1.5 表单组件1.6 表格组件1.6.1 基础表格1.6.2 带斑马纹表格1.6.3 带边框表格1.6.4 带状态的表格 1.7 导航栏组件讲解 二 . 学生列…

【CSS in Depth 2 精译_031】5.3 Grid 网格布局的两种替代语法

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

Vue生命周期;Vue路由配置;vue网络请求;vue跨域处理

一&#xff0c;Vue生命周期 <template><div > <h1 click"changeText">{{ info }}</h1></div> </template><script> export default {name: HelloWorld,data(){return{info:"介绍组件生命周期"}},methods:{chang…