- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
美好的一天!
我正在尝试学习如何手动实现立体匹配算法。我基本上是从最基本的开始 - 绝对差异。
我在网上找到了一些介绍如何操作的幻灯片。基本上,据我了解,我应该计算左图像中的像素与右图像中“偏移”一定距离/视差的相同像素之间的差异。然后在这些差异中,我选择最小值,这对我来说很有意义,因为具有最低差异的像素意味着它很可能是左图像中的相同像素。
我已经在 MATLAB 中制作了原型(prototype)。这是代码:
im_left = imread('tsu_left.png');
im_right = imread('tsu_right.png');
height = size(im_left, 1);
width = size(im_left, 2);
disparity_max = 16;
ad_costs = zeros(height, width,disparity_max);
for disparity = 1:disparity_max
for row = 1:height
for col = 1:width
%Left to right matching
col_disp = col - disparity;
if col_disp < 1
ad_costs(row, col, disparity) = 0;
else
%Average RGB
left_pixel = (im_left(row, col, 1) + im_left(row, col, 2) + im_left(row, col, 3))/3;
right_pixel = (im_right(row, col_disp, 1) + im_right(row, col_disp, 2) + im_right(row, col_disp, 3))/3;
%Subtract averages
ad_costs(row, col, disparity) = abs(left_pixel - right_pixel);
end
end
end
end
min_costs = zeros(height, width);
for disparity = 1:disparity_max
for row = 1:height
for col = 1:width
%The minimum disparity is chosen
min_costs(row, col) = min(ad_costs(row, col, :));
end
end
end
请注意,我还没有实现对某个窗口中的差异求和的变体,从而导致绝对差异之和。我只考虑每个像素、每个视差的差异。我在网上找到的讲座幻灯片说它应该是这样的(最右图):
https://dl.dropboxusercontent.com/u/92715312/lec.PNG
但是,上面代码(使用 imshow(min_costs))的结果是这样的:
https://dl.dropboxusercontent.com/u/92715312/res.PNG
我不明白为什么输出如此不同。我是否遗漏了一些微不足道的步骤,或者我对算法工作原理的理解有误?我也在使用筑波图像。
最佳答案
这很可能是 imshow 问题。函数 imshow 除外图像在 [0, 255] 范围内(如果它是 uint8)或 [0.0, 1.0](如果是 float )。
尝试:
imshow(min_cost, []);
请注意,第二个参数为空数组。这告诉 Matlab 计算缩放比例。
或者,使用:
imagesc(min_cost); axis image off;
编辑:
带有一些像素差异测量的 Vanilla 校正立体相当简单。请看下面的代码:
function [D, C_min, C] = stereo_sad(I1, I2, min_d, max_d, w_radius)
% function [D, C_min, C] = stereo_sad(I1, I2, min_d, max_d, w_radius)
%
% INPUT
% I1 the left stereo image
% I2 the right stereo image
% min_d minimum disparity
% max_d maximum disparity
% w_radius the radius of the window to do the AD aggeration
%
% OUTPUT
% D disparity values
% C_min cost associated with the minimum disparity at pixel (i,j)
% C the cost volume for AD
%
if nargin < 5, w_radius = 4; end % 9x9 window
if nargin < 4, max_d = 64; end
if nargin < 3, min_d = 0; end
% aggregation filter (window size to aggerate the AD cost)
kernel = ones(w_radius*2+1);
kernel = kernel ./ numel(kernel); % normalize it
% grayscale is sufficient for stereo matching
% the green channel is actually a good approximation of the grayscale, we
% could instad do I1 = I1(:,:,2);
if size(I1,3) > 1, I1 = rgb2gray(I1); end
if size(I2,3) > 1, I2 = rgb2gray(I2); end
% conver to double/single
I1 = double(I1);
I2 = double(I2);
% the range of disparity values from min_d to max_d inclusive
d_vals = min_d : max_d;
num_d = length(d_vals);
C = NaN(size(I1,1), size(I1,2), num_d); % the cost volume
% the main loop
for i = 1 : length(d_vals);
d = d_vals(i);
I2_s = imtranslate(I2, [d 0]);
C(:,:,i) = abs(I1 - I2_s); % you could also have SD here (I1-I2_s).^2
C(:,:,i) = imfilter(C(:,:,i), kernel);
end
[C_min, D] = min(C, [], 3);
D = D + min_d;
end
运行代码
I1 = imread( ... 你的左图I2 = imread( ... 你的右图)D = stereo_sad(I1, I2, 0, 96, 4);图片c(D);轴图像关闭;彩条
你会得到一张如下图的视差图
步骤是:
可以使用内置的 Matlab 工具完成这些操作,以生成易于阅读的代码。
希望对您有所帮助。
关于matlab - 绝对差立体匹配算法的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30541905/
在 Matlab 中,您可以选择创建新的“示例”脚本文件以及脚本、函数、类等。创建它们时,它们会获得一个脚本图标。 它们与其他标准脚本文件的处理方式有何不同? 是否有关于这些示例脚本类型的预期用途的文
我正在运行一个不是我自己编写的大 m 文件,它依赖于某些子函数。我想知道是否在所有嵌套函数的任何地方都使用了特定函数(在我的例子中是函数 eig.m(计算特征值))。有没有快速的方法来做到这一点? 亲
Matlab中有一个函数叫 copulafit .我怎样才能看到这个函数背后的代码?许多 Python 的 numpy 和 scipy 函数在 Github 上很容易开源,但由于某种原因我在 Gith
我定义了一个抽象基类measurementHandler < handle它定义了所有继承类的接口(interface)。这个类的两个子类是a < measurementHandler和 b < me
假设有一个矩阵 A = 1 3 2 4 4 2 5 8 6 1 4 9 例如,我有一个 Vector 包含该矩阵每一列的“类”
我有一个在后台运行的 Matlab 脚本。随着计算的进行,它会不断弹出进度栏窗口。这很烦人。 问题是我没有自己写 Matlab 脚本,这是一段很长很复杂的代码,我不想搞砸。那么如何在不修改 Matla
有没有办法从一个 matlab 程序中检测计算机上正在运行多少个 matlab 进程? 我想要恰好有 n 个 matlab 进程在运行。如果我的数量太少,我想创建它们,如果数量太多,我想杀死一些。您当
我正在测试我们在 Matlab 中开发的一个独立应用程序,当时我注意到它的内存使用量(根据 Windows 任务管理器)达到了 16gb 以上的数倍峰值。我决定在编译版本后面的脚本上使用 profil
我面临着一个相当棘手的问题。在 Matlab 中,命令 S = char(1044) 将俄语字母 д 放入变量 S。但是 disp(S) 返回空白符号,尽管内容实际上是正确的: >> S = char
我在这行 MATLAB 代码中遇到内存不足错误: result = (A(1:xmax,1:ymax,1:zmax) .* B(2:xmax+1,2:ymax+1,2:zmax+1) +
我正在寻找一种在 MATLAB 中比较有限顺序数据与非确定性顺序的方法。基本上,我想要的是一个数组,但不对包含的元素强加顺序。如果我有对象 a = [x y z]; 和 b = [x z y]; 我希
我有一个由 1 和 0 组成的二维矩阵。 mat = [0 0 0 0 1 1 1 0 0 1 1 1 1 1 0 0 1 0 0 0 1 0 1 1 0 0 1]; 我需
我可以在 Matlab 中用一组 x,y 点绘制回归线。但是,如果我有一组点(如下图),假设我有四组点,我想为它们绘制四条回归线……我该怎么做?所有的点都保存在 x,y 中。没有办法将它们分开并将它们
我正在尝试使用以下代码在 MATLAB 中绘制圆锥体。但是,当 MATLAB 生成绘图时,曲面中有一个间隙,如下图所示。谁能建议关闭它的方法? clearvars; close all; clc; [
我有一个 map称为 res_Map,包含一组不同大小的数组。我想找到用于存储 res_Map 的总内存。 正如您在下面看到的,看起来 res_Map 几乎不占用内存,而 res_Map 中的各个元素
有没有办法在 MATLAB 中组合 2 个向量,这样: mat = zeros(length(C),length(S)); for j=1:length(C) mat(j,:)=C(j)*S;
已结束。此问题不符合 Stack Overflow guidelines 。它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答它。 关闭 5 年前
我正在尝试将MatLab中的t copula适配到我的数据,并且我的功能是: u = ksdensity(range_1, range_1,'function','cdf'); v = ksdens
大家好,我目前正在尝试使用论文“多尺度形态学图像简化”中的 SMMT 运算符 Dorini .由于没有订阅无法访问该页面,因此我将相关详细信息发布在这里: 请注意,我将相关文章的部分内容作为图片发布。
我在MATLAB中编写代码,需要使用一个名为modwt的函数,该函数同时存在于两个我同时使用的工具箱(Wavelet和WMTSA)中。问题在于,一个版本仅返回一个输出,而另一个版本则返回三个输出。我应
我是一名优秀的程序员,十分优秀!