-
鸿蒙开发长截图功能经验总结一、关键技术难点总结1. 问题说明在鸿蒙应用开发中,截图功能是常见的需求,用户常常需要截取整个页面(比如长网页、聊天记录等),但普通截图只能截取当前屏幕显示的内容,长截图才能满足用户需求,但实现高效的长截图功能面临以下核心挑战:问题1:长内容分页显示问题如何准确计算超出屏幕的长文本高度实现精准的内容分页与翻页控制保持分页内容连续性和完整性问题2:截图功能实现难点获取完整内容区域的组件快照2. 原因分析1. 内容分页计算难点文本内容高度动态变化,受字体大小、行高、设备分辨率等多因素影响需要精确计算单行高度作为分页基准单位页面高度需与行高对齐以保证分页完整性2.截图功能技术限制鸿蒙的componentSnapshotAPI只能捕获当前可见区域3. 解决思路1.动态分页计算实时监测文本区域变化,通过onTextAreaChanged监听文本区域和滚动区域的变化,动态更新布局参数(行高、总高度、每页高度)并计算总页数。基于行高计算分页逻辑,使用@State变量跟踪文本行高、页面高度、总内容高度、当前滚动偏移和页码。 翻页时调整滚动偏移量,并更新当前页码。2.截图处理流程获取内容组件像素快照,异步编码为PNG格式安全存储到系统相册使用componentSnapshot.get获取组件快照(像素映射),然后使用imagePacker将像素映射编码为PNG图片文件,通过photoAccessHelper保存到相册。4. 解决方案1. 动态分页实现核心逻辑代码:// 状态管理 @State lineHeight: number = 0; // 单行文本高度 @State pageHeight: number = 0; // 页面最大高度 @State totalTextHeight: number = 0; // 文本总高度 @State textContent: string = " "; // 文本内容 @State scrollPos: number = 0; // 滚动位置 @State totalPageCount: number = 1; // 总页数 @State currentPageNum: number = 1; // 当前页码 scroller: Scroller = new Scroller(); // 滚动控制器 // 常量定义接口 interface TextConstants { Previous_Page: string; Next_page: string; SAVE: string; SAVE_failure: string; } // 消息常量 const MSG: TextConstants = { Previous_Page: '没有上一页', Next_page: '没有下一页', SAVE: '图片已保存到相册', SAVE_failure: '保存失败,请检查权限!' }; // 判断是否是首次测量行高 isFirstLineMeasurement(newArea: Area): boolean { return this.lineHeight === 0 && newArea.height > 0; } // 初始化行高 initializeLineHeight(newArea: Area) { this.lineHeight = newArea.height as number; this.initTextContent(); } // 初始化文本内容 initTextContent() { this.textContent = this.createTextContent(); } // 生成文本内容 createTextContent() { let content = ""; for (let i = 1; i <= 15; i++) { content += ` ${i}、文本内容文本内容文本内容文本内容文本内容文本内容。`; } return content; } // 处理文本区域变化 onTextAreaChanged(newArea: Area) { if (this.isFirstLineMeasurement(newArea)) { this.initializeLineHeight(newArea); return; } this.updateTotalTextHeight(newArea); } // 计算有效页面高度(确保是行高的整数倍) calculateValidPageHeight(): number { return Math.floor(this.pageHeight / this.lineHeight) * this.lineHeight; } // 总页数 calculateTotalPages(): number { return Math.ceil(this.totalTextHeight / this.pageHeight); } //更新布局 adjustLayoutParams() { if (this.lineHeight > 0 && this.pageHeight > 0 && this.totalTextHeight > 0) { this.pageHeight = this.calculateValidPageHeight(); this.totalPageCount = this.calculateTotalPages(); } } 翻页控制实现// 处理翻页 tabpages(direction: 'shang' | 'xia') { if (this.isBoundaryPage(direction)) { this.showBoundaryToast(direction); return; } this.updatePagePosition(direction); } // 判断是否是边界页 isBoundaryPage(direction: 'shang' | 'xia'): boolean { return (direction === 'shang' && this.currentPageNum === 1) || (direction === 'xia' && this.currentPageNum === this.totalPageCount); } // 显示边界提示 showBoundaryToast(direction: 'shang' | 'xia') { const message = direction === 'shang' ? MSG.Previous_Page : MSG.Next_page; promptAction.showToast({ message }); } // 更新页面位置 updatePagePosition(direction: 'shang' | 'xia') { const scrollStep = direction === 'shang' ? this.pageHeight : -this.pageHeight; this.scrollPos += scrollStep; this.currentPageNum += direction === 'shang' ? -1 : 1; } 2.截图功能实现 // 获取应用上下文 getContext(): common.UIAbilityContext { return getContext(this) as common.UIAbilityContext; } // 处理保存错误 handleSaveError(error: BusinessError) { const err = error as BusinessError; console.error(`保存出错: ${err.code}, ${err.message}`); promptAction.showToast({ message: MSG.SAVE_failure, duration: 2000 }); } // 创建图片资源 async createImageAsset(context: common.UIAbilityContext) { const photoHelper = photoAccessHelper.getPhotoAccessHelper(context); return await photoHelper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg'); } // 打开文件用于写入 async openFileForWriting(uri: string) { return await fs.open(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); } // 捕获并保存内容 async captureAndSaveContent(file: fs.File) { const pixelMap = await componentSnapshot.get("textContentArea"); const packOpts: image.PackingOption = { format: 'image/png', quality: 100 }; const imgPacker = image.createImagePacker(); await imgPacker.packToFile(pixelMap, file.fd, packOpts); this.cleanupResources(imgPacker, file); promptAction.showToast({ message: MSG.SAVE, duration: 2000 }); } 3.性能优化策略1.精确区域约束Scroll(this.scroller) { //文本内容Text } .scrollBar(BarState.Off) .constraintSize({ maxHeight: this.pageHeight || 1000 }) //约束区域 2.资源管理(释放)// 清理资源 cleanupResources(packer: image.ImagePacker, file: fs.File) { packer.release(); fs.close(file.fd); } 5. 成果总结1.自适应内容分割技术:开发出基于行高的分页算法,精准识别文本段落边界。突破传统截图工具内容截断问题,确保每页内容完整性达100%。2.实时渲染优化系统:完成长截图功能实现,内存占用降低70%实现毫秒级内容重排响应,测试数据显示在100页文档中翻页响应时间<50ms
-
我们在通过数字平台对接集成IVS3800的时候有一些业务问题需要确认: 我们需要用到人或车检索的能力,存在一些疑问: 1.摄像机接入到IVS3800平台后是否默认就开启了录像功能,还是需要通过调用接口去主动设置录像的能力启动? 2. 检索时我们有两种方式,第一种方式时上传一张图片,第二种方式是输入特征值进行检索,针对这两种方式的智能分析任务的算法类型是有统一的的算法类型还是说上传图片进行分析是使用人脸分析算法类型,特征值的方式是以图搜图分析检索? 3. /video/intelligent-analysis/vcm/v1/start-intelligent-analysis 接口文档中说明了camera_id和file_id智能选其一,接口中如果选择file_id的方式,是否默认是在所有支持的摄像机中进行检索? 4./video/intelligent-analysis/vcm/v1/start-intelligent-analysis这个接口的下列参数,如果我选择了camera_id,我是否可以设置为录像模式进行分析?我可能需要分析的是某个时间段的录像,同时,智能分析任务是否可以支持多摄像机批量下发?stream_typeOString当camera_id参数生效时生效,默认为摄像机实况分析。0:实况1:录像 5. 车牌搜索与车辆特征搜索如果用摄像机的话需要创建什么类型的智能分析任务才能进行检索?
-
产品名称:MDC 610软件版本:MDC 610 问题现象(问题描述):咨询一下Adsfi::ImageData与opencv::Mat之间的数据转换是怎么样的,能否提供样例代码
-
为啥我一点论坛里面的压缩包就显示系统错误,我想下载那个weautomate里面pdf转图片控件需要的模块
-
在科技飞速发展的今天,苹果公司再次以其前瞻性的眼光和强大的研发实力,为我们带来了全新的AI眼镜与空间计算技术。这一创新不仅将重新定义我们与数字世界的交互方式,更预示着未来智能生活的新篇章。首先,让我们来探讨一下苹果的AI眼镜。这款眼镜融合了最先进的人工智能技术,能够实时识别用户的动作、语音和情绪,从而提供更加个性化、智能化的服务。无论是查询信息、导航路线,还是进行语音通话,AI眼镜都能以更加自然、便捷的方式满足用户的需求。同时,通过内置的传感器和摄像头,AI眼镜还能够实时监测用户的健康状况,如心率、血压等,为用户的健康保驾护航。而空间计算技术则是苹果AI眼镜的另一大亮点。空间计算通过精确测量和解析三维空间信息,实现了对现实世界的数字化映射。这意味着,用户可以通过AI眼镜看到虚拟物体与现实世界的完美融合,体验到前所未有的沉浸式交互。无论是游戏、教育还是工作,空间计算都将为我们带来更加丰富的视觉体验和更高效的工作流程。此外,苹果AI眼镜与空间计算技术的结合,还将催生出更多创新的应用场景。例如,在医疗领域,医生可以通过AI眼镜远程查看患者的身体状况,进行精准的诊断和治疗;在旅游领域,游客可以通过AI眼镜了解景点的历史文化和背景信息,获得更加丰富的旅游体验;在教育领域,学生可以通过AI眼镜与虚拟教师进行互动学习,提高学习效果和兴趣。当然,任何新技术的推出都不可避免地会面临一些挑战和质疑。例如,隐私保护、数据安全等问题都需要得到充分的重视和解决。但相信以苹果公司的实力和经验,这些问题都将得到有效的解决。总的来说,苹果发布的AI眼镜与空间计算技术无疑为我们打开了一扇通往未来智能生活的大门。它将改变我们与数字世界的交互方式,为我们带来更加便捷、高效、丰富的体验。随着技术的不断进步和应用场景的不断拓展,我们有理由相信,未来的智能生活将更加美好和精彩。
-
一、简介本项目主要运用华为云 EI 的 ModelArts 的自动学习以及云对象存储的 OBS,实现简单的垃圾分类系统。二、内容描述本垃圾分类图像识别系统主要通过创建图像分类自动学习项目,进行数据标注,进行自动训练和部署测试,再到最后的结束测试。 三、主要流程四、图像分类任务介绍ModelArts 服务之自动学习图像分类项目,是对图像进行检测分类。添加图片并对图像进行分类标注,每个分类识别一种类型的图像。完成图片标注后开始自动训练,即可快速生成图像分类模型。可应用于商品的自动识别、运输车辆种类识别和残次品的自动检测。例如质量检查的场景,则可以上传产品图片,将图片标注“合格”、“不合格”,通过训练部署模型,实现产品的质检。五、系统创建1、创建项目2、添加图片3、数据标注进行“一次性快餐盒-其他垃圾” 的数据标注。 先将左下角的数字选择为 45, 点击图片选择同类的图片(一次可以选择一张或者多张),在标签名栏填写当前选择图片的标签(已有的标签可以直接选择) , 输入标签名, 点击确定。4、自动训练5、部署测试预测结果:
-
使用RPA里的图像识别的控件时,它识别的是整个图片中所有的内容,怎么让他只识别图片的固定范围内的内容呢?
yd_214616271
发表于2023-02-22 08:32:30
2023-02-22 08:32:30
最后回复
This is WeAutomate
2023-02-22 10:18:31
171 3 -
ClimateNeRF 将物理模拟与 NeRF 场景模型融合在一起,制作出逼真的气候变化影响视频。下面将举一个简单的例子来说明在该方法中组件如何实现交互:假设现在要建立一个秋天洪水泛滥场景的模型。研究者首先获取图像,应用 Fall 风格,并根据结果构建出 NeRF。然后使用 NeRF 中的几何信息来计算水面。这可以用密度场、颜色场以及法线和 BRDF 表征来表示。最后为了渲染,我们用光线来查询模型。研究者编辑 NeRF 的密度和颜色函数来表示烟雾等效果,并截取光线来表示镜面效应。如果一条光线首先在 NeRF 中遇到高密度,那么会对这条光线使用 NeRF integral;但如果第一次碰撞是在水面,则光线会被反射到水面,然后用反射光线查询 NeRF。人们往往难以从日积月累的小变化中推导出实质性的结果,所以对于大多数人而言,将气候变化所产生的影响具像化也并非易事。减缓二氧化碳排放(比如减少化石燃料的使用)或弱化其环境影响(比如建立防洪措施)等的成本往往是人尽皆知的高昂,而其所能带来的收益却看似虚无缥缈、遥遥无期。如果无法将效果具像化,那么这些措施的投用也将举步维艰。本文中,来自 UIUC、马里兰大学帕克分校的研究者展示了如何将物理模拟(产生很好的天气效果预测,但只有中分辨率图像)与神经辐射场(产生 SOTA 场景模型,但据悉从未与物理模拟一起使用)合并使用。传统物理模拟可以在传统图形 pipeline 中为 3D 场景模拟出真实的天气效果,但这些方法基于传统的多边形模型,而构建能从单个场景的多个图像中产生逼真渲染的多边形模型仍具有挑战性。神经辐射场(NeRFs)可以从少量图像中生成逼真的 3D 场景模型。论文地址:https://arxiv.org/pdf/2211.13226.pdf研究者推出了一个 ClimateNeRF,它可以渲染出真实的天气效果,包括雾霾、雪和洪水。渲染效果和在画面上看到的一致,因此生成的影片往往令人信服。从更高的层面来看,研究者调整了场景图像以反映整体物理效果,并根据调整后的图像构建了场景的 NeRF 模型;接着复原了一个近似的几何表示,并在该几何中应用物理模拟;最后使用全新的光线追踪器进行渲染。调整图像这一步很重要。比方在冬天,树木图像的饱和度往往较低。研究者在一个 NGP 框架中使用一种新颖的风格迁移方法,它可以在不改变场景几何的情况下获得全局效果。光线追踪器通过在渲染过程中仔细考虑光线效果将物理模型和 NeRF 模型相融合,例如一条眼球射线可能首先遇到高密度的 NeRF(因此返回通常的结果)或者它可以击中插入的水面(因此被反射以再次查询模型)。研究者展示了 ClimateNeRF 在 Tanks and Temple、MipNeRF360 和 KITTI-360 数据集中不同 3D 场景的适用性,同时与 stable diffusion inpainting、ClimateGAN 等 SOTA 2D 图像编辑方法以及与 SOTA 3D NeRF stylization 的对比。定性和定量研究结果都表明,ClimateNeRF 的模拟结果明显较同类方法更加真实。此外,本文还展示了这种物理启发方法的可控性,可以改变水位、风力和方向,以及雪和雾霾的厚度和浓度。ClimateNeRF 方法可以做到:让视图保持一致(这也是可以用来制作影片的原因,这在逐帧合成中很难做到)、逼真的超级现实主义(场景是一个 NeRF 表示)、并且是可控的(用户可以在模拟中调整物理参数)。如下图 1 所示,生成的照片逼真、符合常理且具备时间一致性。
-
一名身穿白色连衣裙的少女正在伸手采花,她动作轻柔,姿态款款,眼眸低垂。
-
图像识别(Image Recognition),基于深度学习技术,可准确识别图像中的视觉内容,提供多种物体、场景和概念标签,具备目标检测和属性识别等能力,帮助客户准确识别和理解图像内容。分类文档链接备注最新动态cid:link_5 应用场景cid:link_2 API参考cid:link_3 FAQcid:link_4 华为云在线课程图像识别服务https://education.huaweicloud.com/courses/course-v1:HuaweiX+CBUCNXE025+Self-paced/about?isAuth=0&cfrom=hwc图像识别,基于深度学习技术,可准确识别图像中的视觉内容,提供数万种物体、场景和概念标签,具备目标检测和属性识别等能力,帮助客户准确识别和理解图像内容。图像处理理论、应用与实验https://education.huaweicloud.com/courses/course-v1:HuaweiX+CBUCNXE175+Self-paced/about?isAuth=0&cfrom=hwc计算机视觉是深度学习领域最热门的研究领域之一,它衍生出了一大批快速发展且具有实际作用的应用,包括人脸识别、图像检测、目标监测以及智能驾驶等。这一切本质都是对图像数据进行处理,本课程就图像处理理论及相应技术做了介绍,包括传统特征提取算法和卷积神经网络,学习时注意两者的区别。华为云开发者网图像识别 Image开放能力cid:link_6
-
最全图像融合论文及代码整理 News [2022-07-29] 我们的综述论文《基于深度学习的图像融合方法综述》被《中国图象图形学报》正式接收![论文下载] Github项目地址:https://github.com/Linfeng-Tang/Image-Fusion (欢迎大家Start、 Fork、 Fellow一键三连哦~) 图像融合(Image Fusion) 多模图像融合(Multi-Modal Image Fusion) 红外和可见光图像融合(Infrared and visible image fusion) 医学图像融合(Medical image fusion) 数字摄影图像融合(Digital Photography Image Fusion) 多曝光图像融合(Multi-exposure image fusion) 多聚焦图像融合(Multi-focus image fusion) 遥感影像融合(Remote Sensing Image Fusion) 全色图像锐化(Pansharpening) 通用图像融合框架(General Image Fusion Framerwork) 综述(Survey) 数据集(Dataset) 评估指标(Evaluation Metric) 通用评估指标(General evaluation metric) 遥感影像融合评估指标 Citation 图像融合系列博客还有: 图像融合综述论文整理参见:图像融合综述论文整理 图像融合评估指标参见:红外和可见光图像融合评估指标 图像融合常用数据集整理参见:图像融合常用数据集整理 通用图像融合框架论文及代码整理参见:通用图像融合框架论文及代码整理 基于深度学习的红外和可见光图像融合论文及代码整理参见:基于深度学习的红外和可见光图像融合论文及代码整理 更加详细的红外和可见光图像融合代码参见:红外和可见光图像融合论文及代码整理 基于深度学习的多曝光图像融合论文及代码整理参见:基于深度学习的多曝光图像融合论文及代码整理 基于深度学习的多聚焦图像融合论文及代码整理参见:基于深度学习的多聚焦图像融合(Multi-focus Image Fusion)论文及代码整理 基于深度学习的全色图像锐化论文及代码整理参见:基于深度学习的全色图像锐化(Pansharpening)论文及代码整理 基于深度学习的医学图像融合论文及代码整理参见:基于深度学习的医学图像融合(Medical image fusion)论文及代码整理 彩色图像融合程序参见:彩色图像融合 SeAFusion:首个结合高级视觉任务的图像融合框架参见:SeAFusion:首个结合高级视觉任务的图像融合框架 多模图像融合(Multi-Modal Image Fusion) 红外和可见光图像融合(Infrared and visible image fusion) 方法 标题 论文 代码 发表期刊或会议 基础框架 监督范式 发表年份 DenseFuse DenseFuse: A Fusion Approach to Infrared and Visible Images Paper Code TIP AE 自监督 2019 FusionGAN FusionGAN: A generative adversarial network for infrared and visible image fusion Paper Code InfFus GAN 无监督 2019 DDcGAN Learning a Generative Model for Fusing Infrared and Visible Images via Conditional Generative Adversarial Network with Dual Discriminators Paper Code IJCAI GAN 无监督 2019 NestFuse NestFuse: An Infrared and Visible Image Fusion Architecture Based on Nest Connection and Spatial/Channel Attention Models Paper Code TIM AE 自监督 2020 DDcGAN DDcGAN: A dual-discriminator conditional generative adversarial network for multi-resolution image fusion Paper Code TIP GAN 无监督 2020 RFN-Nest RFN-Nest: An end-to-end residual fusion network for infrared and visible images Paper Code InfFus AE 自监督 2021 CSF Classification Saliency-Based Rule for Visible and Infrared Image Fusion Paper Code TCI AE 自监督 2021 DRF DRF: Disentangled Representation for Visible and Infrared Image Fusion Paper Code TIM AE 自监督 2021 SEDRFuse SEDRFuse: A Symmetric Encoder–Decoder With Residual Block Network for Infrared and Visible Image Fusion Paper Code TIM AE 自监督 2021 MFEIF Learning a Deep Multi-Scale Feature Ensemble and an Edge-Attention Guidance for Image Fusion Paper Code TCSVT AE 自监督 2021 Meta-Learning Different Input Resolutions and Arbitrary Output Resolution: A Meta Learning-Based Deep Framework for Infrared and Visible Image Fusion Paper TIP CNN 无监督 2021 RXDNFuse RXDNFuse: A aggregated residual dense network for infrared and visible image fusion Paper InfFus CNN 无监督 2021 STDFusionNet STDFusionNet: An Infrared and Visible Image Fusion Network Based on Salient Target Detection Paper Code TIM CNN 无监督 2021 D2LE A Bilevel Integrated Model With Data-Driven Layer Ensemble for Multi-Modality Image Fusion Paper TIP CNN 无监督 2021 HAF Searching a Hierarchically Aggregated Fusion Architecture for Fast Multi-Modality Image Fusion Paper Code ACM MM CNN 无监督 2021 SDDGAN Semantic-supervised Infrared and Visible Image Fusion via a Dual-discriminator Generative Adversarial Network Paper Code TMM GAN 无监督 2021 Detail-GAN Infrared and visible image fusion via detail preserving adversarial learning Paper Code InfFus GAN 无监督 2021 Perception-GAN Image fusion based on generative adversarial network consistent with perception Paper Code InfFus GAN 无监督 2021 GAN-FM GAN-FM: Infrared and Visible Image Fusion Using GAN With Full-Scale Skip Connection and Dual Markovian Discriminators Paper Code TCI GAN 无监督 2021 AttentionFGAN AttentionFGAN: Infrared and Visible Image Fusion Using Attention-Based Generative Adversarial Networks Paper TMM GAN 无监督 2021 GANMcC GANMcC: A Generative Adversarial Network With Multiclassification Constraints for Infrared and Visible Image Fusion Paper Code TIM GAN 无监督 2021 MgAN-Fuse Multigrained Attention Network for Infrared and Visible Image Fusion Paper TIM GAN 无监督 2021 TC-GAN Infrared and Visible Image Fusion via Texture Conditional Generative Adversarial Network Paper TCSVT GAN 无监督 2021 TarDAL Target-aware Dual Adversarial Learning and a Multi-scenario Multi-Modality Benchmark to Fuse Infrared and Visible for Object Detection Paper Code CVPR GAN 无监督 2022 RFNet RFNet: Unsupervised Network for Mutually Reinforcing Multi-modal Image Registration and Fusion Paper Code CVPR CNN 无监督 2022 SeAFusion Image fusion in the loop of high-level vision tasks: A semantic-aware real-time infrared and visible image fusion network Paper Code InfFus CNN 无监督 2022 PIAFusion PIAFusion: A progressive infrared and visible image fusion network based on illumination aware Paper Code InfFus CNN 无监督 2022 UMF-CMGR Unsupervised Misaligned Infrared and Visible Image Fusion via Cross-Modality Image Generation and Registration Paper Code IJCAI CNN 无监督 2022 医学图像融合(Medical image fusion) 方法 标题 论文 代码 发表期刊或会议 基础框架 监督范式 年份 CNN A medical image fusion method based on convolutional neural networks Paper ICIF CNN 无监督 2017 Zero-LMF Zero-Learning Fast Medical Image Fusion Paper Code ICIF CNN 无监督 2019 DDcGAN Learning a Generative Model for Fusing Infrared and Visible Images via Conditional Generative Adversarial Network with Dual Discriminators Paper Code IJCAI GAN 无监督 2019 GFPPC-GAN Green Fluorescent Protein and Phase-Contrast Image Fusion via Generative Adversarial Networks Paper CMMM GAN 无监督 2019 CCN-CP Multi-modality medical image fusion using convolutional neural network and contrast pyramid Paper Sensors CNN 无监督 2020 DDcGAN DDcGAN: A Dual-Discriminator Conditional Generative Adversarial Network for Multi-Resolution Image Fusion Paper Code TIP GAN 无监督 2020 MGMDcGAN Medical Image Fusion Using Multi-Generator Multi-Discriminator Conditional Generative Adversarial Network Paper Code Access GAN 无监督 2020 D2LE A Bilevel Integrated Model With Data-Driven Layer Ensemble for Multi-Modality Image Fusion Paper TIP CNN 无监督 2021 HAF Searching a Hierarchically Aggregated Fusion Architecture for Fast Multi-Modality Image Fusion Paper Code ACM MM CNN 无监督 2021 EMFusion EMFusion: An unsupervised enhanced medical image fusion network Paper Code InfFus CNN 无监督 2021 DPCN-Fusion Green Fluorescent Protein and Phase Contrast Image Fusion Via Detail Preserving Cross Network Paper Code TCI CNN 无监督 2021 MSPRN A multiscale residual pyramid attention network for medical image fusion Paper Code BSPC CNN 无监督 2021 DCGAN Medical image fusion method based on dense block and deep convolutional generative adversarial network Paper NCA GAN 无监督 2021 数字摄影图像融合(Digital Photography Image Fusion) 多曝光图像融合(Multi-exposure image fusion) 方法 标题 论文 代码 发表期刊或会议 基础框架 监督范式 年份 DeepFuse DeepFuse: A Deep Unsupervised Approach for Exposure Fusion with Extreme Exposure Image Pairs Paper Code ICCV CNN 无监督 2017 CNN Multi-exposure fusion with CNN features Paper Code ICIP CNN 无监督 2018 MEF-Net Deep guided learning for fast multi-exposure image fusion Paper Code TIP CNN 无监督 2020 ICEN Multi-exposure high dynamic range imaging with informative content enhanced network Paper NC CNN 无监督 2020 MEF-GAN MEF-GAN: Multi-Exposure Image Fusion via Generative Adversarial Networks Paper Code TIP GAN 无监督 2020 CF-Net Deep coupled feedback network for joint exposure fusion and image super-resolutions Paper Code TIP CNN 无监督 2021 UMEF Deep unsupervised learning based on color un-referenced loss functions for multi-exposure image fusion Paper Code InFus CNN 无监督 2021 PA-AGN Two exposure fusion using prior-aware generative adversarial network Paper TMM GAN 无监督 2021 AGAL Attention-guided Global-local Adversarial Learning for Detail-preserving Multi-exposure Image Fusion Paper Code TCSVT GAN 无监督 2022 GANFuse GANFuse: a novel multi-exposure image fusion method based on generative adversarial networks Paper NCAA GAN 无监督 2021 DRLF Automatic Intermediate Generation With Deep Reinforcement Learning for Robust Two-Exposure Image Fusion Paper TNNLS CNN 无监督 2021 Trans-MEF TransMEF: A Transformer-Based Multi-Exposure Image Fusion Framework using Self-Supervised Multi-Task Learning Paper Code AAAI AE 自监督 2022 DPE-MEF Multi-exposure image fusion via deep perceptual enhancement Paper Code InFus CNN 无监督 2022 多聚焦图像融合(Multi-focus image fusion) 方法 标题 论文 代码 发表期刊或会议 基础框架 监督范式 年份 CNN Multi-focus image fusion with a deep convolutional neural network Paper Code InFus CNN 有监督 2017 ECNN Ensemble of CNN for multi-focus image fusion Paper Code InFus CNN 有监督 2019 MLFCNN Multilevel features convolutional neural network for multifocus image fusion Paper TCI CNN 有监督 2019 DRPL DRPL: Deep Regression Pair Learning for Multi-Focus Image Fusion Paper Code TIP CNN 有监督 2020 MMF-Net An α-Matte Boundary Defocus Model-Based Cascaded Network for Multi-Focus Image Fusion Paper Code TCI CNN 有监督 2020 MFF-SSIM Towards Reducing Severe Defocus Spread Effects for Multi-Focus Image Fusion via an Optimization Based Strategy Paper Code Sensors CNN 无监督 2020 MFNet Structural Similarity Loss for Learning to Fuse Multi-Focus Images Paper TIP CNN 有监督 2021 GEU-Net Global-Feature Encoding U-Net (GEU-Net) for Multi-Focus Image Fusion [GEU-Net Paper Code TCI CNN 自监督 2021 DTMNet DTMNet: A Discrete Tchebichef Moments-Based Deep Neural Network for Multi-Focus Image Fusion Paper TMM CNN 无监督 2021 SMFuse SMFuse: Multi-Focus Image Fusion Via Self-Supervised Mask-Optimization Paper Code NCA CNN 无监督 2021 ACGAN A generative adversarial network with adaptive constraints for multi-focus image fusion Paper Code ICCV GAN 有监督 2021 FuseGAN Learning to fuse multi-focus image via conditional generative adversarial network Paper TIP GAN 有监督 2020 D2FMIF Depth-Distilled Multi-focus Image Fusion Paper TMM CNN 有监督 2019 SESF-Fuse SESF-Fuse: an unsupervised deep model for multi-focus image fusion Paper Code NCAA CNN 有监督 2020 MFF-GAN MFF-GAN: An unsupervised generative adversarial network with adaptive and gradient joint constraints for multi-focus image fusion Paper Code InFus GAN 无监督 2021 MFIF-GAN MFIF-GAN: A new generative adversarial network for multi-focus image fusion Paper Code SPIC GAN 有监督 2021 遥感影像融合(Remote Sensing Image Fusion) 全色图像锐化(Pansharpening) 方法 标题 论文 代码 发表期刊或会议 基础框架 监督范式 年份 PNN Pansharpening by Convolutional Neural Networks Paper Code RS CNN 有监督 2016 PanNet PanNet: A deep network architecture for pan-sharpening Paper Code PanNet CNN 有监督 2017 TFNet Remote sensing image fusion based on two-stream fusion network Paper Code TFNet CNN 有监督 2020 BKL Unsupervised Blur Kernel Learning for Pansharpening Paper IGARSS CNN 无监督 2020 Pan-GAN Pan-GAN: An unsupervised pan-sharpening method for remote sensing image fusion Paper Code InFus GAN 无监督 2020 UCNN Pansharpening via Unsupervised Convolutional Neural Networks Paper JSTARS CNN 无监督 2020 UPSNet UPSNet: Unsupervised Pan-Sharpening Network With Registration Learning Between Panchromatic and Multi-Spectral Images Paper ACCESS CNN 无监督 2020 GPPNN Deep Gradient Projection Networks for Pan-sharpening Paper Code CVPR CNN 有监督 2021 GTP-PNet GTP-PNet: A residual learning network based on gradient transformation prior for pansharpening Paper Code ISPRS CNN 有监督 2021 HMCNN Pan-Sharpening Via High-Pass Modification Convolutional Neural Network Paper Code ICIP CNN 有监督 2021 SDPNet SDPNet: A Deep Network for Pan-Sharpening With Enhanced Information Representation Paper Code TGRS CNN 有监督 2021 SIPSA-Net SIPSA-Net: Shift-Invariant Pan Sharpening with Moving Object Alignment for Satellite Imagery Paper Code CVPR CNN 有监督 2021 SRPPNN Super-resolution-guided progressive pansharpening based on a deep convolutional neural network Paper Code TGRS CNN 有监督 2021 PSGAN PSGAN: A generative adversarial network for remote sensing image pan-sharpening Paper Code TGRS GAN 有监督 2021 MDCNN MDCNN: multispectral pansharpening based on a multiscale dilated convolutional neural network Paper JRS CNN 有监督 2021 LDP-Net LDP-Net: An Unsupervised Pansharpening Network Based on Learnable Degradation Processes Paper Code Arxiv CNN 无监督 2021 DIGAN Pansharpening approach via two-stream detail injection based on relativistic generative adversarial networks Paper ESA GAN 有监督 2022 DPFN A Dual-Path Fusion Network for Pan-Sharpening Paper Code TGRS CNN 有监督 2022 MSGAN An Unsupervised Multi-scale Generative Adversarial Network for Remote Sensing Image Pan-Sharpening Paper ICMM GAN 无监督 2022 UCGAN Unsupervised Cycle-Consistent Generative Adversarial Networks for Pan Sharpening Paper Code TGRS GAN 无监督 2022 通用图像融合框架(General Image Fusion Framerwork) 方法 标题 论文 代码 发表期刊或会议 基础框架 监督范式 年份 IFCNN IFCNN: A general image fusion framework based on convolutional neural network Paper Code InFus CNN 有监督 2020 FusionDN FusionDN: A Unified Densely Connected Network for Image Fusion Paper Code AAAI CNN 无监督 2020 PMGI Rethinking the Image Fusion: A Fast Unified Image Fusion Network based on Proportional Maintenance of Gradient and Intensity Paper Code AAAI CNN 无监督 2020 CU-Net Deep Convolutional Neural Network for Multi-Modal Image Restoration and Fusion Paper Code TPAMI CNN 有监督 2021 SDNet SDNet: A Versatile Squeeze-and-Decomposition Network for Real-Time Image Fusion Paper Code IJCV CNN 无监督 2021 DIF-Net Unsupervised Deep Image Fusion With Structure Tensor Representations Paper Code TIP CNN 无监督 2021 IFSepR IFSepR: A general framework for image fusion based on separate representation learning Paper TMM AE 自监督 2021 MTOE Multiple Task-Oriented Encoders for Unified Image Fusion Paper ICME CNN 无监督 2021 U2Fusion U2Fusion: A Unified Unsupervised Image Fusion Network Paper Code TPAMI CNN 无监督 2022 SwinFusion SwinFusion: Cross-domain Long-range Learning for General Image Fusion via Swin Transformer Paper Code JAS Transformer 无监督 2022 综述(Survey) 标题 论文 代码 发表期刊或会议 年份 A review of remote sensing image fusion methods Paper InFus 2016 Pixel-level image fusion: A survey of the state of the art Paper InFus 2017 Deep learning for pixel-level image fusion: Recent advances and future prospects Paper InFus 2018 Infrared and visible image fusion methods and applications: A survey Paper InFus 2019 Multi-focu image fusion: A Survey of the state of the art Paper InFus 2020 Image fusion meets deep learning: A survey and perspective Paper InFus 2021 Deep Learning-based Multi-focus Image Fusion: A Survey and A Comparative Study Paper Code TPAMI 2021 Benchmarking and comparing multi-exposure image fusion algorithms Paper Code InFus 2021 数据集(Dataset) 融合场景 数据集 下载链接 红外和可见光图像融合 TNO https://figshare.com/articles/dataset/TNO_Image_Fusion_Dataset/1008029 INO https://www.ino.ca/en/technologies/video-analytics-dataset/videos/ RoadScene https://github.com/hanna-xu/RoadScene MSRS https://github.com/Linfeng-Tang/MSRS LLVIP https://bupt-ai-cz.github.io/LLVIP/ M3FD https://github.com/JinyuanLiu-CV/TarDAL 医学图像融合 Harvard http://www.med.harvard.edu/AANLIB/home.html 多曝光图像融合 MEF https://github.com/csjcai/SICE MEFB https://github.com/xingchenzhang/MEFB 多聚焦图像融合 Lytro https://mansournejati.ece.iut.ac.ir/content/lytro-multi-focus-dataset MFI-WHU https://github.com/HaoZhang1018/MFI-WHU MFFW https://www.semanticscholar.org/paper/MFFW:-A-new-dataset-for-multi-focus-image-fusion-Xu-Wei/4c0658f338849284ee4251a69b3c323908e62b45 全色图像锐化 GaoFen https://directory.eoportal.org/web/eoportal/satellite-missions/g WorldView https://worldview.earthdata.nasa.gov/ GeoEye https://earth.esa.int/eogateway/missions/geoeye-1 QuickBird https://www.satimagingcorp.com/satellite-sensors/quickbird/ 评估指标(Evaluation Metric) 通用评估指标(General evaluation metric) 通用评估指标位于:https://github.com/Linfeng-Tang/Image-Fusion/tree/main/General%20Evaluation%20Metric or https://github.com/Linfeng-Tang/Evaluation-for-Image-Fusion 遥感影像融合评估指标(Evaluation metric for pansharpening) 如果有任何问题请联系:2458707749 ———————————————— 版权声明:本文为CSDN博主「Timer-419」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/fovever_/article/details/124650534
-
摘要:介绍如何用昇腾AI处理器上的DVPP单元进行,图像的等比例缩放,保证图像不变形。本文分享自华为云社区《CANN DVPP进行图片的等比例缩放》,作者:马城林 。1. 为什么需要进行等比例的缩放,直接暴力缩放成模型需要的宽高岂不是更省事首先没有任何的规定表示我们必须进行等比例的缩放,因为实际上即使图像上的物体因为缩放而变形,物体本身的特征还是存在,神经网络依旧可以提取对应的特征进而预测出物体的位置,通过计算实际的宽高与模型之间的宽高的比例依旧可以将模型预测到的候选框的映射到实际的原图上。这样看来等比例的缩放存在感好低!但是事情真的是这样吗?肯定不是呀,要不我为啥会写这篇博客呢?首先有以下几点考虑:目标检测除了将图像送入模型,实际上物体在图像中的位置也被作为一部分信息参与了模型的训练,经过等比例缩放的图片在坐标转换上明显省事。有些图像经过非等比例压缩后已经与实际场景中的物体差别很大,严重的变形会干扰到模型的准确性。等比例缩放更加符合我们人类的直觉。2. 如何在昇腾AI处理器上进行等比例缩放如果在我们的训练服务器,或者我们自己的个人计算机上,因为计算能力的相对充沛,我们可以借助很多开源图像库例如opencv,pillow等进行图像的等比例缩放。但是一旦道路端侧部署时这些开源图像库的方法往往成为整个推理过程最耗时的部分,因为他们主要通过CPU进行运算,而在诸如200DK这样的环境上,进行这样的变换让本就不充沛的CPU算力雪上加霜。而昇腾AI处理器上拥有专门处理数字图像的硬件单元。所以如何借助这些专用的硬件单元是十分重要的。话不多说开始吧!3. 实战讲解主要从以下几个方面进行讲解步骤分解每一步在昇腾AI处理器上的实现怎么把几步组合起来完成一个完整的动作介绍 AscendCL 为开发者提供的组合API接口,只需要一个函数完成所有动作,想想都刺激<概念注意>昇腾AI处理器在不同的环境上拥有不同运行模式,常见的分为两种,一种是类似于显卡一样插在服务器的PCIE插槽上,提供加速服务,一种是类似于200DK一样的嵌入式环境。工作在服务器的PCIE插槽上的昇腾310内存有两种存在形态,一种就是我们常见的内存,称为host内存。一种类似于显卡的显存,称为device内存,这种状态下需要涉及到内存拷贝的问题。200DK这种环境,不区分host与device,只有一块device内存,所以并不涉及host与device的内存拷贝问题媒体数据处理描述图形的大小,主要有两种表示方法,width,height,表示图像的真实宽高,widthstride,heightstride表示图像在内存中对其到128,16,2后的宽高,内存宽高标识图像在内存中的位置(但是可能有为了填充而产生的无效数据),真实宽高就标识内存中真实有效的数据。JPEG Decode时对JPEG的源图像没有宽高的要求,但是输出的数据,宽会对齐到128,长会对齐到16,对齐后可能会产生一部分的无效数据。VPC 图像缩放,抠图,贴图对输入的源图像宽高对齐到2,对齐后的内存宽高为,宽对齐到16,高对齐到2,输出与输入约束条件相同JPEG Encode 对输入的源图像宽高对齐到2,对齐后的内存宽高为,宽对齐到16或者16的倍数(128时性能更好),高对齐到16。详细的约束对齐规则JPEG DecodeVPCJPEG Encode3.1 步骤分解很多朋友和我一样属于一听就会,一动手就废的类型,在脑海里勾勒出万里江山,实际一上手,我是个傻子。。。。。实际上是我们还没有掌握做事情的诀窍,就是把事情分解成可以很方便用代码描述出的步骤;计算机编程让人感到头皮发麻的一个重要原因就是计算机它只会一步一步来,不会跳步。所以我们脑海里面很简单的步骤在编程实现后也可能代码很长。将常见的JPEG图片解码成YUV格式的图片aclError acldvppJpegDecodeAsync(acldvppChannelDesc *channelDesc, const void *data, uint32_t size, acldvppPicDesc *outputDesc,aclrtStream stream)因为JPEG解码有128x16的对齐要求,所以解码后的数据边缘会出现无效数据,需要进行裁剪aclError acldvppVpcCropAsync(acldvppChannelDesc *channelDesc, acldvppPicDesc *inputDesc, acldvppPicDesc *outputDesc, acldvppRoiConfig *cropArea, aclrtStream stream)进行resize的操作,没有对应的等比例缩放的接口,但是如果我们最后指定的图像大小相对于原图是等比例的,就是等比例缩放aclError acldvppVpcResizeAsync(acldvppChannelDesc *channelDesc, acldvppPicDesc *inputDesc, acldvppPicDesc *outputDesc, acldvppResizeConfig *resizeConfig, aclrtStream stream)进行等比例缩放时需要一个,与模型大小一致的纯色背景图片作为贴图的背景,我们可以申请对应大小的一些区域然后,将对应区域全部赋值为同一个数。aclError aclrtMemset (void *devPtr, size_t maxCount, int32_t value, size_t count)进行贴图aclError acldvppVpcCropAndPasteAsync(acldvppChannelDesc *channelDesc, acldvppPicDesc *inputDesc, acldvppPicDesc *outputDesc, acldvppRoiConfig *cropArea, acldvppRoiConfig *pasteArea, aclrtStream stream)进行模型推理或编码保存3.2 对应的变量怎么声明与初始化DVPP处理的通道的声明与销毁DVPP的一系列操作都是建立在已经声明初始化的通道上,你可以理解为初始化了相关的硬件资源acldvppChannelDesc *channelDesc channelDesc = acldvppCreateChannelDesc(); aclError ret = acldvppCreateChannel(channelDesc); // 销毁与创建的顺序相反 acldvppDestroyChannel(channelDesc); acldvppDestroyChannelDesc(channelDesc);各种图像的操作描述对应的图像的描述信息的创建与销毁acldvppPicDesc *picDesc picDesc = acldvppCreatePicDesc(); acldvppSetPicDescData(picDesc, decodeOutDevBuffer_); // 图像的内存地址 acldvppSetPicDescSize(picDesc, decodeOutBufferSize); // 图像所占的内存大小 acldvppSetPicDescFormat(picDesc, PIXEL_FORMAT_YUV_SEMIPLANAR_420); // 图像的格式 acldvppSetPicDescWidth(picDesc, inputWidth_); // 图像的实际宽 acldvppSetPicDescHeight(picDesc, inputHeight_); // 图像的实际高 acldvppSetPicDescWidthStride(picDesc, decodeOutWidthStride); // 图像在内存中对齐后的宽 acldvppSetPicDescHeightStride(picDesc, decodeOutHeightStride); // 图像在内存中对齐后的高 // 销毁 acldvppDestroyPicDesc(picDesc);申请内存// device侧,200DK等只有device内存的也用此接口,且只用此接口 aclError aclrtMalloc(void **devPtr, size_t size, aclrtMemMallocPolicy policy) aclError aclrtFree(void *devPtr) // host侧 aclError aclrtMallocHost(void **hostPtr, size_t size) aclError aclrtFreeHost(void *hostPtr) // dvpp 内存(在device侧,因为需要内存地址128对齐,所以拥有单独的接口) aclError acldvppMalloc(void **devPtr, size_t size) aclError acldvppFree(void *devPtr)创建抠图,贴图的区域acldvppRoiConfig *acldvppCreateRoiConfig(uint32_t left, uint32_t right, uint32_t top, uint32_t bottom) // 销毁 aclError acldvppDestroyRoiConfig(acldvppRoiConfig *roiConfig)不知道图片的相关信息获取信息的接口// 通过此接口可以方便的获取JPEG图像的宽,高,色彩通道数,编码格式,只需要传入对应的JPEG源数据地址以及大小 aclError acldvppJpegGetImageInfoV2(const void *data, uint32_t size, uint32_t *width, uint32_t *height, int32_t *components, acldvppJpegFormat *format) // 获取JPEG图片解码后的数据大小,因为解码后会对齐到128,所以不能任何时候都简单地依据原图大小计算解码后占用的内存大小。 aclError acldvppJpegPredictDecSize(const void *data, uint32_t dataSize, acldvppPixelFormat outputPixelFormat, uint32_t *decSize) // 获取PNG图像的宽和高 aclError acldvppPngGetImageInfo(const void *data, uint32_t dataSize, uint32_t *width, uint32_t *height, int32_t *components) // 预测PNG图片解码后占用内存空间 aclError acldvppPngPredictDecSize(const void *data, uint32_t dataSize, acldvppPixelFormat outputPixelFormat, uint32_t *decSize) // 获取JPEG图像编码后的占用内存空间 aclError acldvppJpegPredictEncSize(const acldvppPicDesc *inputDesc, const acldvppJpegeConfig *config, uint32_t *size)图像缩放,贴图,抠图相关的接口(当有多个操作动作时建议使用组合接口,虽然看似是多个步骤,实际上硬件内部只是执行一次操作可以大幅度提升处理的效率)// 缩放接口,单一接口,将缩放后的图片作为输出 aclError acldvppVpcResizeAsync(acldvppChannelDesc *channelDesc, acldvppPicDesc *inputDesc, acldvppPicDesc *outputDesc, acldvppResizeConfig *resizeConfig, aclrtStream stream) // 抠图接口,单一接口,从原图中根据ROI区域抠出一部分作为输出 aclError acldvppVpcCropAsync(acldvppChannelDesc *channelDesc, acldvppPicDesc *inputDesc, acldvppPicDesc *outputDesc, acldvppRoiConfig *cropArea, aclrtStream stream) // 组合接口(抠图+缩放),应用场景:JPEG 解码后的图片中可能有无效的数据,直接缩放到模型需要的大小会把无效数据一起输入,可以先把真实图像的数据抠出来然后进行缩放,减少无效的数据干扰。 aclError acldvppVpcCropResizeAsync(acldvppChannelDesc *channelDesc, acldvppPicDesc *inputDesc, acldvppPicDesc *outputDesc, acldvppRoiConfig *cropArea, acldvppResizeConfig *resizeConfig, aclrtStream stream) // 组合接口(抠图+贴图 / 抠图+缩放+贴图)如果抠图与贴图的大小不一致会进行一步缩放操作。 aclError acldvppVpcCropAndPasteAsync(acldvppChannelDesc *channelDesc, acldvppPicDesc *inputDesc, acldvppPicDesc *outputDesc, acldvppRoiConfig *cropArea, acldvppRoiConfig *pasteArea, aclrtStream stream) // 组合接口(抠图+贴图 / 抠图+缩放+贴图)此接口功能与上一个是一致的,但是此接口可以指定不同的缩放算法 aclError acldvppVpcCropResizePasteAsync(acldvppChannelDesc *channelDesc, acldvppPicDesc *inputDesc, acldvppPicDesc *outputDesc, acldvppRoiConfig *cropArea, acldvppRoiConfig *pasteArea, acldvppResizeConfig *resizeConfig, aclrtStream stream)3.3 实战讲解效果展示:1024x688 =》 416x416// 定义一些全局变量 namespace { std::string aclConfig = "../src/acl.json"; const std::string image_path = "../data/dog2.jpg"; const std::string image_save_path = "../out/dog2.jpg"; int32_t deviceId = 0; aclrtContext context; aclrtStream stream; aclrtRunMode runMode_ = ACL_DEVICE; uint32_t model_width = 416; // 模型需要的图像宽 uint32_t model_height = 416; // 模型需要的图像高 uint32_t image_width = 0; // 图像的真实宽 uint32_t image_height = 0; // 图像的真实高 acldvppChannelDesc *dvppChannelDesc = nullptr; }开始进行解码操作// 将图片读入内存,如果运行模式为(ACL_HOST)模式,需要申请host侧内存存放我们的原始图片数据,然后申请相同大小的device内存拷贝过去。如果运行在(ACL_DEVICE)模式,例如200DK这样的场景,直接申请device内存,不需要进行内存的拷贝搬运。 // 经过读取图片的步骤我们应该能获得如下变量 void* JpegImagePtr; // 原始图像在device侧的内存地址(不管运行在那种方式下的昇腾软件栈都是如此) uint32_t JpegImageSize; // 原始图像的大小 // 我们不了解图像的编码以及真实宽高,还有颜色通道数,所以需要执行获取图像信息的接口 // 图像的原始宽高变量我们前面已经定义过, 所以我们现在只需要定义图像的通道数与编码方式还有图像解码后所占用的内存的大小 int32_t components; // 图像的通道数 acldvppJpegFormat format; // 图像的编码方式 uint32_t JpegdOutSize; void* JpegdOutPtr; aclError ret = acldvppJpegGetImageInfoV2(JpegImagePtr, JpegImageSize, &image_width, &height, &components, &format) aclError ret = acldvppJpegPredictDecSize(JpegImagePtr, JpegImageSize, format, &JpegdOutSize) // 申请存放解码后YUV图像的内存 aclError ret = acldvppMalloc(&JpegdOutPtr, JpegdOutSize); // 设置JPEG解码后图像的描述信息(注意JPEG解码后内存宽高对齐到128x16) acldvppPicDesc* JpegdOutputPicDesc = acldvppCreatePicDesc(); acldvppSetPicDescData(out_pic_desc, JpegdOutPtr); acldvppSetPicDescSize(out_pic_desc, JpegdOutSize); acldvppSetPicDescFormat(out_pic_desc, PIXEL_FORMAT_YUV_SEMIPLANAR_420); acldvppSetPicDescWidth(out_pic_desc, image_width); acldvppSetPicDescHeight(out_pic_desc, image_height); acldvppSetPicDescWidthStride(out_pic_desc, ALIGN_UP128(image_width)); acldvppSetPicDescHeightStride(out_pic_desc, ALIGN_UP16(image_height)); // 执行解码接口 ret = acldvppJpegDecodeAsync(dvppChannelDesc, JpegImagePtr, JpegImageSize, JpegdOutputPicDesc, stream); ret = aclrtSynchronizeStream(stream_);开始进行抠图的操作,因为我们这次需要执行抠图+缩放+贴图三个动作所以我们选择组合API进行编程// 首先声明原图抠图的区域 // 抠图的区域左偏移和上偏移都是偶数 // 抠图的区域右偏移和下偏移都是奇数 uint32_t left = 0; uint32_t top = 0; uint32_t right = image_width % 2 == 0 ? image_width-1 : image_width; uint32_t bottom = image_height % 2 == 0 ? image_height-1 : image_height; acldvppRoiConfig* cropArea = cropConfig = acldvppCreateRoiConfig(left, right, top, bottom); // 计算等比例缩放后的新的宽高(等比例缩放后可能不满足16x2的对齐规则,需要手动进行对齐的操作) void LargeSizeAtLeast(uint32_t W, uint32_t H, uint32_t &newInputWidth, uint32_t &newInputHeight) { INFO_LOG("W:%u H:%u nw:%u, nh:%u", W, H, newInputWidth, newInputHeight); float scaleRatio = 0.0; float inputWidth = 0.0; float inputHeight = 0.0; float resizeMax = 0.0; bool maxWidthFlag = false; inputWidth = (float)W; inputHeight = (float)H; resizeMax = (float)(416); maxWidthFlag = (W >= H) ? true : false; if (maxWidthFlag == true) { newInputWidth = resizeMax; scaleRatio = resizeMax / W; // 高度2对齐 newInputHeight = scaleRatio * H; newInputHeight = ALIGN_UP2(newInputHeight); INFO_LOG("scaleRatio: %.3f, modelInputWidth: %u, modelInputHeight: %d, newInputWidth: %d, newInputHeight: %d", scaleRatio, W, H, newInputWidth, newInputHeight); } else { scaleRatio = resizeMax / H; // 如果高度是长边,建议宽度在等比例缩放后再做一次16对齐。因为vpc在输出时宽有16字节对齐约束,当贴图的宽非16对齐时,会导致在贴图的时候, // 芯片会自动进行16字节对齐,导致每次写入数据的时候都会引入部分无效数据,从而导致精度下降。 newInputWidth = scaleRatio * W; newInputWidth = ALIGN_UP16(newInputWidth); newInputHeight = resizeMax; INFO_LOG("scaleRatio: %.3f, modelInputWidth: %u, modelInputHeight: %d, newInputWidth: %d, newInputHeight: %d", scaleRatio, W, H, newInputWidth, newInputHeight); } } // 设置贴图的范围左偏移要求16对齐 acldvppRoiConfig *InitVpcOutConfig(uint32_t width, uint32_t height, uint32_t modelInputWidth, uint32_t modelInputHeight) { uint32_t right = 0; uint32_t bottom = 0; uint32_t left = 0; uint32_t top = 0; uint32_t left_stride; acldvppRoiConfig *cropConfig; uint32_t small = width < height ? width : height; uint32_t padded_size_half; if (small == width) { padded_size_half = (modelInputWidth - width) / 2; // 贴图区域距离左边界的距离 left = padded_size_half; left_stride = ALIGN_UP16(left); right = (left_stride + width) % 2 == 0 ? (left_stride + width - 1) : (left_stride + width); if (left_stride + right > modelInputWidth) { while (true) { left_stride = left_stride - 16; right = (left_stride + width) % 2 == 0 ? (left_stride + width - 1) : (left_stride + width); if (left_stride + right < modelInputWidth) break; } } right = (left_stride + width) % 2 == 0 ? (left_stride + width - 1) : (left_stride + width); bottom = (modelInputHeight % 2 == 0 ? modelInputHeight - 1 : modelInputHeight); top = bottom - height + 1; } else { padded_size_half = (modelInputHeight - height) / 2; right = (modelInputWidth % 2 == 0 ? modelInputWidth - 1 : modelInputWidth); left = right + 1 - width; left_stride = ALIGN_UP16(left); top = (padded_size_half % 2 == 0 ? padded_size_half : padded_size_half + 1); bottom = (height + top - 1) % 2 == 0 ? (height + top - 2) : (height + top - 1); } INFO_LOG("left_stride=%d, right=%d, top=%d, bottom=Ð7557a86-c79e-418c-bc75-fa080612ce7dn", left_stride, right, top, bottom); cropConfig = acldvppCreateRoiConfig(left_stride, right, top, bottom); if (cropConfig == nullptr) { ERROR_LOG("acldvppCreateRoiConfig failed"); return nullptr; } return cropConfig; } // 设置最后完成等比例缩放后的图像的信息 void* output_ptr = nullptr; uint32_t output_size = YUV420SP_SIZE(ALIGN_UP16(model_width), ALIGN_UP2(model_height)); ret = acldvppMalloc(&output_ptr, output_size); // 申请模板内存 if (ret != ACL_SUCCESS) { ERROR_LOG("acl malloc output is failed"); } ret = aclrtMemset(output_ptr, output_size, 128, output_size); if (ret != ACL_SUCCESS) { ERROR_LOG("mem set 128 is failed"); } acldvppPicDesc *output_Desc = acldvppCreatePicDesc(); acldvppSetPicDescData(output_Desc, output_ptr); acldvppSetPicDescSize(output_Desc, output_size); acldvppSetPicDescFormat(output_Desc, PIXEL_FORMAT_YUV_SEMIPLANAR_420); acldvppSetPicDescWidth(output_Desc, model_width); acldvppSetPicDescHeight(output_Desc, model_height); acldvppSetPicDescWidthStride(output_Desc, ALIGN_UP16(model_width)); acldvppSetPicDescHeightStride(output_Desc, ALIGN_UP2(model_height)); // 执行裁剪加贴图的操作 ret = acldvppVpcCropAndPasteAsync(dvppChannelDesc, JpegdOutputPicDesc, output_Desc, cropArea, pasteArea, stream);完成了一系列的操作总结对于DVPP处理来说,单独的接口调用需要全部满足输入和输出的长宽以及对齐的要求但是对于 JPEG+VPC 这样的串联编程来说前一个组件的输出图像描述是后一个组件的输入描述,设定对齐内存是为了有效标定,图像在内存中的位置,如果固执的设定对齐后的值,对于后一个组件来说很有可能得到的输入是有缺失的信息。根据众多对齐要求我们可以看出,对于图像的原始宽高全部2对齐是一个比较好的习惯,而且常用的图像规格都是偶数例如1920x1080,1280x720, 640x640, 416x416,最好不要出现长或者宽为奇数的情况,因为硬件会自动为奇数进行对齐从而产生无效数据。增加了处理的难度。
-
摘要:本篇文章结合灰度三维图像讲解图像顶帽运算和图像黑猫运算,通过Python调用OpenCV函数实现。本文分享自华为云社区《[Python图像处理] 十三.基于灰度三维图的图像顶帽运算和黑帽运算》,作者: eastmount。本篇文章继续深入,结合灰度三维图像讲解图像顶帽运算和图像黑猫运算,通过Python调用OpenCV函数实现。一.图像顶帽运算图像顶帽运算(top-hat transformation)又称为图像礼帽运算,它是用原始图像减去图像开运算后的结果,常用于解决由于光照不均匀图像分割出错的问题。其公式定义如下:图像顶帽运算是用一个结构元通过开运算从一幅图像中删除物体,校正不均匀光照的影响,其效果图如下图所示。在Python中,图像顶帽运算主要调用morphologyEx()实现,其中参数cv2.MORPH_TOPHAT表示顶帽处理,函数原型如下:dst = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)src表示原始图像cv2.MORPH_TOPHAT表示图像顶帽运算kernel表示卷积核,可以用numpy.ones()函数构建假设存在一张光照不均匀的米粒图像,如图所示,我们需要调用图像顶帽运算解决光照不均匀的问题。其Python代码如下所示:#encoding:utf-8 import cv2 import numpy as np #读取图片 src = cv2.imread('test06.png', cv2.IMREAD_UNCHANGED) #设置卷积核 kernel = np.ones((10,10), np.uint8) #图像顶帽运算 result = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel) #显示图像 cv2.imshow("src", src) cv2.imshow("result", result) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()其运行结果如下,它有效地将米粒与背景分离开来。二.图像黑帽运算图像底帽运算(bottom-hat transformation)又称为图像黑帽运算,它是用图像闭运算操作减去原始图像后的结果,从而获取图像内部的小孔或前景色中黑点,也常用于解决由于光照不均匀图像分割出错的问题。其公式定义如下:图像底帽运算是用一个结构元通过闭运算从一幅图像中删除物体,常用于校正不均匀光照的影响。其效果图如下图所示。在Python中,图像底帽运算主要调用morphologyEx()实现,其中参数cv2.MORPH_BLACKHAT表示底帽或黑帽处理,函数原型如下:dst = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)src表示原始图像cv2.MORPH_BLACKHAT表示图像底帽或黑帽运算kernel表示卷积核,可以用numpy.ones()函数构建Python实现图像底帽运算的代码如下所示:#encoding:utf-8 import cv2 import numpy as np #读取图片 src = cv2.imread('test06.png', cv2.IMREAD_UNCHANGED) #设置卷积核 kernel = np.ones((10, 10), np.uint8) #图像黑帽运算 result = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel) #显示图像 cv2.imshow("src", src) cv2.imshow("result", result) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()其运行结果如图所示:三.基于灰度三维图的顶帽黑帽运算为什么图像顶帽运算会消除光照不均匀的效果呢?通常可以利用灰度三维图来进行解释该算法。灰度三维图主要调用Axes3D包实现,对原图绘制灰度三维图的代码如下:# -*- coding: utf-8 -*- import numpy as np import cv2 as cv import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm from matplotlib.ticker import LinearLocator, FormatStrFormatter #读取图像 img = cv.imread("test06.png") img = cv.cvtColor(img,cv.COLOR_BGR2GRAY) imgd = np.array(img) #image类转numpy #准备数据 sp = img.shape h = int(sp[0]) #图像高度(rows) w = int(sp[1]) #图像宽度(colums) of image #绘图初始处理 fig = plt.figure(figsize=(16,12)) ax = fig.gca(projection="3d") x = np.arange(0, w, 1) y = np.arange(0, h, 1) x, y = np.meshgrid(x,y) z = imgd surf = ax.plot_surface(x, y, z, cmap=cm.coolwarm) #自定义z轴 ax.set_zlim(-10, 255) ax.zaxis.set_major_locator(LinearLocator(10)) #设置z轴网格线的疏密 #将z的value字符串转为float并保留2位小数 ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f')) # 设置坐标轴的label和标题 ax.set_xlabel('x', size=15) ax.set_ylabel('y', size=15) ax.set_zlabel('z', size=15) ax.set_title("surface plot", weight='bold', size=20) #添加右侧的色卡条 fig.colorbar(surf, shrink=0.6, aspect=8) plt.show()运行结果如下图所示:从图像中的像素走势显示了该图受各部分光照不均匀的影响,从而造成背景灰度不均现象,其中凹陷对应图像中灰度值比较小的区域。而通过图像白帽运算后的图像灰度三维图的代码如下:# -*- coding: utf-8 -*- import numpy as np import cv2 as cv import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm from matplotlib.ticker import LinearLocator, FormatStrFormatter #读取图像 img = cv.imread("test06.png") img = cv.cvtColor(img,cv.COLOR_BGR2GRAY) #图像黑帽运算 kernel = np.ones((10,10), np.uint8) result = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel) #image类转numpy imgd = np.array(result) #准备数据 sp = result.shape h = int(sp[0]) #图像高度(rows) w = int(sp[1]) #图像宽度(colums) of image #绘图初始处理 fig = plt.figure(figsize=(8,6)) ax = fig.gca(projection="3d") x = np.arange(0, w, 1) y = np.arange(0, h, 1) x, y = np.meshgrid(x,y) z = imgd surf = ax.plot_surface(x, y, z, cmap=cm.coolwarm) #自定义z轴 ax.set_zlim(-10, 255) ax.zaxis.set_major_locator(LinearLocator(10)) #设置z轴网格线的疏密 #将z的value字符串转为float并保留2位小数 ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f')) # 设置坐标轴的label和标题 ax.set_xlabel('x', size=15) ax.set_ylabel('y', size=15) ax.set_zlabel('z', size=15) ax.set_title("surface plot", weight='bold', size=20) #添加右侧的色卡条 fig.colorbar(surf, shrink=0.6, aspect=8) plt.show()效果图如下所示,对应的灰度更集中于10至100区间,由此证明了不均匀的背景被大致消除了,有利于后续的阈值分割或图像分割。
-
【摘要】 该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。本篇文章主要讲解Python调用OpenCV实现图像形态学转化,包括图像开运算、图像闭运算和梯度运算,基础性知识希望对您有所帮助。本文分享自华为云社区《[Python图像处理] 九.形态学之图像开运算、闭运算、梯度运算》,作者:eastmount。该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~数学形态学(Mathematical morphology)是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。其基本的运算包括:腐蚀和膨胀、开运算和闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换等。本篇文章主要讲解Python调用OpenCV实现图像形态学转化,包括图像开运算、图像闭运算和梯度运算,基础性知识希望对您有所帮助。1.图像开运算2.图像闭运算3.图像梯度运算一. 图像开运算1.基本原理图像开运算是图像依次经过腐蚀、膨胀处理后的过程。图像被腐蚀后,去除了噪声,但是也压缩了图像;接着对腐蚀过的图像进行膨胀处理,可以去除噪声,并保留原有图像。如下图所示:开运算(img) = 膨胀( 腐蚀(img) ) 下图是hanshanbuleng博主提供的开运算效果图,推荐大家学习他的文章。https://blog.csdn.net/hanshanbuleng/article/details/806571482.函数原型图像开运算主要使用的函数morphologyEx,它是形态学扩展的一组函数,其参数cv2.MORPH_OPEN对应开运算。其原型如下:dst = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)参数dst表示处理的结果,src表示原图像,cv2.MORPH_OPEN表示开运算,kernel表示卷积核。下图表示5*5的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。运行结果如下图所示:3.代码实现完整代码如下所示:#encoding:utf-8 import cv2 import numpy as np #读取图片 src = cv2.imread('test01.png', cv2.IMREAD_UNCHANGED) #设置卷积核 kernel = np.ones((5,5), np.uint8) #图像开运算 result = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel) #显示图像 cv2.imshow("src", src) cv2.imshow("result", result) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()输出结果如下图所示,可以看到噪声已经被去除了。但是结果result中仍然有部分噪声,如果想去除更彻底将卷积设置为10*10的。kernel = np.ones((10,10), np.uint8)result = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)二. 图像闭运算1.基本原理图像闭运算是图像依次经过膨胀、腐蚀处理后的过程。图像先膨胀,后腐蚀,它有助于关闭前景物体内部的小孔,或物体上的小黑点。如下图所示:闭运算(img) = 腐蚀( 膨胀(img) ) 下图是hanshanbuleng博主提供的开运算效果图,推荐大家学习他的文章。2.函数原型图像闭运算主要使用的函数morphologyEx,其原型如下:dst = cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel)参数dst表示处理的结果,src表示原图像, cv2.MORPH_CLOSE表示闭运算,kernel表示卷积核。下图表示5*5的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。运行结果如下图所示:3.代码实现完整代码如下所示:#encoding:utf-8 import cv2 import numpy as np #读取图片 src = cv2.imread('test03.png', cv2.IMREAD_UNCHANGED) #设置卷积核 kernel = np.ones((10,10), np.uint8) #图像闭运算 result = cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel) #显示图像 cv2.imshow("src", src) cv2.imshow("result", result) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()输出结果如下图所示,可以看到中间的噪声去掉。三. 图像梯度运算1.基本原理图像梯度运算是膨胀图像减去腐蚀图像的结果,得到图像的轮廓,其中二值图像1表示白色点,0表示黑色点。如下图所示:梯度运算(img) = 膨胀(img) - 腐蚀(img) 2.函数原型图像梯度运算主要使用的函数morphologyEx,参数为cv2.MORPH_GRADIENT。其原型如下:dst = cv2.morphologyEx(src, cv2.MORPH_GRADIENT, kernel)参数dst表示处理的结果,src表示原图像, cv2.MORPH_GRADIENT表示梯度运算,kernel表示卷积核。5*5的卷积核可以采用函数 np.ones((5,5), np.uint8) 构建。运行结果如下图所示:3.代码实现完整代码如下所示:#encoding:utf-8 import cv2 import numpy as np #读取图片 src = cv2.imread('test04.png', cv2.IMREAD_UNCHANGED) #设置卷积核 kernel = np.ones((10,10), np.uint8) #图像闭运算 result = cv2.morphologyEx(src, cv2.MORPH_GRADIENT, kernel) #显示图像 cv2.imshow("src", src) cv2.imshow("result", result) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows() 输出结果如下图所示,可以看到中间的噪声去掉。
推荐直播
-
HDC深度解读系列 - Serverless与MCP融合创新,构建AI应用全新智能中枢2025/08/20 周三 16:30-18:00
张昆鹏 HCDG北京核心组代表
HDC2025期间,华为云展示了Serverless与MCP融合创新的解决方案,本期访谈直播,由华为云开发者专家(HCDE)兼华为云开发者社区组织HCDG北京核心组代表张鹏先生主持,华为云PaaS服务产品部 Serverless总监Ewen为大家深度解读华为云Serverless与MCP如何融合构建AI应用全新智能中枢
回顾中 -
关于RISC-V生态发展的思考2025/09/02 周二 17:00-18:00
中国科学院计算技术研究所副所长包云岗教授
中科院包云岗老师将在本次直播中,探讨处理器生态的关键要素及其联系,分享过去几年推动RISC-V生态建设实践过程中的经验与教训。
回顾中 -
一键搞定华为云万级资源,3步轻松管理企业成本2025/09/09 周二 15:00-16:00
阿言 华为云交易产品经理
本直播重点介绍如何一键续费万级资源,3步轻松管理成本,帮助提升日常管理效率!
回顾中
热门标签