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.xdnf.cn/news/1535003.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

51单片机 - DS18B20实验1-读取温度

上来一张图&#xff0c;明确思路&#xff0c;程序整体裤架如下&#xff0c;通过单总线&#xff0c;单独封装一个.c文件用于单总线的操作&#xff0c;其实&#xff0c;我们可以把点c文件看成一个类操作&#xff0c;其属性就是我们面向对象的函数&#xff0c;也叫方法&#xff0c…

iPhone 16预售已开,沙漠金色最抢手,喜提新机后别忘了这件事!

9月13日20点&#xff0c;iPhone 16系列正式开启官方预购。今年全新的iphone16不仅新增相机按钮和AI功能&#xff0c;还增加了沙漠金配色。“加量不加价”的iPhone 16系列开售依旧火爆&#xff0c;iPhone 16系列开售1分钟内&#xff0c;苹果官方网站一度被消费者买到崩&#xff…

(Python+selenium)UI自动化测试

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 前言 我们在进行UI自动化测试时&#xff0c;一般采用javaselenium或者pythonselenium的方式。由于python比较简单&#xff0c;上手快&#xff0c;因此建议大家采…

【第34章】Spring Cloud之SkyWalking分布式日志

文章目录 前言一、准备1. 引入依赖 二、日志配置1. 打印追踪ID2. gRPC 导出 三、完整日志配置四、日志展示1. 前端2. 后端 总结 前言 前面已经完成了请求的链路追踪&#xff0c;这里我们通过SkyWalking来处理分布式日志&#xff1b; 场景描述&#xff1a;我们有三个服务消费者…

Vue安装及环境配置【图解版】

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 Facts speak louder than words&#xff01; 目录 一.node.js的安装…

2024/9/14 408大题专项训练之存储系统

组相联映射怎么算组号&#xff1f; 有cache总大小/路数xcache大小 物理地址与虚拟地址位数不一定相等&#xff0c;但是她们页内地址和块内地址位数是一样的&#xff01;

基于自己的数据库构建基于LLM的专属知识库

简介&#xff1a; 基于自己的数据库构建基于LLM的专属知识库 要基于自己的数据库构建基于LLM的专属知识库&#xff0c;你需要遵循以下步骤&#xff1a; 确定目标&#xff1a;首先&#xff0c;你需要明确你的知识库的目标。这可能是用于回答特定领域的问题、提供个性化的建议或…

微信这些危险设置一定要关!

你有仔细研究你的微信吗&#xff1f; 用了这么久的微信&#xff0c;才知道 有这么几个设置需要及时关闭&#xff01; 逐个操作更安心1️⃣取消不常用的免密支付和自动续费 我>服务>钱包>底部 支付设置>免密支付/自动续费2️⃣取消对附近陌生人授权位置 2️⃣取消对…

大数据新视界 --大数据大厂之Kafka消息队列实战:实现高吞吐量数据传输

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

成功晋级 | 3本ELSEVIER期刊正式被ESCI收录,最快的录用后2天即可出版

爱思唯尔&#xff08;ELSEVIER&#xff09;作为一家国际顶尖出版集团&#xff0c;自1880年创办以来&#xff0c;旗下出版期刊有2800多种&#xff0c;其中包含《柳叶刀》《细胞》等TOP期刊&#xff0c;在学术科研界享誉盛名。 根据八月份公布的最新SCI目录显示&#xff0c;ELSE…

UART 16550的使用

前言 本文从操作系统使用 16550 的角度来学习 16550。主要解析通用的串口寄存器的作用。 16550 串口由一系列寄存器控制串口行为。不同的具体设备寄存器的偏移不同&#xff0c;寄存器的长度可能不同。 例如&#xff0c;在 AXI UART 16550中&#xff0c;各寄存器长度都为 32 b…

每天五分钟玩转深度学习PyTorch:模型参数优化器torch.optim

本文重点 在机器学习或者深度学习中,我们需要通过修改参数使得损失函数最小化(或最大化),优化算法就是一种调整模型参数更新的策略。在pytorch中定义了优化器optim,我们可以使用它调用封装好的优化算法,然后传递给它神经网络模型参数,就可以对模型进行优化。本文是学习第…

D - 1D Country(AtCoder Beginner Contest 371)

题目链接: D - 1D Country (atcoder.jp) 题目描述: 数据范围: 输入输出: 题目分析: 典型的l, r 区间问题&#xff0c;即是前缀和问题&#xff0c;但是注意到数据范围, 数据范围1e-9 到 1e9 数据范围&#xff0c;要是从最小到最大直接for循环去模拟的话&#xff0c;时间复杂度…

opencv中读取图片、视频以及对其基本操作

一、清华TUNA提供的Anaconda仓库镜像 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --set show_channel_urls yes 二、图…

【EI会议末轮截稿通知】第三届电子信息技术国际学术会议(EIT 2024)

第三届电子信息技术国际学术会议&#xff08;EIT 2024&#xff09; The 3rd International Conference on Electronic Information Technology 重要信息 大会官网&#xff1a;www.ic-eit.net 三轮截稿时间&#xff1a;2024年9月16日23:59分&#xff08;后续不再征稿&#x…

【Hot100算法刷题集】双指针-01-移动零(含置零思路、移动思路、偏移量思路、冒泡法)

&#x1f3e0;关于专栏&#xff1a;专栏用于记录LeetCode中Hot100专题的所有题目 &#x1f3af;每日努力一点点&#xff0c;技术变化看得见 题目转载 题目描述 &#x1f512;link->题目跳转链接 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&…

企业数字化转型建设方案(数据中台、业务中台、AI中台)(可编辑的188页WORD)

引言&#xff1a;企业数字化转型是一个复杂而长期的过程&#xff0c;其核心在于通过数据中台、业务中台和AI中台的建设&#xff0c;推动企业实现全面的数字化升级。 方案介绍&#xff1a;企业数字化转型建设方案中的数据中台是企业数字化转型的核心基础设施&#xff0c;负责数…

Stream流的思想和获取Stream流

首先介绍流的概念&#xff1a; 流可以理解为一条流水线&#xff0c;在这条流水线中有许多操作&#xff0c;比如筛选所需要的数据&#xff0c;输出打印等&#xff0c; 经过这条流水线&#xff0c;可以获取到自己所需要的数据&#xff1a; -->所以&#xff1a; Stream流的作…

java项目之疫情下图书馆管理系统源码(springboot)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的疫情下图书馆管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息。 项目简介&#xff1a; 疫情下图书馆管理系…

USB虚拟串口——CDC ACM 虚拟串口(不使用 IAD)

文章目录 CDC ACM 虚拟串口实现描述符结构设备描述符配置描述符集合配置描述符接口 1 的描述符接口描述符类特殊描述符输入端点描述符接口 2 的描述符接口描述符输出端点描述符输入端点描述符类特殊请求set control line statusget line codingset line codingCDC 数据交互主机…