【图像处理】基于双目立体匹配的景深计算(Matlab代码实现) 您所在的位置:网站首页 阿里图片像素设置多少 【图像处理】基于双目立体匹配的景深计算(Matlab代码实现)

【图像处理】基于双目立体匹配的景深计算(Matlab代码实现)

2023-06-11 12:48| 来源: 网络整理| 查看: 265

 👨‍🎓个人主页:研学社的博客    

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现

💥1 概述

双目立体匹配一直是双眼视觉的研究热点。双目相机捕获同一场景的左右视点图像,使用立体匹配匹配算法获得视差图和深度图。

流程:

首先导入左右图像,并设置合理的搜索窗口和模板大小。以每个像素为中心,并使用固定大小的像素作为模板。假设相机已被校正,因此它仅水平搜索。在搜索窗口中连续移动左侧图像模板,以计算左侧和右侧模板的成本。获得成本后,通过累积像素信息来提高结果的信噪比,即成本聚合过程。这里我们优化窗口中最小生成值的坐标,并使用抛物线拟合来更新视差值。最后,对得到的视差图进行细化(使用中值滤波器),以消除视差图中产生的部分噪声。

📚2 运行结果

主函数部分代码:

clc; clear; %% 加载2张立体图像 left = imread('iml1545.jpg'); right = imread('imr1545.jpg'); sizeI = size(left); % 显示复合图像 zero = zeros(sizeI(1), sizeI(2)); channelRed = left(:,:,1); channelBlue = right(:,:,3); composite = cat(3, channelRed, zero, channelBlue); figure(1); subplot(2,3,1); imshow(left); axis image; title('左图'); subplot(2,3,2); imshow(right); axis image; title('右图'); subplot(2,3,3); imshow(composite); axis image; title('重叠图'); %% 基本的块匹配 % 通过估计子像素的块匹配计算视差 disp('运行基本的块匹配~'); % 启动定时器 tic(); % 平均3个颜色通道值将RGB图像转换为灰度图像 leftI = mean(left, 3); rightI = mean(right, 3); % SHD %  bitsUint8 = 8; % leftI = im2uint8(leftI./255.0); % rightI = im2uint8(rightI./255.0); % DbasicSubpixel将保存块匹配的结果,元素值为单精度32位浮点数 DbasicSubpixel = zeros(size(leftI), 'single'); % 获得图像大小 [imgHeight, imgWidth] = size(leftI); % 视差范围定义离第1幅图像中的块位置多少像素远来搜索其它图像中的匹配块。 disparityRange = 50; % 定义块匹配的块大小 halfBlockSize = 5; blockSize = 2 * halfBlockSize + 1; % 对于图像中的每行(m)像素 for (m = 1 : imgHeight)              % 为模板和块设置最小/最大块边界     % 比如:第1行,minr = 1 且 maxr = 4     minr = max(1, m - halfBlockSize);     maxr = min(imgHeight, m + halfBlockSize);          % 对于图像中的每列(n)像素     for (n = 1 : imgWidth)                  % 为模板设置最小/最大边界         % 比如:第1列,minc = 1 且 maxc = 4         minc = max(1, n - halfBlockSize);         maxc = min(imgWidth, n + halfBlockSize);                  % 将模板位置定义为搜索边界,限制搜索使其不会超出图像边界          % 'mind'为能够搜索至左边的最大像素数;'maxd'为能够搜索至右边的最大像素数         % 这里仅需要向右搜索,所以mind为0         % 对于要求双向搜索的图像,设置mind为max(-disparityRange, 1 - minc)         mind = 0;          maxd = min(disparityRange, imgWidth - maxc);         % 选择右边的图像块用作模板         template = rightI(minr:maxr, minc:maxc);                  % 获得本次搜索的图像块数         numBlocks = maxd - mind + 1;                  % 创建向量来保存块偏差         blockDiffs = zeros(numBlocks, 1);                  % 计算模板和每块的偏差         for (i = mind : maxd)                      %选择左边图像距离为'i'处的块             block = leftI(minr:maxr, (minc + i):(maxc + i));                      % 计算块的基于1的索引放进'blockDiffs'向量             blockIndex = i - mind + 1;                          %{             % NCC(Normalized Cross Correlation)             ncc = 0;             nccNumerator = 0;             nccDenominator = 0;             nccDenominatorRightWindow = 0;             nccDenominatorLeftWindow = 0;             %}                          % 计算模板和块间差的绝对值的和(SAD)作为结果             for (j = minr : maxr)                 for (k = minc : maxc)                                          % SAD(Sum of Absolute Differences)                     blockDiff = abs(rightI(j, k) - leftI(j, k + i));                     blockDiffs(blockIndex, 1) = blockDiffs(blockIndex, 1) + blockDiff;                                                               %{                     % NCC                     nccNumerator = nccNumerator + (rightI(j, k) * leftI(j, k + i));                     nccDenominatorLeftWindow = nccDenominatorLeftWindow + (leftI(j, k + i) * leftI(j, k + i));                     nccDenominatorRightWindow = nccDenominatorRightWindow + (rightI(j, k) * rightI(j, k));                     %}                 end             end

🎉3 参考文献

[1]杨晓立,叶乐佳,赵鑫,王飞,徐玉华,肖振中.双目立体视觉研究进展与应用[J/OL].激光与光电子学进展:1-30[2023-06-06].

部分理论引用网络文献,若有侵权联系博主删除。

🌈4 Matlab代码实现


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有