Double DIP ——一种无监督层图像分割 AI 技术

雷锋网 AI 科技评论按:每月《Computer Vision News》都会选择一篇关于计算机视觉领域研究成果的论文进行回顾。今年三月份,他们选择了由 Yossi Gandelsman,Assaf Shocher 和 Michal Irani 三位学者(下文中所提到的作者,均指以上三位学者)共同完成的关于 Double-DIP 模型的论文,其中详细介绍了基于耦合的深度图像先验网络对单个图像进行无...
摘要由CSDN通过智能技术生成

雷锋网 AI 科技评论按:每月《Computer Vision News》都会选择一篇关于计算机视觉领域研究成果的论文进行回顾。今年三月份,他们选择了由 Yossi Gandelsman,Assaf Shocher 和 Michal Irani 三位学者(下文中所提到的作者,均指以上三位学者)共同完成的关于 Double-DIP 模型的论文,其中详细介绍了基于耦合的深度图像先验网络对单个图像进行无监督层分割这一技术。

Double DIP ——一种无监督层图像分割 AI 技术

概况

许多看似无关的计算机视觉任务可以被视为图像分割为不同的层的特殊情况。举两个突出的例子:图像分割——分割成背景层和前景层的区域;图像去雾——分割为清晰图层和有雾图层。在该论文中,作者提出了一种基于耦合的「深度图像先验」(DIP)网络对单个图像进行无监督层分割的统一框架。

被 CVPR 2018 会议接收的深度图像先验(DIP)网络,是一种可以用来对单个图像的低级统计数据进行生成的结构,而且只需要在单张图像上进行训练。而在论文中,作者向我们展示了如何通过耦合多个 DIP 网络得到一个强大的工具,来将图像分割为其基本组成,从而使其适用于各类任务。正因为所得数据来自于混合层的内部,相比其各个组成部分的数据更复杂且更具代表性,这使其多功能适用性具有实现的可能。作者们认为,模型能胜任多种任务的原因是,相比于在不同的层上各自进行,多种不同的层的内部统计特性更为鲁棒,也有更好的表征能力。

作者向我们展示了该方法在各类计算机视觉任务上的运用,比如:水印去除,前景/背景分割,图像去雾以及视频中的透明度分离等。在没有提供任何额外数据的情况下,只需要在单张图像上进行训练,就可以完成以上所有的任务。

关于「图像分割的统一框架」

由三个不同任务重新定义的原图分割,可以视为简单基本层的混合,如下图所示,图像分割、图像去雾、透明度分离这三种任务都可以看作是,先把原始图像拆分成一些基本层,然后再把这些层重新混合。

这种方法将图像分割成若干基本层,并提供一个统一的框架来对大量明显不同且无关的计算机视觉任务进行处理。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Matlab利用图像分割技术将图片白底换成红底的代码: ```matlab % 加载图片 img = imread('input_image.jpg'); % 显示原始图片 figure; imshow(img); % 使用图像分割函数,提取前景掩膜 fgMask = grabcut(img); % 将原始图片与前景掩膜合并 maskedImg = bsxfun(@times, img, cast(fgMask, 'like', img)); % 显示白底图片 figure; imshow(maskedImg); % 设置红色背景 redBg = uint8(zeros(size(img))); redBg(:,:,1) = 255; % 将白底图片与红色背景合并 combinedImg = bsxfun(@times, cast(~fgMask, 'like', img), redBg) + maskedImg; % 显示红底图片 figure; imshow(combinedImg); % 保存结果 imwrite(combinedImg, 'output_image.jpg'); function mask = grabcut(img) % 将图像转换为Lab颜色空间 labImg = rgb2lab(img); % 将Lab颜色空间的a和b通道作为特征 X = double(labImg(:,:,2:3)); % 将特征标准化 Xnorm = (X-mean(X(:)))./std(X(:)); % 使用kmeans函数进行聚类,提取背景和前景的像素 nColors = 2; [~, idx] = kmeans(Xnorm(:), nColors, 'replicates', 5); bgIdx = find(idx == 1); fgIdx = find(idx == 2); % 创建图像分割对象 g = graph(); g = addnode(g, size(X, 1)*size(X, 2)+2); % 添加源节点和汇节点 source = size(X, 1)*size(X, 2)+1; sink = size(X, 1)*size(X, 2)+2; g = addedge(g, source, bgIdx, Inf); g = addedge(g, fgIdx, sink, Inf); % 添加像素节点和边 edgeCosts = exp(-pdist2(Xnorm(bgIdx,:), Xnorm(fgIdx,:), 'squaredeuclidean')); edgeCosts = edgeCosts./max(edgeCosts(:)); [bgIdx, fgIdx] = meshgrid(bgIdx, fgIdx); edgeIdx = sub2ind(size(X), bgIdx(:), fgIdx(:)); g = addnode(g, size(X, 1)*size(X, 2)); g = addedge(g, edgeIdx, edgeCosts(:)); % 使用最大流算法进行分割 [~, mask] = maxflow(g, source, sink); % 将前景掩膜转换为二值图像 mask = reshape(mask(1:end-2), size(X, 1), size(X, 2)) == 2; end ``` 代码中首先使用`grabcut`函数进行图像分割,提取前景掩膜。然后将原始图片与前景掩膜合并,设置红色背景,并将白底图片与红色背景合并。最后使用`imwrite`函数保存结果。 `grabcut`函数中将图像转换为Lab颜色空间,并将Lab颜色空间的a和b通道作为特征。使用kmeans函数进行聚类,提取背景和前景的像素。创建图像分割对象,添加源节点和汇节点,添加像素节点和边。最后使用最大流算法进行分割,得到前景掩膜。将前景掩膜转换为二值图像,并返回结果。 这样做的好处是可以自动分割出前景和背景,无需手动框选区域。但是如果图像中存在复杂的前景和背景,可能会导致分割效果不佳。在这种情况下,可以考虑手动框选需要替换的区域,或者使用更高级别的图像分割算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值