Windows底层开发调试工具链详解:SDK、WDK、ADK、WinDBG与poolmon实战

Windows SDKWDKADK 本内容遵循CC 4.0 BY-SA版权协议
峰瑞资本 峰瑞资本 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要

这串工具名,看着熟悉的可能是个老开发,看着发懵的大概率是刚准备碰Windows底层或者驱动的人。我当年第一次在同事桌面上见到poolmon和WinDBG并排挂着的时候,也愣了半天:ADK、SDK、WDK、WPT、WPR、WPA……每个缩写都眼熟,放一起就分不清谁是谁。后来在Windows平台折腾了几年,把这些工具挨个实际用了一遍,才敢说摸清了这条工具链。这篇文章不绕圈,直接把几个缩写掰开揉碎讲清楚:各是干什么的、怎么装、什么场景用哪个,以及我在实操里踩过的坑。

先说一个容易劝退的点:这套东西的学习曲线确实不算平缓,但拆开看其实没那么复杂。简单理解就是三大套件(SDK、WDK、ADK)负责“造东西”,WPT/WPR/WPA负责“查性能”,WinDBG负责“看崩溃”,poolmon负责“盯内存”。下面逐个展开。

1. 先分清三大套件:SDK、WDK、ADK各管哪一段

1.1 SDK——Windows应用开发的公共底座

先说SDK,因为它是另外两个套件的公共底座。Windows SDK的正式名称是Windows Software Development Kit(Windows软件开发工具包),提供的是最基础的开发组件:C/C++头文件、导入库、文档和一堆命令行工具。

你打开Visual Studio新建一个Win32项目时,编译器读写代码依赖的平台API声明,比如windows.h、d3d11.h,就是Windows SDK提供的。Windows SDK还带了一批构建期工具,没事儿不会注意到但缺了就要抓狂,比如签名工具signtool.exe、消息编译器mc.exe、VB脚本编译器、dumpbin.exe等等。这些工具的作用是在编译之后帮你检查、签名、修改生成物。

跟“SDK”这门亲戚有关的报错也特别多。很多人在群里问“vs studion sdk找不到”,多半是安装Visual Studio时精简了组件,没勾Windows SDK。解决方式很简单:打开Visual Studio Installer,选“单个组件”,搜索“Windows SDK”,勾上对应版本(比如10.0.22621.0),点修改,等装完重启VS就行。

顺带澄清一个概念:网上搜“android sdk安装”“sdk manager failed to query pre-packaged sdk versions”这类问题,那是Android开发环境的坑,和Windows SDK不是一个东西。Android Studio那个SDK Manager解决的是安卓SDK平台的安装问题,跟本文这套Windows底下开发链没关系,别混在一起搜,容易浪费时间。

1.2 WDK——驱动开发专用的“私货”套件

WDK全称Windows Driver Kit(Windows驱动程序工具包),它的定位非常明确:给Windows写驱动的人使用。WDK不是独立于SDK存在的,它依赖Windows SDK,在SDK基础上增加了驱动开发所需的头文件、库、模板和工具。

举几个典型内容:驱动开发天天要碰的ntddk.h、wdm.h、wdf.h,KMDF/UMDF框架库,还有驱动构建工具Stampinf(修改INF文件中的日期和版本)、Inf2Cat(驱动包签名目录验证),以及部署和验证工具devcon.exe、verifier.exe(驱动验证器)。我常用的poolmon.exe也藏在WDK里,具体位置后面细说。

WDK安装有个经典坑:版本必须和Visual Studio匹配。比如某版本的WDK要求VS 2022 17.x,你没升级VS就装新WDK,装完新建项目里根本看不到驱动模板。遇到这个情况不要急着重装,先查微软官方“WDK版本兼容表”,把VS和WDK的版本对齐,驱动模板就出来了。另外WDK和SDK共用同一个“Windows Kits”目录,这也是为什么很多人把两个工具包搞混——很多工具在装完SDK或WDK后都出现在同一个目录树里,你根本分不清哪个是谁装的。正常现象,不影响使用。

1.3 ADK——部署评估加性能工具一锅端

ADK全称Windows Assessment and Deployment Kit(Windows评估和部署工具包),和前面两个不一样的一点是:它面向的不是写代码,而是“部署系统”和“评估性能”。

ADK里面有两块大内容。一块是部署工具:Windows PE(Windows预安装环境,做启动U盘、离线维护系统必备)、DISM(部署映像服务和管理,用来灌镜像、加驱动包)、USMT(用户状态迁移工具,企业升级换机时迁移用户配置文件)、VHD等。另一块是评估工具,其中就包含了WPT(Windows Performance Toolkit)。很多人装了ADK却找不到WPR/WPA,就是因为安装ADK时没有勾选Windows Performance Toolkit这一项,默认是不勾的。

ADK版本和Windows系统版本强相关。给Windows 11做评估,就去装对应Windows 11版本的ADK;给Windows 10做镜像维护,用Windows 10时代对应的ADK版本。这个不影响开发编译,但会影响DISM对镜像版本的支持范围,实操时值得留意。

1.4 三大套件关系与选型参考

很多初学者会问:我写个普通应用,需要把三个都装上吗?我的回答是:日常Windows应用开发,装SDK就够了;写驱动,装WDK(SDK也会被自动带上);搞运维部署或者性能评估,再装ADK。

套件 全称 主要面向 核心内容 典型工具
SDK Windows Software Development Kit Windows应用/组件开发 头文件、导入库、文档、构建工具 signtool.exe、dumpbin.exe、mc.exe
WDK Windows Driver Kit 驱动开发 驱动头文件、KMDF/UMDF库、驱动工具 devcon.exe、verifier.exe、poolmon.exe
ADK Windows Assessment and Deployment Kit 系统部署与性能评估 Windows PE、部署工具、评估工具、WPT DISM、USMT、WPR、WPA

简单总结就是:SDK是底座,WDK是SDK之上的驱动扩展,ADK是独立的部署/评估体系。三者物理上都落在“C:\Program Files (x86)\Windows Kits\”这个目录树下,所以你的机器上可能同时存在多个版本,这也是后文“命令找不到”这一问题的根源。

2. 性能问题怎么查:WPT、WPR、WPA的一顿操作

2.1 三个W的关系,一句话说清

WPT是Windows Performance Toolkit(Windows性能工具包),它包含两个独立程序:WPR(Windows Performance Recorder)和WPA(Windows Performance Analyzer)。WPR负责“录”,WPA负责“看”,WPT是打包的总名称。

我做性能分析时习惯拿行车记录仪打比方:WPR就是记录仪,把一段时间内系统所有关键事件和CPU行为录下来;WPA就是事故回看软件,对着录像找是哪辆车、哪条路出了问题。WPR的输出是一个后缀为.etl的文件,全称Event Trace Log,里面存的是ETW(Windows事件跟踪)数据。WPA打开这个.etl文件,就能把海量事件整理成表格和图表。

2.2 WPR录制:图形界面还是命令行,你选一个

WPR安装后有两个用法。简单场景直接用图形界面:运行WPR.exe,在窗口左侧选择录制内容,比如“First-level triage”(一级概要)代表常规诊断采集,或者选CPU、内存、磁盘、网络等专项profile,点“Start”开始录,干完事再点“Save”。

我比较推荐命令行,尤其做自动化采集时:

BASH
wpr -start GeneralProfile -filemode
wpr -stop C:\Perf\trace.etl

这段命令里,-start GeneralProfile是启动默认的常规指标采集,-filemode表示直接把数据写文件而不是先放内存缓冲,适合长时间录制。-stop后面跟保存路径,生成etl文件。

如果只想录十几秒峰值时间,可以加时长限制:

BASH
wpr -start CPU -duration 30
wpr -stop C:\Perf\cpu30.etl

这种录制出来的文件不会太大,分析起来也快。需要说清楚的是,WPR录制期间会把大多数进程的上下文切换、CPU采样、磁盘IO事件都记录下来,所以录得越久文件越大,实测下来几分钟可能就是好几个GB。建议先明确想抓什么问题,再决定录制时长和profile。

2.3 WPA分析:从“一堆数据”到“一张结论表”

拿到etl文件后的第一步不是闷头双击,而是想清楚要分析什么维度。以最常见的CPU高占用排查为例:在WPA里打开etl文件后,左侧Graph Explorer里找到“CPU Usage (Sampled)”,双击,右侧会出现一张表格,里面是按进程、模块、函数分层的CPU采样数据。

接下来的操作顺序和方法是:在表格区把“Process”列拖到“Hierarchy”区域,这样就能按进程分组;再把“Stack”列拖进去,就能一层层展开调用栈。表格上方有个排序字段,按采样“Count”降序排列,采样次数最多的地方就是热点。如果目标进程在列表里很靠下,可以右键该进程的行,选择“Select Row”,把非目标行过滤掉。

WPA默认不带行号、地址解析,如果你想看到函数名,前提是有符号文件。没有符号时,只能看到“模块+偏移量”,配合驱动源码里的.map文件才能反查。所以做性能分析前,把符号路径配好是优先级最高的事。

2.4 一个完整的CPU高占用排查演练

举个例子,客户反馈某服务进程在特定时间段CPU飙到接近100%。我在压力测试机上先跑:

BASH
wpr -start GeneralProfile -duration 30
wpr -stop C:\Perf\issue.etl

然后用WPA打开,按进程分组做CPU采样统计,很快看到“WorkerService.exe”占了88%的采样总数。再拖入Module列,发现这个进程内部的“WorkModule.dll”是主力消耗者;接着拖入Stack列,调用栈第一层就是“WorkModule.dll!WorkerThread+0x12c”。顺着这个地址翻代码,发现WorkerThread的循环里有个不断重建的临时对象和文件读取操作,导致上下文切换频繁、CPU被打满。

这个流程的通用性很强,关键就三步:WPR录制、WPA分组、按模块和栈展开定位热点。Windows疑难性能问题,绝大多数逃不出这三板斧。

3. WinDBG调试:从附加进程到分析蓝屏dump的完整路径

3.1 下载安装与符号设置,先别急着敲命令

WinDBG(Windows Debugger)是微软官方的调试器。现在获取WinDBG的途径主要有两个:一是从Microsoft Store搜索“WinDbg”,安装新版(曾经叫WinDbg Preview,现在商店里名字就叫WinDbg);二是安装Windows SDK时勾选“Debugging Tools for Windows”,经典版WinDBG会被装到类似“C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe”的路径。

我看到网上有人还在搜“windbg preview 下载”,其实新版WinDBG已经转正,不用再费劲找预览版资源。新版界面是深色主题,支持脚本和扩展,底层调试引擎和经典版一致。功能上不需要太纠结,找一个能用的版本就行。

装完WinDBG第一件事,配符号:

TEXT
.sympath srv*C:\Symbols*https://msdl.microsoft.com/download/symbols
.reload /f

第一行表达的意思是:本地C:\Symbols作为缓存目录,自动去微软公共符号服务器下载所需符号。第二行强制重新加载当前模块的符号。符号是什么?简单说就是“地址到函数名”的翻译表。没有符号,你看到的是一个十六进制地址,有了符号,地址就会变成myDriver!FunctionName+0x30。调试Windows程序不配符号,等于蒙眼找路。

3.2 常用命令速查表,先抄下来背熟

WinDBG的命令体系很大,但日常用到的核心命令有限。我整理了一份速查表,基本覆盖从崩溃分析到驱动调试的刚需:

命令 作用
!analyze -v 自动分析崩溃原因,输出BugCheck分析和建议,必先执行
k / kb / kp 显示当前调用栈;kb带参数;kp带参数和栈指针
lm / lmv 列出已加载模块;lmv会显示模块版本、时间戳、符号状态
!process 0 0 内核调试下枚举所有进程
!thread 查看当前线程详细信息
bp / bu / bl / bd / be 下断点、绑定式断点、查看断点列表、禁用断点、启用断点
g 继续执行
p / t 单步执行:步过 / 步入
.excr 切换异常上下文,看崩溃发生现场
.dump 把当前进程转储保存为dump文件
!poolused 查看按PoolTag聚合的池内存使用(内核调试)
!drvobj / !devobj 查看驱动对象、设备对象相关信息

“!analyze -v”是我在任何dump上的第一声问候。不管是应用崩溃还是系统蓝屏,这个命令会给出高度概括的分析结果,包括BugCheck代码、发生模块、可能原因。但它不是神谕,瞎信自动结论会翻车——它偶尔会指向错误的模块,尤其是驱动冲突场景。正确姿势是:让!analyze -v给出初步方向,然后用k看调用栈,用lmv看模块版本,交叉验证。

3.3 分析一个崩溃dump的标准流程

假设用户丢给你一个.dmp文件(可能是应用崩溃生成的,也可能是蓝屏产生的memory.dmp)。把文件拖进WinDBG窗口,或者用“File -> Open Dump File”打开,然后按下面步骤操作:

第一步,输入!analyze -v。输出里先看“BugCheck Analysis”区域,如果是一般应用崩溃,会显示异常信息而不是BugCheck;如果是系统蓝屏,会显示类似“DRIVER_IRQL_NOT_LESS_OR_EQUAL (0xd1)”的代码。大多数情况下,这一段会直接给出“PROCESS_NAME”和“MODULE_NAME”。

第二步,输入lmvm 模块名。比如输出里写着“Probably caused by: mydriver.sys”,那就执行lmvm mydriver,看它的文件版本、时间戳、链接时间。这一步能快速判断用户装的驱动是不是旧版、是不是官方版本。

第三步,输入.excr,再输入kb看崩溃线程的完整调用栈。调用栈里通常会有几层框架代码,顺着最内层就能摸到具体逻辑。

第四步,实在定位不了,把!analyze -v输出里的“STACK_COMMAND”提示的命令执行一下,WinDBG会自动补全栈信息。这个命令组合可以处理掉我遇到过的绝大多数dump问题。

3.4 内核调试与用户态调试的差别,别搞混

WinDBG有两种工作模式。用户态调试模式下,你可以附加到一个正在运行的进程,或者打开一个进程的dump,下断点、看变量,像Visual Studio调试器一样工作。附加命令可以直接在WinDBG里选“File -> Attach to a Process”,也可以用命令行windbg -p PID。

内核调试模式则是调试整个Windows内核,主要用于驱动开发和系统崩溃分析。这个模式需要目标机器(被测机)和主机(跑WinDBG的机器)分开,典型配置是两台物理机或者一台物理机加一台虚拟机,通过串口、USB或者网络连接。目标机上要先执行:

TEXT
bcdedit /debug on
bcdedit /dbgsettings net hostip:192.168.1.100 port:50000 key:xxx

然后重启目标机,主机端WinDBG里选择“Kernel Debug”并按配置连接。注意一件事:内核调试模式下,按Ctrl+Break会瞬间冻结整个目标系统,生产环境千万别乱按。我吃过这个亏,恢复现场比定位问题麻烦十倍。如果想在开发机上方便调试驱动,可以开启测试签名模式:bcdedit /set testsigning on,但这个操作属于开发环境专用,别在客户机器上折腾。

4. poolmon:内存池泄漏排查的终极监视器

4.1 什么是poolmon,它监视什么

Windows系统的内存池分两种:分页池(Paged Pool),可以被换出到磁盘;非分页池(Nonpaged Pool),永远驻留物理内存。驱动大量使用这两种池来分配临时内存,一旦驱动代码里分配后忘了释放,内存池就会持续增长,最终导致系统无可用内存、蓝屏或假死。

poolmon.exe就是针对这个场景的专用工具:它按“PoolTag”(池标签)统计系统里每一次池分配。每个驱动的分配代码里通常会带一个四字符的tag,比如“Tcp ”代表TCP相关分配,“File”代表文件系统相关。poolmon把相同tag的分配次数和字节数汇总,你就能一眼看出哪个tag在疯长。

工具从哪里来?最省事的一条路径是装WDK时带上,位置通常在“C:\Program Files (x86)\Windows Kits\10\Tools\x64\poolmon.exe”。我在Sysinternals工具集里也见过它。不管来源,必须在管理员权限的命令行窗口里运行,普通权限下输出会不全。

4.2 poolmon参数怎么用,几句命令说清楚

直接双击运行poolmon会刷出一大屏数据,新手容易看懵。我常用的组合是:

BASH
poolmon /p /P /g

这里的/p监视非分页池,/P监视分页池,/g按tag分组显示。这样输出会清晰很多,每个tag的分配数、释放数、总字节数排成一列列。如果只想盯着某个可疑tag,用过滤参数:

BASH
poolmon /i Tcp

只显示tag为“Tcp”的记录,效率高很多。参数细节不必硬背,操作一遍poolmon /?就能看到完整列表。重点不在参数,在于怎么解读输出:一列是当前分配数,一列是当前字节数。分配数持续增长、字节数持续增长,但系统业务并没有对应增长,那就是泄漏信号。

4.3 内存池泄漏排查的实操套路

排查泄漏事件,不能只看一屏输出,要打“时间差”。我的标准流程是:

第一次采样:在干净状态下运行poolmon /p /P /g,把结果截图或者导出保存。这个干净状态指的是业务空闲时,比如晚上没有服务高峰。隔一个小时,第二次采样同样执行命令。两次对比,看哪些tag的分配数明显增加且释放数不涨。增加得最快的那个tag,就是第一嫌疑人。

第二招,去WinDBG内核调试环境里用!poolused 2或!poolfind看这个tag的分配调用栈。poolmon的特点是“看到趋势”,WinDBG的特点是“抓现场”。趋势告诉你往哪儿查,现场告诉你是谁分配了。

第三招,实在不行上驱动验证器(Driver Verifier)。在verifier.exe管理器里勾选“池跟踪”,然后重启并加载怀疑的驱动,让系统在池分配异常时直接蓝屏并生成dump。蓝屏dump里通常会有分配栈,比靠猜靠谱得多。

这里有一个老手才懂的坑:同一个tag可能被多个驱动共用。比如Windows自带的某个组件和一个第三方驱动都用同一个四字符tag,你在poolmon里看到那个tag在涨,不一定就是第三方驱动的问题。看到可疑tag后,务必回到源码或者用符号确认归属,再下结论。排查系统问题最忌“看着像就干”。

4.4 我实际处理过的一个泄漏案例

某次线上机器频繁报“非分页池内存不足”,任务管理器里物理内存还有几个G,系统却不断蓝屏。我开poolmon挂了一小时,发现tag“Ntfr”的分配数从几万涨到上千万,基本不下降。顺藤摸瓜到WinDBG里查这个tag,发现是某驱动在即插即用回调函数里做了内存复制却少执行了一次释放操作。

这一类问题的麻烦在于:错误不一定高频率触发,可能跑几天才漏一次,所以必须长时间观察tag增长曲线。poolmon的价值恰恰在于它轻量、不打断系统、适合长时间挂机。别指望它分析完给你交报告,它是侦察兵,不是法官。

5. 这套工具链的常见问题和避坑记录

5.1 装了套件还是找不到命令,先查这些路径

“明明装了WDK,poolmon哪儿去了?”这是找我请教最多的问题。原因很简单:这些工具不在系统PATH里,而且是分散在多个目录的。WinDBG在Debuggers文件夹,poolmon、devcon在Tools文件夹,WPR/WPA在“Windows Kits\10\Assessment and Deployment Kit\Windows Performance Toolkit”下面。命令找不到时,最快的办法是用Everything搜索工具名,然后选择对应架构版本。我习惯在桌面放一个批处理文件,把常用工具的完整路径写进去,需要时直接调用。

5.2 符号加载失败,大概率是这几种原因

WinDBG提示“Cannot find symbol file”是最常见的入门坎。排查顺序:第一,确认符号路径格式是srv*本地缓存*服务器地址,中间星号别少;第二,确认本机网络能访问微软符号服务器,部分企业内网需要先设置代理;第三,执行.reload /f强制重载,别省这步;第四,模块版本和符号版本对不上时,可以下载对应版本的离线符号包手动放置。符号配好以后,从“lm”命令的输出里能看到模块的状态,状态好的会显示“Symbols”,没有的就是普通路径。看起来小,实际能省掉一晚上的茫然。

5.3 WPR录制出来的ETL文件太大,处理不动

WPR默认的捕获范围很大,录几分钟可能产生数GB文件,打开加载慢得让人想砸电脑。解决思路有三条:一,缩短录制时间,想抓峰值就在问题发生前一两分钟再开始录;二,用更精简的profile,比如单纯的CPU profile比GeneralProfile小很多;三,能用-filemode就直接写文件,别用内存缓冲,后者在录制时间过长时会丢数据。分析大文件时,打开WPA后先把时间范围缩小,再对局部拖拽分析,别一上来就加载全部。

5.4 VS找不到SDK、WDK装完没模板,多数是版本问题

Visual Studio里新建项目看不到驱动模板,或者编译时报找不到Windows SDK头文件,这类问题的根源九成是“版本不匹配+组件缺失”。SDK缺失,去VS Installer的“单个组件”里补装。WDK和VS版本不匹配,去WDK下载页面对照版本兼容表查;判断依据就是安装向导里有没有提示“需要Visual Studio xx.x”。装完之后先重启VS,再新建项目,模板不出来再检查版本。这套操作我重复过很多次,基本能解决。

5.5 工具架构和权限问题,最容易忽略

再补充一个细节:64位系统上打开的poolmon或WinDBG,最好选x64目录下的可执行文件。用x86版本分析x64进程的dump,栈信息会因WOW64转换变得非常难读,本来半小时能定位的问题可能要折腾两小时。另外,poolmon、WPR、WinDBG内核调试这些命令全部需要管理员权限,普通命令行窗口下跑出来数据不完整,或者直接提示权限不足。新建一个“管理员身份运行”的PowerShell窗口做调试,是最省事的习惯。

5.6 构建时找不到microsoft.windowsappsdk.props,别慌

有开发者在构建Windows App SDK项目时遇到一个报错,指向_artifacts\winui_packages\sdk\build\native\microsoft.windowsappsdk.props这类路径找不到。这通常是项目里写死了某个本地props文件路径,但那个目录不存在。最稳妥的解法是:项目里通过NuGet安装Microsoft.WindowsAppSDK包,让构建系统自动处理路径;如果是命令行构建,检查WindowsAppSDKInstallPath环境变量有没有正确设置。这类问题的本质是路径解析问题,和上面几个SDK类问题一样,优先检查版本和路径配置,别改代码逻辑。

写到最后,留几个实在建议

如果只让我留一句经验:不要在系统已经“病入膏肓”的时候才想起装这套工具。符号路径平时就配好,WPR的常用命令平时跑熟,WinDBG的基础命令贴在电脑边上,等真出了蓝屏、卡死、内存泄漏,你才能稳下来按顺序排查。

我习惯的排查顺序是:先poolmon看内存池tag有没有疯长,再用WPR录一段trace给WPA分析CPU和磁盘,最后把dump丢给WinDBG做解剖。三个工具互为补充,交叉验证。Windows上的疑难杂症,这套组合拉起来,基本没有兜不住的。另外记住一点:工具输出的自动结论都只能当线索,真正的判断还得你自己来。

相关推荐

基于Python+Open CV的手势识别算法设计

伴随着人工智能时代的到来,人机交互的领域也逐渐成为研究的一大方向;其中,手势识别是人机交互领域的一项关键技术,自此手势识别也迎来了一波高潮,近几年无论是在消费领域、电子领域、数码领域、家电领域甚至汽车领域上,都能或多或少的见到手势识别的身影。 手势识别在设计智能高效的人机界面方面具有至关重要的作用, 目前手势识别已应用到手语识别、智能监控、到虚拟现实等各个领域,手势识别的原理都是利用各种传感器(例如红外、摄像头等)对手部的形态进行捕捉并进行建模,形成一个模型信息的序列帧,而后将这些信息序列转换为机器能够识别的相对应指令(例如打开、切换菜单、移动等)来完成控制。 采用Python的集成开发环境Pycharm进行本次课程设计,在Pycharm中进行需要库(模块)的下载,调取电脑摄像头,按帧读取摄像头采集到的头像,形态学处理,图像旋转(由于摄像头采集到的图像是镜像,需要用cv2.flip将摄像头采集到的图像进行处理),选取图片中固定位置作为手势输入,用红线画出手势识别框,基于hsv的肤色检测,进行高斯滤波,找出轮廓,求出图像中手势的凹凸点,手指间角度求取。

努力学习前端的小陈

ROS-CV-ImageConverter:将ROS图像转换为OpenCV(cv :: Mat)类型的图像

ROS-CV图像转换器 依存关系 cv_bridge(ROS软件包)

Willis Wang

计算机视觉图像处理-CV2与图像插值算法

用最近邻插值与双线性插值原理完成图像缩放 最近邻插值,是指将目标图像中的点,对应到源图像中后,找到最相邻的整数点,作为插值后的输。缺点:使用最近邻插值算法处理图像放大时,在图象中可能出现明显的块状效应 双线性插值,在两个方向上做三次线性插值。使用双线性插值算法处理图像放大时,在图象中可能出现马赛克 代码 import cv2 img = cv2.imread(’./xiabang.jpg’, cv2.IMREAD_UNCHANGED) #缩放比例 scale_percent = 0.3 width = int(img.shape[1] * scale_percent) height = int

weixin_38697274

基于水平集CV模型的图像分割(Matlab代码)

基于水平集CV模型的图像分割(Matlab代码),全套代码

小宇QAQ

导向滤波(guide_filter)的python实现

导向滤波(guide_filter)的python实现,可以结合暗通道;理论实现比较好的图像去噪效果。

zachzhan_g
返回顶部
峰瑞资本
博客等级 码龄9年 27粉丝 2,574原创