证件照换底色这件事在生活中并不是很频繁,然而,当你手上只有一种底色的照片,遇到找工作,填表或者在线上传某种要求必须为指定底色的证件照时,却又很重要。
我想更重要的莫过于,有一天你的女朋友突然要你给她的照片换个底色
![5](https://cdn.staticaly.com/gh/ksjgithub/picX@master/pics/5.mc2n6pktn8g.jpg)
这对不用PS的男朋友们可能有点棘手,一些在线的小程序应用可能不免费,去某宝或者照相馆转换,需要小费而且还不能马上拿到手......
为了不影响家庭和谐,这事肯定得做啊。那有没有什么办法能一键换证件照底色呢?
突然,很快啊,啪一下就想起来了,我特么可以用Matlab啊!
下面有请Matlab登场,大家鼓掌👏欢迎,代码如下:
function B = adjust(A, color1, color2, sigma)
color1 = reshape(color1, [1 1 3]);
color2 = reshape(color2, [1 1 3]);
color_diff = color2 - color1;
A = im2double(A);
t = exp(-0.5 * sum(bsxfun(@minus, A, color1) .^ 2, 3) / (sigma ^ 2));
B = A + bsxfun(@times, color_diff, repmat(t, [1 1 3]));
end
上面代码来源于知乎上的一个高赞回答(大家都用matlab做过哪些有趣的事儿? : https://www.zhihu.com/question/35023022/answer/61357048),其中的color1
为证件照的背景颜色值,color2
为转换后的背景颜色值。
原理特别简单,即越远离原始背景色的地方,希望保留原色,越靠近原始背景色的地方就转换成目标背景色;而距离通过高斯核函数度量,其中的权重由sigma
控制。sigma
越大,认为越靠近原始背景色,反之亦然。
应用上述方法转换后的证件照在边缘区域更平滑些,当然背景色要比设定的背景色偏暗些。比如,设定的背景色是纯红色,但转换后背景色是暗红色。
![]() | ![]() |
---|---|
修正前 | 修正后 |
为了修正这一点,从证件照换底色本身原理出发,即证件照中的人像部分不作处理,而只对背景区域作着色,这是简单的图像分割问题,而且分割的目标只有前景(人像)和背景。
了解了这一点,我们可以对上述代码做一简单修改,直接在高斯核函数度量后进行二值化图像分割,最后只对背景作着色,修正后代码如下:
function B = adjustPicBgColor(A, color1, color2, sigma)
% Code come from:https://www.zhihu.com/question/35023022/answer/61357048
% Modified by Qingping Wangzi.
%
color1 = reshape(color1, [1 1 3]);
color2 = reshape(color2, [1 1 3]);
% color_diff = color2 - color1;
% A = im2double(A);
t = exp(-0.5 * sum(bsxfun(@minus, A, color1) .^ 2, 3) / (sigma ^ 2));
% B = A + bsxfun(@times, color_diff, repmat(t, [1 1 3]));
t1 = imbinarize(t);
t2 = imfill(imcomplement(t1), 'holes');
[x, y] = find(t2 == 0);
for ii = 1 : numel(x)
A(x(ii), y(ii), :) = color2;
end % end if
B = A;
end % end function
可以看到,修正后,人像和背景完全分离,相应地边缘部分更加清晰,与设定的背景色一致。
问题是解决了,家庭可以和睦了,但是每次选择原始照片背景色,目标背景色以及sigma
参数的调节时很繁琐。或者会遇到照片分辨率低转换后有残留干扰的证件照......
好吧,那就制造个阿婆婆工具帮助解决这些问题。下面有请ChangeBackgoundColor V1.0
阿婆婆工具登场。
![6](https://cdn.staticaly.com/gh/ksjgithub/picX@master/pics/6.2j6ie4d9qly0.png)
我们将取色器(手一贱,把GetColor工具更新了)的功能加进来,目的是随心所欲的取色。取色结果在后台自动进行了复制,去完色后,只需按快捷键Ctrl+V
粘贴到Source RGB
或者Eraser RGB
文本区域中。
![1](https://cdn.staticaly.com/gh/ksjgithub/picX@master/pics/1.1qmn84esifr4.gif)
Eraser
按键的作用是擦除那些不必要的干扰物,被设置为状态按钮,点击时激活橡皮檫功能,再次点击时反激活,擦除的半径大小通过Radius
微调器设置。
![2](https://cdn.staticaly.com/gh/ksjgithub/picX@master/pics/2.a4mmnravkzs.gif)
有了这款阿婆婆工具,可以快速地为你的女朋友,为你的男朋友一键换证件照底色啦,赤橙黄绿青蓝紫,想怎么换就怎么换......
![7](https://cdn.staticaly.com/gh/ksjgithub/picX@master/pics/7.2p4h18k3ix00.png)
今天的介绍就到此结束了,对这款工具感兴趣的朋友们,请在wxgzh后台回复关键词 changebgcolor 获取工具以及相关的代码。祝好!
更多关于该工具的使用方法,请移步下面的视频演示!
【参考资料】
-
大家都用matlab做过哪些有趣的事儿? https://www.zhihu.com/question/35023022/answer/61357048 -
七夕节还不知道送啥,教你用MATLAB制作一款刮刮乐抽奖特效,让她的手气决定她的礼物 https://blog.csdn.net/slandarer/article/details/119672256?ops_request_misc=%7B%22request%5Fid%22%3A%22166437238716800180697355%22%2C%22scm%22%3A%2220140713.130102334.pc%5Fblog.%22%7D&request_id=166437238716800180697355&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-119672256-null-null.nonecase&utm_term=刮刮乐&spm=1018.2226.3001.4450 -
https://mp.weixin.qq.com/s/iMU4BuGpa1LNrHLtWlGZdA