• [开发技术领域专区] 开发者技术支持-长截图功能技术方案
    鸿蒙开发长截图功能经验总结一、关键技术难点总结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接口智能分析任务
    我们在通过数字平台对接集成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. 车牌搜索与车辆特征搜索如果用摄像机的话需要创建什么类型的智能分析任务才能进行检索?
  • [应用开发] 【MDC610】Adsfi::ImageData与opencv::Mat之间的数据转换
    产品名称:MDC 610软件版本:MDC 610        问题现象(问题描述):咨询一下Adsfi::ImageData与opencv::Mat之间的数据转换是怎么样的,能否提供样例代码
  • [互动交流] 论坛里面的压缩包怎么下载
    为啥我一点论坛里面的压缩包就显示系统错误,我想下载那个weautomate里面pdf转图片控件需要的模块
  • [技术干货] 苹果发布AI眼镜与空间计算:开启全新的交互体验时代
    在科技飞速发展的今天,苹果公司再次以其前瞻性的眼光和强大的研发实力,为我们带来了全新的AI眼镜与空间计算技术。这一创新不仅将重新定义我们与数字世界的交互方式,更预示着未来智能生活的新篇章。首先,让我们来探讨一下苹果的AI眼镜。这款眼镜融合了最先进的人工智能技术,能够实时识别用户的动作、语音和情绪,从而提供更加个性化、智能化的服务。无论是查询信息、导航路线,还是进行语音通话,AI眼镜都能以更加自然、便捷的方式满足用户的需求。同时,通过内置的传感器和摄像头,AI眼镜还能够实时监测用户的健康状况,如心率、血压等,为用户的健康保驾护航。而空间计算技术则是苹果AI眼镜的另一大亮点。空间计算通过精确测量和解析三维空间信息,实现了对现实世界的数字化映射。这意味着,用户可以通过AI眼镜看到虚拟物体与现实世界的完美融合,体验到前所未有的沉浸式交互。无论是游戏、教育还是工作,空间计算都将为我们带来更加丰富的视觉体验和更高效的工作流程。此外,苹果AI眼镜与空间计算技术的结合,还将催生出更多创新的应用场景。例如,在医疗领域,医生可以通过AI眼镜远程查看患者的身体状况,进行精准的诊断和治疗;在旅游领域,游客可以通过AI眼镜了解景点的历史文化和背景信息,获得更加丰富的旅游体验;在教育领域,学生可以通过AI眼镜与虚拟教师进行互动学习,提高学习效果和兴趣。当然,任何新技术的推出都不可避免地会面临一些挑战和质疑。例如,隐私保护、数据安全等问题都需要得到充分的重视和解决。但相信以苹果公司的实力和经验,这些问题都将得到有效的解决。总的来说,苹果发布的AI眼镜与空间计算技术无疑为我们打开了一扇通往未来智能生活的大门。它将改变我们与数字世界的交互方式,为我们带来更加便捷、高效、丰富的体验。随着技术的不断进步和应用场景的不断拓展,我们有理由相信,未来的智能生活将更加美好和精彩。
  • [云实验室] 基于华为云自动学习的垃圾分类图像识别系统
    一、简介本项目主要运用华为云 EI 的 ModelArts 的自动学习以及云对象存储的 OBS,实现简单的垃圾分类系统。二、内容描述本垃圾分类图像识别系统主要通过创建图像分类自动学习项目,进行数据标注,进行自动训练和部署测试,再到最后的结束测试。 三、主要流程四、图像分类任务介绍ModelArts 服务之自动学习图像分类项目,是对图像进行检测分类。添加图片并对图像进行分类标注,每个分类识别一种类型的图像。完成图片标注后开始自动训练,即可快速生成图像分类模型。可应用于商品的自动识别、运输车辆种类识别和残次品的自动检测。例如质量检查的场景,则可以上传产品图片,将图片标注“合格”、“不合格”,通过训练部署模型,实现产品的质检。五、系统创建1、创建项目2、添加图片3、数据标注进行“一次性快餐盒-其他垃圾” 的数据标注。 先将左下角的数字选择为 45, 点击图片选择同类的图片(一次可以选择一张或者多张),在标签名栏填写当前选择图片的标签(已有的标签可以直接选择) , 输入标签名, 点击确定。4、自动训练5、部署测试预测结果:
  • [大赛资讯] 2023华为开发者大赛 北京赛区招募正式打响
    2023华为开发者大赛 随 华为开发者大会北京分会场活动走进北京信息职业技术学院!北京赛区招募正式打响!期待北京赛区的企业及学生团队带来的优秀参赛作品!2023让我们继续实现无限创新,创造无限价值!
  • [互动交流] 固定区域的图像识别
    使用RPA里的图像识别的控件时,它识别的是整个图片中所有的内容,怎么让他只识别图片的固定范围内的内容呢?
  • [其他] 新NeRF 场景模型
    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 所示,生成的照片逼真、符合常理且具备时间一致性。
  • [分享交流] AI绘画作品《采花》
    一名身穿白色连衣裙的少女正在伸手采花,她动作轻柔,姿态款款,眼眸低垂。
  • [通用服务] 【AI使能】图像识别Image
    图像识别(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 
  • [知识分享] 如何利用CANN DVPP进行图片的等比例缩放?
    摘要:介绍如何用昇腾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图像处理丨基于灰度三维图的图像顶帽运算和黑帽运算
    摘要:本篇文章结合灰度三维图像讲解图像顶帽运算和图像黑猫运算,通过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图像处理丨三种实现图像形态学转化运算模式
    【摘要】 该系列文章是讲解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() 输出结果如下图所示,可以看到中间的噪声去掉。