图片去摩尔纹简述实现python代码示例

本文探讨了图片去摩尔纹的方法,通过Python实现,包括网络结构复现、数据预处理和模型训练。文章指出,通过Haar变换得到特征图,使用CNN处理下采样特征,对高低频信息分开处理,以解决翻拍图像中的摩尔纹问题。项目源码中对数据预处理进行了改进,将小波分解集成在线上进行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章主要为大家介绍了图片去摩尔纹简述实现的python代码示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

1、前言

当感光元件像素的空间频率与影像中条纹的空间频率接近时,可能产生一种新的波浪形的干扰图案,即所谓的摩尔纹。传感器的网格状纹理构成了一个这样的图案。当图案中的细条状结构与传感器的结构以小角度交叉时,这种效应也会在图像中产生明显的干扰。这种现象在一些细密纹理情况下,比如时尚摄影中的布料上,非常普遍。这种摩尔纹可能通过亮度也可能通过颜色来展现。但是在这里,仅针对在翻拍过程中产生的图像摩尔纹进行处理。

翻拍即从计算机屏幕上捕获图片,或对着屏幕拍摄图片;该方式会在图片上产生摩尔纹现象

论文主要处理思路

  • 对原图作Haar变换得到四个下采样特征图(原图下二采样cA、Horizontal横向高频cH、Vertical纵向高频cV、Diagonal斜向高频cD)
  • 然后分别利用四个独立的CNN对四个下采样特征图卷积池化,提取特征信息
  • 原文随后对三个高频信息卷积池化后的结果的每个channel、每个像素点比对,取max
  • 将上一步得到的结果和cA卷积池化后的结果作笛卡尔积

2、网络结构复现

  如下图所示,本项目复现了论文的图像去摩尔纹方法,并对数据处理部分进行了修改,并且网络结构上也参考了源码中的结构,对图片产生四个下采样特征图,而不是论文中的三个,具体处理方式大家可以参考一下网络结构。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

import math

import paddle

import paddle.nn as nn

import paddle.nn.functional as F

# import pywt

from paddle.nn import Linear, Dropout, ReLU

from paddle.nn import Conv2D, MaxPool2D

class mcnn(nn.Layer):

    def __init__(self, num_classes=1000):

        super(mcnn, self).__init__()

        self.num_classes = num_classes

        self._conv1_LL = Conv2D(3,32,7,stride=2,padding=1,)     

        # self.bn1_LL = nn.BatchNorm2D(128)

        self._conv1_LH = Conv2D(3,32,7,stride=2,padding=1,) 

        # self.bn1_LH = nn.BatchNorm2D(256)

        self._conv1_HL = Conv2D(3,32,7,stride=2,padding=1,)

        # self.bn1_HL = nn.BatchNorm2D(512)

        self._conv1_HH = Conv2D(3,32,7,stride=2,padding=1,)

        # self.bn1_HH = nn.BatchNorm2D(256)

        self.pool_1_LL = nn.MaxPool2D(kernel_size=2,stride=2, padding=0)

        self.pool_1_LH = nn.MaxPool2D(kernel_size=2,stride=2, padding=0)

        self.pool_1_HL = nn.MaxPool2D(kernel_size=2,stride=2, padding=0)

        self.pool_1_HH = nn.MaxPool2D(kernel_size=2,stride=2, padding=0)

        self._conv2 = Conv2D(32,16,3,stride=2,padding=1,)

        self.pool_2 = nn.MaxPool2D(kernel_size=2,stride=2, padding=0)

        self.dropout2 = Dropout(p=0.5)

        self._conv3 = Conv2D(16,32,3,stride=2,padding=1,)

        self.pool_3 = nn.MaxPool2D(kernel_size=2,stride=2, padding=0)

        self._conv4 = Conv2D(32,32,3,stride=2,padding=1,)

        self.pool_4 = nn.MaxPool2D(kernel_size=2,stride=2, padding=0)

        self.dropout4 = Dropout(p=0.5)

        # self.bn1_HH = nn.BatchNorm1D(256)

        self._fc1 = Linear(in_features=64,out_features=num_classes)

        self.dropout5 = Dropout(p=0.5)

        self._fc2 = Linear(in_features=2,out_features=num_classes)

    def forward(self, inputs1, inputs2, inputs3, inputs4):

        x1_LL = self._conv1_LL(inputs1)

        x1_LL = F.relu(x1_LL)

        x1_LH = self._conv1_LH(inputs2)

        x1_LH = F.relu(x1_LH)

        x1_HL = self._conv1_HL(inputs3)

        x1_HL = F.relu(x1_HL)

        x1_HH = self._conv1_HH(inputs4)

        x1_HH = F.relu(x1_HH)

        pool_x1_LL = self.pool_1_LL(x1_LL)

        pool_x1_LH = self.pool_1_LH(x1_LH)

        pool_x1_HL = self.pool_1_HL(x1_HL)

        pool_x1_HH = self.pool_1_HH(x1_HH)

        temp = paddle.maximum(pool_x1_LH, pool_x1_HL)

        avg_LH_HL_HH = paddle.maximum(temp, pool_x1_HH)

 &n

【资源说明】 基于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、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值