From tutorial_code\photo\seamless_cloning\cloning_demo.cpp
该程序实现六种变换,分别是Normal Cloning(普通融合)、Mixed Cloning(混合融合)、Monochrome Transfer(单色画变换)、Local Color Change(局部颜色改变)、Local IlluminationChange(局部亮度改变)、Texture Flattening(纹理平整)。
准备源图像如下:
分别是destination1.png 和source1.png,先对source1.png 进行处理,制作mask.png。
制作方法:
[1]灰度化source1.png
[2]利用画图工具在灰度图上用红线画出目标的大致轮廓,得到图A。
图A如下:
[3]新建与图A尺寸相同的图B,所有像素Scalar(0),遍历图A,遇到像素为红色,则图B在该像素点位置同列该点行位置以下,所有像素值置为Scalar(255).
代码如下:
#include
using namespace cv;
using namespace std;
int main()
{
Mat I = imread("gray.jpg");
Mat mask(I.size(), I.type(),Scalar(0));
int cB, cG, cR;
for (int row = 0;row < I.rows;row++)
{
for (int col = 0;col < I.cols;col++)
{
cB = I.at(row, col)[0];
cG = I.at(row, col)[1];
cR = I.at(row, col)[2];
if ((cB < 200) && (cG < 200) && (cR > 200))
{
for (int i = row;i < I.rows;i++)
{
mask.at(i, col)[0] = 255;
mask.at(i, col)[1] = 255;
mask.at(i, col)[2] = 255;
}
}
}
}
imshow("mask", mask);
imwrite("mask.jpg", mask);
waitKey(0);
return 0;
得到模板如下:
然后开始做cloning_Demo.cpp里的六种变换:
1) seamlessClone(src,dest, mask, p, result, 1)函数:
参数分别是源图、目标图、mask图,src在dest的位置点,结果图,融合方式。
其中mask图中白色部分最小包围矩形的中心点对应位置是dest的p点。
融合方式有三种,对应的数字分别是:
1NORMAL_CLONE:常用的方法,符合大多数图像融合的需求。
2MIXED_CLONE:可能导致不可期望的融合效果,不建议使用。
3FEATURE_EXCHANGE:将src完全融入dst中,基本不保留src的颜色细节进行三种方式的融合,结果如下:
4)colorChange(source, mask, result, 1.5, .5, .5)函数:
改变图片的颜色。
参数分别是源图、mask图、结果图、R通道乘数、G通道乘数、B通道乘数,乘数范围在0.5-2.5之间。
结果图如下:
5)illuminationChange(source, mask, result, 0.2f, 0.4f)函数:
改变图片亮度,去高光或镜面反射。
参数分别是源图、mask图、结果图、乘数,乘数范围在0-2之间,0比较清晰,2比较模糊。
结果图如下:
6)textureFlattening(source, mask, result, 30, 45, 3)函数:
平滑目标区域。
参数分别是源图、mask图、结果图、低阈值、高阈值、sobel kernel核。
结果图如下:
cloning_gui.cpp将融合算法结合GUI交互来使用,需要写GUI交互程序时可以参考。