图像特效之摩尔纹特效

图像特效之摩尔纹特效

1.关键代码

/*
*Function: 摩尔纹特效
*/

//图像融合
int Inosculate(IMAGE_TYPE *bg_img,IMAGE_TYPE *fg_img,DWORD width,DWORD height,int transparency)
{
		T_U32 line_byte,bg_Imgindex,dst_Imgindex,bg_linebyte;
		int i,j;

		bg_linebyte =  (width*3+3) & ~0x3;

		for (i = 0;i <height;i++)
		{
			bg_Imgindex = i*bg_linebyte;
			for (j = 0; j < width;j++)
			{
				bg_img[bg_Imgindex] = (T_U8)((fg_img[bg_Imgindex]-bg_img[bg_Imgindex])*transparency/255+bg_img[bg_Imgindex]);
				bg_img[bg_Imgindex+1] = (T_U8)((fg_img[bg_Imgindex+1]-bg_img[bg_Imgindex+1])*transparency/255+bg_img[bg_Imgindex+1]);
				bg_img[bg_Imgindex+2] = (T_U8)((fg_img[bg_Imgindex+2]-bg_img[bg_Imgindex+2])*transparency/255+bg_img[bg_Imgindex+2]);

				bg_Imgindex += 3;
			}
		}

		return 0;
}
int MoireFringe(IMAGE_TYPE *BMP24_img,int degree)
{
	DWORD width,height,x,y,bfsize;
	WORD  biBitCount = 3;
	T_U8 *dst_data,*bmp,*img_data;
	T_U32 line_byte,src_Imgindex,dst_Imgindex;
	int Xoffset,Yoffset,MidX,MidY,X,Y;
	double radius,radian,swirldegree;
	
	BITMAPFILEHEADER bf;
	BITMAPINFOHEADER bi;
	
	FILE *MoireFringe_fp = fopen("MoireFringe.bmp","wb");
	
	if(NULL == MoireFringe_fp)
	{
		printf("Can't open Swirl_fp.bmp\n");
		return -1;
	}
	
	if (degree < 1) degree = 1;
	if (degree > 16) degree = 16;
	
	
	memset(&bf, 0, sizeof(bf));
	memset(&bi, 0, sizeof(bi));
	
	bmp = BMP24_img;
	memcpy(&bf,bmp,14);
	memcpy(&bi,&bmp[14],40);
	
	fwrite(&bf,sizeof(BITMAPFILEHEADER),1,MoireFringe_fp);
	fwrite(&bi,sizeof(BITMAPINFOHEADER),1,MoireFringe_fp);
	
	height = bi.biHeight;
	width  = bi.biWidth;
	bfsize = bf.bfSize;
	biBitCount = bi.biBitCount;
	line_byte =  (width*3+3) & ~0x3;
	img_data = bmp+54;
	
	dst_data = (T_U8 *)malloc(line_byte*height);
	if (NULL == dst_data)
	{
		printf("Can't malloc for dst image!\n");
		return -1;
	}
	memset(dst_data,0,line_byte*height);
	
	MidX = width/2;
	MidY = height/2;
	
	for(y = 0; y < height; y+= 1)
	{
		dst_Imgindex = y*line_byte;
		for(x=0; x <width; x+= 1)
		{
			Yoffset = y - MidY;
			Xoffset = x - MidX;
			
			radian = atan2((double)Xoffset,(double)Yoffset);
			radius = sqrt(Xoffset*Xoffset+Yoffset*Yoffset);
			
			X = (int)(radius*cos(radian+radius*degree));
			Y = (int)(radius*sin(radian+radius*degree));
			
			if (X >= width) X = width-1;
			if (X < 0)	   X = 0;
			if (Y >= height)Y = height-1;
			if (Y < 0)	   Y = 0;
			
			src_Imgindex = Y*line_byte+3*X;
			
			dst_data[dst_Imgindex] = img_data[src_Imgindex];
			dst_data[dst_Imgindex+1] = img_data[src_Imgindex+1];
			dst_data[dst_Imgindex+2] = img_data[src_Imgindex+2];
			
			dst_Imgindex +=3;
		}
	}
	
	Inosculate(img_data,dst_data,width,height,128);
	fwrite(img_data,line_byte*height,1,MoireFringe_fp);
	fclose(MoireFringe_fp);
	MoireFringe_fp = NULL;
	free(dst_data);
	return 0;
}

2.图像效果


  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
【资源说明】 基于python实现手写痕迹文档图像摩尔消除源码+项目运行说明.zip 二、数据分析 **数据划分**:使用1000张做为训练集,81张作为验证集。 官方提供了训练集1081对,测试集A、B各200张。包含以下几个特征: 1.图像分辨率普遍较大 2.手写字包含红黑蓝多种颜色,印刷字基本为黑色 3.手写字除了正常文字外,还包含手画的线段、图案等内容 4.试卷上的污渍、脏点也属于需要去除的内容 5.手写字和印刷字存在重叠 **mask**:根据原始图片和标签图像的差值来生成mask数据 计算RGB通道的平均差值 平均差值在20以上的设为 1 平均差值在20以下的设为 差值/20 三、模型设计 网络模型,是基于开源的EraseNet,然后整体改成了Paddle版本。同时也尝试了最新的PERT:一种基于区域的迭代场景文字擦除网络。基于对比实验,发现ErastNet,在本批次数据集上效果更好。从网络结构图上可以直观的看出ErastNet是多分支以及多阶段网络其中包括mask生成分支和两阶段图像生成分支。此外整个网络也都是基于多尺度结构。在损失函数上,原版的ErastNet使用了感知损失以及GAN损失。两个损失函数,是为了生成更加逼真的背景。但是本赛题任务的背景都是纯白,这两个损失是不需要的,可以直接去除。此外,由于ErastNet网络是由多尺度网络组成,结合去摩尔比赛的经验,我把ErastNet网络的Refinement替换成了去摩尔比赛使用的多尺度网络 双模型融合: 模型一:erasenet去掉判别器部分,仅保留生成器 模型二:erasenet二阶段网络使用基于Non-Local的深度编解码结构 四、训练细节 **训练数据:** 增强仅使用横向翻转和小角度旋转,保留文字的先验 随机crop成512x512的patch进行训练 **训练分为两阶段:** 第一阶段损失函数为dice_loss + l1 loss 第二阶段损失函数只保留l1 loss ## 五、测试细节 测试trick: **分块测试**,把图像切分为512x512的小块进行预测,保持和训练一致 **交错分块测试**,测试图像增加镜像padding,且分块时边缘包含重复部分,每次预测仅保留每块预测结果的中心部分,这么做的原因是图像边缘信息较少,预测效果要差于中心部分 测试时对**测试**数据使用了横向的镜像**增强** 测试时将两个**模型**的预测结果进行**融合** 七、其他 data:定义数据加载 loss:定义损失函数 model:定义网络模型 compute_mask.py:生成mask文件 test.py: 测试脚本 train.py: 训练脚本 代码运行: 1.指定数据文件夹 2.运行sh train.sh 生成mask并开始训练 3.指定测试文件夹和模型路径,执行sh test.sh开始测试 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值