计算机视觉:朗伯光度立体法(Lambertian Photometric Stereo)

这篇具有很好参考价值的文章主要介绍了计算机视觉:朗伯光度立体法(Lambertian Photometric Stereo)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

光度立体法简介

光度立体法,即Photometric Stereo, 最早是由当时在MIT的人工智能实验室的Robert J. Woodham教授在1978年左右提出。他在1979年的论文《Photometric stereo: A reflectance map technique for determining surface orientation from image intensity》,以及1980年的论文《Photometric Method for Determining Surface Orientation from Multiple Images》中比较系统的阐述了整套理论框架。光度立体法可以根据二维纹理信息提取出三维模型,其典型应用是检测物体表面微小变化。

朗伯光度立体法基于Woodham算法,Woodham在论文中提出三个基本假设。在这三个基本假设下完成整套理论框架的推演。这三个基本假设分别是:

  1. 假定相机是无畸变成像,也就是说必须使用远心镜头或者长焦镜头。
  2. 假定每一个光源发射的光束都是平行且均匀的,也就是说必须使用具有均匀强度的远心照明光源,或者使用远距离的点光源代替。
  3. 物体必须具有朗伯(lambertian)反射特性,即它必须以漫反射的方式反射入射光。

朗伯光度立体法的大致思路是:
当相机和目标物体相对位置固定不变时,使用不同方向的光源照射同一目标物体,相机可以拍摄到目标物体带有不同明暗分布的图像(至少需要三张图),再通过求解基于朗伯反射原理的反射方程组,求解目标表面的法向分布或者albedo图。

带有远心镜头的相机必须与被测物体表面垂直安装,在采集多幅图像时,一定要保证相机和物体不被移动。相反,对于采集至少三张的灰度图像,其每次取像的照明方向必须改变(相对于相机)。对于采集的多张图像中的每一幅图,照明方向必须指定Slants和Tilts两个参数角度,其描述了相对于当前场景的光照角度。为了更好的理解这两个参数含义,我们假定光源射出的光束是平行光,镜头是远心镜头,相机垂直于物体表面。
光度立体视觉公式推理,计算机视觉,计算机视觉,人工智能,opencv
光度立体视觉公式推理,计算机视觉,计算机视觉,人工智能,opencv

朗伯光度立体法算法原理

根据Lambert模型:
I = ρ   L ⋅ N \textbf{I} = \rho\ \textbf{L}\cdot\textbf{N} I=ρ LN
式中, ρ \rho ρ 为表面反射率(albedo),其值介于0 - 1之间,反映了物体表面特性; N \textbf{N} N 为表面法线(normal); L \textbf{L} L 为照明方向。将 ρ \rho ρ N \textbf{N} N 合并起来用 G \textbf{G} G来表示,则有:
I = L T G . \textbf{I} = \textbf{L}^T\textbf{G}. I=LTG.
每个像素位置对应的 G \textbf{G} G是三维向量(方向为normal,模长为albedo),因此单个光源无法求解该方程,至少需要三个不同位置的光源,求解得到三个未知量。
由最小二乘法:
min ⁡ G ∣ ∣ I − L T G ∣ ∣ 2 \mathop{\min}\limits_{\textbf{G}} ||\textbf{I}-\textbf{L}^T\textbf{G}||^2 Gmin∣∣ILTG2
可以求得:
G = ( L L T ) − 1 LI \textbf{G} = (\textbf{L}\textbf{L}^T)^{-1}\textbf{L}\textbf{I} G=(LLT)1LI
我们求得 G \textbf{G} G 的模长就是albedo:
ρ = ∣ ∣ G ∣ ∣ \rho = ||\textbf{G}|| ρ=∣∣G∣∣
G \textbf{G} G 归一化后的单位向量矩阵就是normal:
N = G ∣ ∣ G ∣ ∣ \textbf{N} = \frac{\textbf{G}}{||\textbf{G}||} N=∣∣G∣∣G

朗伯光度立体法matlab程序

注:此代码只涉及核心算法,不包含数据的读入,与结果的输出。

function [Albedo, Normal, Re_rendered] = Photometric_Stereo(data)

assert(size(data.imgs, 1)==size(data.s, 1), 'Size mismatched!');
num = size(data.imgs, 1);

% Get image dimensions
im = data.imgs{1};
[im_h, im_w, ~] = size(im);
% Initialize T, a im_h-by-im_w-by-num matrix, whose (h, w, :) holds 
% the intensities at (h, w) for all p different lightings
im_T = zeros(im_h, im_w, num);
% Initialize im_R, a im_h-by-im_w-by-num matrix
im_R = zeros(im_h, im_w, num);
% Initialize im_G, a im_h-by-im_w-by-num matrix
im_G = zeros(im_h, im_w, num);
% Initialize im_B, a im_h-by-im_w-by-num matrix
im_B = zeros(im_h, im_w, num);

% For each image
for idx = 1:num
    im = data.imgs{idx};
    imGray = rgb2gray(im);
    % Loop thru each pixel
    for h = 1:im_h
        for w = 1:im_w
            % If in the mask
            if data.mask(h, w)
                im_R(h, w, idx) = im(h, w, 1);
                im_G(h, w, idx) = im(h, w, 2);
                im_B(h, w, idx) = im(h, w, 3);
                im_T(h, w, idx) = imGray(h,w);
            end
        end
    end
end

% Initialize Normal, a im_h-by-im_w-by-3 matrix
Normal = zeros(im_h, im_w, 3);
% Initialize Albedo, a im_h-by-im_w-by-1 matrix
Albedo = zeros(im_h, im_w, 3);
% Initialize Re_rendered, a im_h-by-im_w-by-3 matrix
Re_rendered = zeros(im_h, im_w, 3);

% Loop thru each location
for h = 1:im_h
    for w = 1:im_w
        % If in the mask
        if data.mask(h, w)
           %% Normal 
            % Lightings
            L = data.s;
            % Intensities
            I = reshape(im_T(h, w, :), [num, 1]);
            % Dealing with shadows and highlights
            for k = 1:10
                max_index = find(I==max(I));
                I(max_index) = [];
                L(max_index,:) = [];
                min_index = find(I==min(I));
                I(min_index) = [];
                L(min_index,:) = [];
            end
            % Solve surface normals and albedo
            G = (L.'*L)\(L.'*I);
            if norm(G) ~= 0
                % Normalize n
                n = G./norm(G);
            else
                n = [0; 0; 0];
            end
            % Save
            Normal(h, w, :) = n;
           %% Albedo
            % a_R
            L = data.s;
            I_R = reshape(im_R(h, w, :), [num, 1]);
            for k = 1:10
                max_index = find(I_R==max(I_R));
                I_R(max_index) = [];
                L(max_index,:) = [];
                min_index = find(I_R==min(I_R));
                I_R(min_index) = [];
                L(min_index,:) = [];
            end
            G_R = (L.'*L)\(L.'*I_R);
            a_R = norm(G_R);
            Albedo(h, w, 1) = a_R;
            % a_G
            L = data.s;
            I_G = reshape(im_G(h, w, :), [num, 1]);
            for k = 1:10
                max_index = find(I_G==max(I_G));
                I_G(max_index) = [];
                L(max_index,:) = [];
                min_index = find(I_G==min(I_G));
                I_G(min_index) = [];
                L(min_index,:) = [];
            end
            G_G = (L.'*L)\(L.'*I_G);
            a_G = norm(G_G);
            Albedo(h, w, 2) = a_G;
            % a_B
            L = data.s;
            I_B = reshape(im_B(h, w, :), [num, 1]);
            for k = 1:10
                max_index = find(I_B==max(I_B));
                I_B(max_index) = [];
                L(max_index,:) = [];
                min_index = find(I_B==min(I_B));
                I_B(min_index) = [];
                L(min_index,:) = [];
            end
            G_B = (L.'*L)\(L.'*I_B);
            a_B = norm(G_B);
            Albedo(h, w, 3) = a_B;
            %% Re_rendered
            Re_rendered(h, w, :) = [a_R;a_G;a_B]*dot(n,[0;0;1]);
        end
    end
end

完整程序请移步至此链接下载

示例

Albedo图

反照率图:
光度立体视觉公式推理,计算机视觉,计算机视觉,人工智能,opencv

Normal图

以RGB线性编码的法线贴图:
光度立体视觉公式推理,计算机视觉,计算机视觉,人工智能,opencv

Re_rendered图

在照明方向和观察方向一致时,利用normal和albedo图重新渲染的图片:

光度立体视觉公式推理,计算机视觉,计算机视觉,人工智能,opencv

参考文献

光度立体简介
Halcon 光度立体法(photometric_stereo)详解z文章来源地址https://www.toymoban.com/news/detail-655303.html

到了这里,关于计算机视觉:朗伯光度立体法(Lambertian Photometric Stereo)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机视觉(P2)-计算机视觉任务和应用

    在本文中,我们将探讨主要的计算机视觉任务以及每个任务最流行的应用程序。         图像分类是计算机视觉领域的主要任务之一[1]。在该任务中,经过训练的模型根据预定义的类集为图像分配特定的类。下图是著名的CIFAR-10数据集[1],它由十个类别的8000万张图像组成

    2024年02月02日
    浏览(73)
  • 【深度学习: 计算机视觉】如何改进计算机视觉数据集

    机器学习算法需要大量数据集来训练、提高性能并生成组织所需的结果。 数据集是计算机视觉应用程序和模型运行的燃料。数据越多越好。这些数据应该是高质量的,以确保人工智能项目获得最佳的结果和产出。 获取训练机器学习模型所需数据的最佳方法之一是使用开源数

    2024年02月20日
    浏览(48)
  • 什么是计算机视觉,计算机视觉的主要任务及应用

    目录 1. 什么是计算机视觉 2. 计算机视觉的主要任务及应用 2.1 图像分类 2.1.1 图像分类的主要流程 2.2 目标检测 2.2.1 目标检测的主要流程 2.3 图像分割 2.3.1 图像分割的主要流程 2.4 人脸识别 2.4.1 人脸识别的主要流程 对于我们人类来说,要想认出身边的一个人,首先需要

    2024年02月11日
    浏览(46)
  • 计算机毕业设计选题-最新最全机器视觉 计算机视觉选题推荐汇总

      大四是整个大学期间最忙碌的时光,一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理了机器视觉,计算机视觉不同方向最新精选选题,如对选题有任何疑问,都可以问学长哦! 以下是学长精心整

    2024年02月06日
    浏览(70)
  • 计算机视觉的实际应用:计算机视觉在实际应用中的成功案例

    计算机视觉(Computer Vision)是一种利用计算机解析、理解并从图像中抽取信息的技术。它是一种跨学科的研究领域,涉及到计算机科学、数学、物理、生物学、心理学等多个领域的知识和技术。计算机视觉的应用范围广泛,包括图像处理、图像识别、机器人视觉、自动驾驶等

    2024年01月23日
    浏览(54)
  • 【计算机视觉】基于OpenCV计算机视觉的摄像头测距技术设计与实现

    在当今技术日益进步的时代,计算机视觉已成为我们生活中不可或缺的一部分。从智能监控到虚拟现实,计算机视觉技术的应用范围日益广泛。在这篇博客中,我们将探索一个特别实用的计算机视觉案例:使用OpenCV实现摄像头测距。这一技术不仅对专业人士有用,也为编程爱

    2024年02月04日
    浏览(54)
  • 【探索AI】三十一-计算机视觉(六)深度学习在计算机视觉中的应用

    深度学习在计算机视觉中的应用已经取得了显著的成果,并且正在逐步改变我们对图像和视频信息的处理和理解方式。下面将详细讲解深度学习在计算机视觉中的几个关键应用。 首先,我们来看图像分类。图像分类是计算机视觉的基本任务之一,它涉及到将输入的图像自动归

    2024年04月09日
    浏览(70)
  • 计算机视觉——图像视觉显著性检测

    目录 系列文章目录 零、问题描述 一、图像显著性检测 1.定义 2.难点 二、常用评价标准和计算方法 1.综述 2.ROS曲线详述 2.1 混淆矩阵 2.2 ROC曲线简介 2.3 ROC曲线绘制及其判别标准 2.4 ROC曲线补充 三、Fast and Efficient Saliency (FES) 1.算法简介 2.项目导入与解析 3.FES注意预测实践 4.评价

    2024年02月03日
    浏览(57)
  • 【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(7 月 4 日论文合集)

    伪像映射:用于目标检测和三维定位的多模式语义映射 论文地址: 几何导航是当今机器人领域的一个成熟的领域,研究重点正在转向更高层次的场景理解,如语义映射。当机器人需要与环境交互时,它必须能够理解周围环境的上下文信息。这项工作的重点是分类和定位地图

    2024年02月13日
    浏览(51)
  • 动手学CV-Pytorch计算机视觉 天池计算机视觉入门赛SVHN数据集实战

    这里我们以datawhale和天池合作的天池计算机视觉入门赛为例,通过案例实战来进一步巩固本章所介绍的图像分类知识。 该比赛以SVHN街道字符为赛题数据,数据集报名后可见并可下载,该数据来

    2024年02月04日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包