空间皮肤代码_OpenCV实现皮肤表面粗糙度3D显示

eff69af31437388dabaf8fa446c6f4bd.gif

点击上方蓝字关注我们

微信公众号:OpenCV学堂

关注获取更多计算机视觉与深度学习知识

问题分析与思路

这个是最近有人问我的一个问题,想把一个拍好的皮肤图像,转换为3D粗糙度表面显示,既然是粗糙度表面显示,我想到的就是把图像转换为灰度图像,对每个像素点来说,有三个不同维度的信息可以表示它们,分别是坐标x、y与像素灰度值c ,对每个像素点Pixel(x,y ,c)就是一个三维向量,使用matplotlib的的3D表面图即可实现显示,这里还另外一个问题需要解决,就是像素的取值范围在0~255之后,但是为了更好的显示,需要首先对灰度图像归一化像素值范围到0~1之间。所以完整的步骤跟思路如下:

  • 加载图像

  • 灰度转换

  • 归一化处理

  • Surface 3D绘制

代码实现

代码实现主要是基于OpenCV跟matplotlib-cpp两个库,关于这个配置跟简单使用,这里就不再赘述了,直接看之前的文章即可:

五分钟学会C++高效图表绘制神器调用

基于灰度图像实现3D表面绘制的完整代码如下:

Mat image = imread("D:/images/skin.png");// resizeMat src;float rate = 256.0 / max(image.rows, image.cols);resize(image, src, Size(image.cols*rate, image.rows*rate));// 转换为灰度图像Mat gray;cvtColor(src, gray, COLOR_BGR2GRAY);normalize(gray, gray, 0, 1, NORM_MINMAX, CV_32F);imshow("input", src);int h = src.rows;int w = src.cols;std::vector<std::vector<double>> x, y, z;for (int row = 0; row < h; row++) {  std::vector<double> x_row, y_row, z_row;  for (int col = 0; col < w; col++) {    double pv = gray.at<float>(row, col);    printf("pv = %.2f \n");    x_row.push_back(col);    y_row.push_back(row);    z_row.push_back(pv);  }  x.push_back(x_row);  y.push_back(y_row);  z.push_back(z_row);}plt::plot_surface(x, y, z);plt::show();waitKey(0);

测试一:

dcc9a433449b92549cc847ec861bbc20.png

测试二:

56321f68c98420d68e0edd4ebe3c0415.png

凿井者,起于三寸之坎,以就万仞之深

 推荐阅读 

OpenCV4系统化学习路线图-视频版本!

OpenCV单应性矩阵发现参数估算方法详解

单应性矩阵应用-基于特征的图像拼接

OpenCV图像拼接改进算法之完美拼接

OpenCV | 二值图像分析的技巧都在这里

OpenCV二值图像分析之形态学应用技巧

图像色彩空间与应用转换

五分钟学会C++高效图表绘制神器调用

没想到图像直方图有这么多应用场景

基于灰度共生矩阵(GLCM)的图像纹理分析与提取

OpenCV中一个最容易搞错的形态学操作

OpenCV4.x中请别再用HAAR级联检测器检测人脸,有更好更准的方法

4e04884768cf9c3bf561a544a491ab61.png

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

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

相关文章

windows修改时间服务器,在Windows中设置时间服务器 2012 R2

大家都知道, 时的服务是任何网络中最重要的组成部分, 任何系统, 在所有计算机上同步时钟是我们可以做的事情工作&#xff0c;也都成功同步的内部系统最少. 通常情况下&#xff0c;我们有一个网络时间服务器以从外部时钟获得的时间和内部提供.什么NTP服务器的默认地图, 在这种情…

q版地图制作软件_Flash动画的图形元件实例-Q版人物侧面行走

对于刚入门者而言&#xff0c;学会了基本图形的绘制之后&#xff0c;如何应用软件的各种动画补间功能&#xff0c;制作出具有表现力的动画&#xff0c;就需要更进一阶的知识技能了&#xff1b;那么&#xff0c;设计制作一个卡通人物的行走效果&#xff0c;如何从没有头绪的任务…

绝地服务器维护7月5日,绝地求生正式服7月5日停机更新维护内容公告

我们将在北京时间7月5日(星期四) 上午10点 开始正式服的停机维护。- 维护开始时间&#xff1a;7月5日(星期四) 上午10点 (预计3小时)玩家们大家好&#xff0c;伴随PGI2018的临近&#xff0c;我们将向大家呈现以PGI为主题、全新风格的PUBG。我们将向玩家们提供丰富的活动和奖品&…

javafx2_JavaFX 2 GameTutorial第1部分

javafx2介绍 我相信大多数软件开发人员可能会在年轻人&#xff08;年轻人&#xff09;生活的某一时刻被迫创建游戏来帮助他们学习编程语言&#xff08;我知道我曾经做过&#xff09;。 以前&#xff0c;我的第一台计算机实际上是Franklin Ace 1000 &#xff0c;后来是Apple [] …

webstorm最新破解方法

方法来自 Rover12421 大神。 1.从官网下载WebStorm2016.1安装。 2.下载 破解补丁 并解压&#xff0c;记住路径 3.编辑WebStorm安装目录下 bin 文件夹中的 WebStorm.exe.vmoptions 与 WebStorm64.exe.vmoptions 文件&#xff0c; 在头部加上 -javaagent:D:\Program Files (x86)\…

ajax 页面无刷新,Ajax的页面无刷新实现详解(附代码)

这次给大家带来Ajax的页面无刷新实现详解(附代码)&#xff0c;Ajax页面无刷新实现的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。ajax (ajax开发)AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML)&#xff0c;是指一种创建交互式网页…

运营管理最新版史蒂文森_运营增长人都在看的硬核案例拆解是怎么做的?

你会拆案例吗&#xff1f;大部分运营增长人听到这个问题都会愣一下&#xff0c;心想这有什么会拆不会拆的&#xff1f;看一下活动规则&#xff0c;把流程走一遍&#xff0c;不就可以了&#xff1f;当马上要做活动但又没思路缺灵感时&#xff0c;我们通常会试着先去关注一下相关…

pc网站和移动网站在同一服务器吗,机动都市阿尔法PC服和移动服互通吗

机动都市阿尔法PC服已经开启了&#xff0c;很多小伙伴想知道这个PC服和移动服有什么区别&#xff0c;互通情况怎么样&#xff0c;下面就是机动都市阿尔法PC服和移动服互通的具体内容&#xff0c;一起来看看吧。PC服和移动服互通吗国服PC版开启时&#xff0c;将额外增设一个独立…

teamcity_TeamCity构建依赖项

teamcity介绍 构建依赖关系的主题既非琐碎的&#xff0c;也非次要的。 各种构建工具从不同的角度处理此主题&#xff0c;从而提供了各种解决方案&#xff0c;每种解决方案都有其优点和缺点。 熟悉发行版和快照依赖关系的Maven和Gradle用户可能不了解TeamCity快照依赖关系&…

刷新器-Java EE 7后端十大功能

这是我的Java EE 7小知识系列的第二部分。 在进行简要介绍的第一个介绍之后&#xff0c;我决定请Arjan Tijms撰写有关Java EE 7中他最喜欢的新后端功能的文章。如果您关注Java EE领域&#xff0c;您将知道Arjan。 他是Java EE开发人员&#xff0c;JSF和Security EG的长期成员&a…

spark官方文档_这些未在 Spark SQL 文档中说明的优化措施,你知道吗?

本文来自上周(2020-11-17至2020-11-19)举办的 Data AI Summit 2020 (原 SparkAI Summit)&#xff0c;主题为《Spark SQL Beyond Official Documentation》的分享&#xff0c;作者 David Vrba&#xff0c;是 Socialbakers 的高级机器学习工程师。实现高效的 Spark 应用程序并获…

一键对频对讲机好吗_挑战传统,新型对讲机展现独特一面--极蜂智能网络对讲机...

说起对讲机你首先想到的是什么样子的&#xff0c;是香港电影中警察佩戴的那种&#xff0c;还是国内建筑工地上使用的傻大粗那种&#xff0c;不过无论是哪种形状的&#xff0c;现实中确实非常的实用。不过随着科技的发展&#xff0c;很多不可能的事情已经变为现实&#xff0c;而…

提防Java中的函数式编程!

这对函数式编程并不会造成太大的影响&#xff0c;这真棒。 这是关于某些实践的警告&#xff0c;您很可能会将其应用于您的代码&#xff0c;而这完全是错误的&#xff01; 。 高阶函数对于函数式编程是必不可少的&#xff0c;因此&#xff0c;谈论它们将帮助您成为聚会中的焦点…

LoadRunner脚本增强技巧之检查点

检查点的设置理解起来非常简单&#xff0c;就是要在服务器返回的页面中检查是否存在关键信息。检查点函数的错误会导致整个脚本运行结果的失败&#xff0c;通过这个功能可以方便地定位脚本运行中的逻辑错误。检查点的设置通常分为两种&#xff0c;一种是对文字的检查&#xff0…

Spark简介,您的下一个REST Java框架

希望今年您对Java的热情很高&#xff01; 今天&#xff0c;我们将研究一个清新&#xff0c;简单&#xff0c;美观且实用的框架&#xff0c;以Java编写REST应用程序。 它将非常简单&#xff0c;甚至根本不会看起来像Java。 我们将研究Spark Web框架。 不&#xff0c;它与Apache…

SQL Search

Press TAB to expand wildcard tab键之后&#xff0c;会自动展开&#xff0c;直接枚举表中所有的字段 根据名字查找存储过程&#xff0c;发现找不到 原因是&#xff0c;本地是一个备份库。服务器上通过sql source control进行版本控制的。 在通过sql source control将服务器上新…

Python异常处理和进程线程

写在前面 最坏的结果&#xff0c;不过是大器晚成&#xff1b; 一、异常处理 - 1.语法错误导致的异常 - 这种错误&#xff0c;根本过不了python解释器的语法检测&#xff0c;必须在程序运行前就修正&#xff1b; - 2.逻辑上的异常 - 即逻辑错误&#xff0c;例如除零错误&#xf…

在Oracle中使用JDBC插入功能

介绍 在本文中&#xff0c;我将显示一个示例&#xff0c;说明如何使用Oracle支持的JDBC批量插入功能&#xff0c;这些功能特定于Oracle。 有关为什么可能希望一般使用批量插入的更多详细信息&#xff0c;例如&#xff0c;在某些情况下需要考虑性能&#xff0c;请参阅Joormana …

Vue+ECharts的小示例

VueECharts做数据可视化1. Vue Vue 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。另一方面&#xff0c;当与现…

汇编学习笔记(3)-80x86指令集

前言 &#xff08;1&#xff09;指令的一般格式 [标号:] 助记符 [操作数1 &#xff0c; [操作数2]] [; 注释] 一行一条指令 助记符就是指令的名称&#xff0c;每条指定必定有个助记符。 助记符前面的标号是给汇编编译器看的&#xff0c;由我们自己取名&#xff0c;一般取表示本…