Image Completion using Planar Structure Guidance MATALB 代码调试(一)
—— 如何运行代码
Image Completion using Planar Structure Guidance MATALB 代码调试(二)
—— 如何处理自己的图片
最近在学习图像修复算法,好论文不少。这里先学习了这篇文章:
Image Completion using Planar Structure Guidance :
ACM Transactions on Graphics (Proceedings of SIGGRAPH 2014), 33(4), 2014.
上一文我们已经成功的运行了这篇图像修复算法的运行。当我要处理自己的图像时,出现了一些问题,原因是没有对源代码了解到位。
我们先看看 data 文件下的图片:
貌似只要把我们要修复的地方用纯白色区域涂掉就可以了。
但实际并不是。这些图像的白色区域,其实是因为透明度为 0 所致。
具体说就是,这些图片都是由 4 层通道组成:R,G,B,还有 alpha 层。RGB 好理解。
这个 alpha 层表示图像的透明度。data 中的图本身 RGB 并没有被白色遮挡。之所以是白色的,是因为在这些区域,alpha = 0 !即完全不透明。
在 sc_extract_planar_structure.m 中,用如下语句就可以看到这其中的端倪:
[img, ~, alpha] = imread(fullfile('data', imgFileName));
figure,imshow(img)
figure,imshow(alpha)
mask = alpha ~= 255;
figure,imshow(mask)
img = im2double(img);
显示的图像如下图:
可以看到 img 中并不是白色的,而是黑色的。呈现出白色是因为有透明度层的存在。
也就是说,当我们用这个代码处理自己的图片是,第一步是要将自己图片中,要去除的遮挡物部分用 alpha 层来标记 !!!
那么,如和用 MATLAB 对遮挡物部分用 alpha 层进行标记呢?
我这里提供我自己的方法。我的方法比较笨,但并不是很难。当然应该有更好的方法,还望各路高手大神提点。
2.1 画图工具涂白要恢复的区域
用画图工具就很好实现,如下图:
当然,也可以根据图片的特征,将要修复的区域换成其他纯色,如黑色等。
2.2 生成带有 alpha 层的 png 图片
代码如下:
close all
clear
clc
path = 'F:\1_MyWork\Papers\ImageEditing\ImageCompletion\StructCompletion_master\data\';
imgFileName = '088_input_hole.png';
[I,map,alpha] =imread( fullfile(path, imgFileName) );
%figure,imshow(I)
Igray = rgb2gray(I);
[x,y] = size(Igray);
new_alpha = Igray ~= 255;
new_alpha = 255*new_alpha;
%figure, imshow(new_alpha);
imwrite(I, fullfile(path, imgFileName) ,'Alpha',new_alpha);
% [I,map,alpha] = imread(fullfile(path, imgFileName));
%figure, imshow(alpha);
这里,我们先假设自然图像中不存在纯白色的区域。用灰度图像 Igray 中白色区域来定义 new_alpha 的值 :
new_alpha = Igray ~= 255 % 当 Igray 某点的值不是 255 时,new_alpha 在该点的值置为 0,其余置为 1
这样就可以得到符合修复区域形状的 alpha 层了。当然,不要忘记 alpha 最大值是 255。
最后通过 imwrite 语句来生成带有 alpha 层的 png 图片了。
运行 run.m 即可。(上一文讲过 run.m 是怎么设置的,可以参考 (-))。
VP detection
修复图像
PS:怎么说呢,按照这个代码运行的结果,其实并没有比该文原文给出的效果要好。具体原因,可能是某些参数需要根据图片自身进行修改吧。这方面还要好好研究一下。