opencv_tutorial_code学习——seamless cloning无缝融合、局部颜色变换、去高光镜面反射、平滑纹理

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 <opencv2\opencv.hpp>

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<Vec3b>(row, col)[0];
			cG = I.at<Vec3b>(row, col)[1];
			cR = I.at<Vec3b>(row, col)[2];
			if ((cB < 200) && (cG < 200) && (cR > 200))
			{
				for (int i = row;i < I.rows;i++)
				{
					mask.at<Vec3b>(i, col)[0] = 255;
					mask.at<Vec3b>(i, col)[1] = 255;
					mask.at<Vec3b>(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交互程序时可以参考。

没有更多推荐了,返回首页