写点什么

主体分割技术,提升图像信息提取能力

作者:HarmonyOS SDK
  • 2025-01-10
    贵州
  • 本文字数:2157 字

    阅读完需:约 7 分钟

在智能设备普及和 AI 技术进步的推动下,用户对线上互动的质量、个性化以及沉浸式体验的追求日益增强。例如,对于热衷于图片编辑或视频制作的用户来说,他们需要一种快速而简便的方法来将特定主体从背景中分离出来。HarmonyOS SDK 基础视觉服务(Core Vision Kit)提供主体分割能力,可以检测出图片中区别于背景的前景物体或区域(即"显著主体"),并将其从背景中分离出来,适用于需要识别和提取图像主要信息的场景,广泛使用于前景目标检测和前景主体分离的场景。


适用场景

主体贴纸:从图片中提取显著性的主体,去掉背景。


背景替换:替换并提取出主体对象的背景。


显著性检测:快速定位图片中显著性区域。


辅助图片编辑:例如单独对主体进行美化处理。

功能演示

本文仅展示通用三个入口:复制、分享、识图搜索,其他功能开发者可以自行定制。


开发步骤

1.引用相关类添加至工程。


import { subjectSegmentation } from '@kit.CoreVisionKit';
复制代码


2.准备预处理的图片资源,将图片转换为 PixelMap,并添加初始化和释放方法。


async aboutToAppear(): Promise<void> {  const initResult = await subjectSegmentation.init();  hilog.info(0x0000, 'subjectSegmentationSample', `Subject segmentation initialization result:${initResult}`);}
async aboutToDisappear(): Promise<void> { await subjectSegmentation.release(); hilog.info(0x0000, 'subjectSegmentationSample', 'Subject segmentation released successfully');}
private async selectImage() { let uri = await this.openPhoto() if (uri === undefined) { hilog.error(0x0000, TAG, "uri is undefined"); } this.loadImage(uri);}
private openPhoto(): Promise<Array<string>> { return new Promise<Array<string>>((resolve, reject) => { let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions(); PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE; PhotoSelectOptions.maxSelectNumber = 1; let photoPicker: photoAccessHelper.PhotoViewPicker = new photoAccessHelper.PhotoViewPicker(); hilog.info(0x0000, TAG, 'PhotoViewPicker.select successfully, PhotoSelectResult uri: '); photoPicker.select(PhotoSelectOptions).then((PhotoSelectResult) => { hilog.info(0x0000, TAG, `PhotoViewPicker.select successfully, PhotoSelectResult uri: ${PhotoSelectResult.photoUris}`); resolve(PhotoSelectResult.photoUris) }).catch((err: BusinessError) => { hilog.error(0x0000, TAG, `PhotoViewPicker.select failed with errCode: ${err.code}, errMessage: ${err.message}`); reject(); }); })}
private loadImage(names: string[]) { setTimeout(async () => { let imageSource: image.ImageSource | undefined = undefined let fileSource = await fileIo.open(names[0], fileIo.OpenMode.READ_ONLY) imageSource = image.createImageSource(fileSource.fd) this.chooseImage = await imageSource.createPixelMap() hilog.info(0x0000, TAG, `this.chooseImage===${this.chooseImage}`); }, 100 )}
复制代码


3.实例化待分割的入参项 VisionInfo,并传入待检测图片的 PixelMap。


let visionInfo: subjectSegmentation.VisionInfo = {  pixelMap: this.chooseImage,};
复制代码


4.配置通用文本识别的配置项 SegmentationConfig,包括最大分割主体个数、是否输出每个主体的分割信息,以及是否输出分割后的前景图。


let config: subjectSegmentation.SegmentationConfig = {  maxCount: parseInt(this.maxNum),  enableSubjectDetails: true,  enableSubjectForegroundImage: true,};
复制代码


5.调用 imageSegmentation 的 ai.vision.doSegmentation 接口,实现主体分割。


let data: subjectSegmentation.SegmentationResult = await subjectSegmentation.doSegmentation(visionInfo, config);let outputString = `Subject count: ${data.subjectCount}\n`;outputString += `Max subject count: ${config.maxCount}\n`;outputString += `Enable subject details: ${config.enableSubjectDetails ? 'Yes' : 'No'}\n\n`;let segBox : subjectSegmentation.Rectangle = data.fullSubject.subjectRectangle;let segBoxString = `Full subject box:\nLeft: ${segBox.left}, Top: ${segBox.top}, Width: ${segBox.width}, Height: ${segBox.height}\n\n`;outputString += segBoxString;
if (config.enableSubjectDetails) { outputString += 'Individual subject boxes:\n'; if (data.subjectDetails) { for (let i = 0; i < data.subjectDetails.length; i++) { let detailSegBox: subjectSegmentation.Rectangle = data.subjectDetails[i].subjectRectangle; outputString += `Subject ${i + 1}:\nLeft: ${detailSegBox.left}, Top: ${detailSegBox.top}, Width: ${detailSegBox.width}, Height: ${detailSegBox.height}\n\n`; } }}
复制代码


了解更多详情>>


访问基础视觉服务联盟官网


获取主体分割开发指导文档

用户头像

HarmonyOS SDK

关注

HarmonyOS SDK 2022-06-16 加入

HarmonyOS SDK通过将HarmonyOS系统级能力对外开放,支撑开发者高效打造更纯净、更智能、更精致、更易用的鸿蒙原生应用,和开发者共同成长。

评论

发布
暂无评论
主体分割技术,提升图像信息提取能力_HarmonyOS_HarmonyOS SDK_InfoQ写作社区