【数学建模】2023 深圳杯 & 东三省 数学建模 B 题 :电子资源版权保护问题(含源代码 & 最终论文)


题目介绍&代码:

https://mbd.pub/o/bread/ZJ2ampZx

在这里插入图片描述
完整版论文:

https://mbd.pub/o/bread/ZJ2amppr

在这里插入图片描述

一、题目介绍

《B题 电子资源版权保护问题》

版权又称著作权,包括发表权、署名权、修改权、保护作品完整权、复制权、发行权、出租权、展览权、表演权、放映权、广播权、信息网络传播权、摄制权、改编权、翻译权、汇编权及应当由著作权人享有的其他权利。

在计算机网络广泛应用的今天,越来越多电子资源会通过网络进行快速传递。与此同时,如何保护电子资源的著作权问题也渐渐变得至关重要。这一问题也是信息安全领域中的关键问题之一。数字水印(electronic water mark)技术是解决这一问题的关键技术之一。但因为可见水印(visible watermarking)在应用于电子图片著作权保护时,往往会破坏图片自身的结构,并且因嵌入信息可见而容易被识别剔除。因此,隐写术(steganography)被广为关注和使用。

隐写术一般被认为是信息隐藏学的一个重要分支,它专门研究如何隐藏实际存在的信息。隐写术有悠久的历史,部分案例甚至可追溯到公元前数百年。随着计算机和互联网技术的高速发展,近代隐写技术的研究被认为大约起始于20世纪90年代。因为隐写技术能将特定信息嵌入信息载体且不易被察觉,所以它可被广泛地应用于著作权保护、数据附加等领域。

问题 1 :针对附件1的图片P,建立生成嵌入信息深圳杯数学建模挑战赛的图片SP的数学模型,使得图片SP在人的视觉上尽可能与原图P相近。设计并实现生成图片SP的算法,将生成SP源代码和结果图片SP置于参赛作品的附录A中;给出从图片SP提取著作权信息使用的源代码并置于参赛作品的附录B中。

问题 2 :使用问题1中的模型与算法,能否将《中华人民共和国著作权法》(第三次修正案)[1]中的所有文字信息嵌入附件1的图片中?如果不能,最多能嵌入多少?

问题 3 :在电子图片传递的过程中,可能会被压缩或以不同的图片格式存储,也可能会被缩放、旋转或其他几何变形等。此时,问题1中的算法是否仍然可用?如果不能用,如何改进?

问题 4 :若要保护其他电子图片的著作权,使用问题1中的算法时应注意什么?请给出最多3条注意事项,并说明理由。

参考文献

[1] http://www.gov.cn/guoqing/2021-10/29/content_5647633.htm

二、问题的解答

2.1 问题一

2.1.1 图像的预处理

首先,我们使用工具如MATLAB对附件1中的图片P进行分析,以深入了解其像素分布、色彩特征、纹理特性等。我们必须仔细考虑将信息嵌入到图片P中的位置、方法以及嵌入的信息量。可以通过微调像素颜色分布或像素值来实现嵌入,以尽量减小对视觉效果的影响。其次,基于前文的图像分析结果,我们可以建立LSB方法的数学模型,将信息嵌入方案形式化,以生成嵌有信息的图片SP。根据这个模型,我们可以编写代码并生成所需的结果图像,并从结果图像提取嵌入信息。最后,我们需要进行相似度检验,计算原始图像与嵌入信息图像之间的均方误差(MSE)和结构相似性指数(SSIM)等值,分别为0.53和0.999,说明我们的隐写技术未破坏原始图像的结构特征。

在这里插入图片描述
图像像素分布是指图像中各个像素值的分布情况,即不同像素值在图像中出现的频率或数量。图像像素分布在图像处理和分析中具有重要的意义,它可以提供关于图像内容和特性的有价值信息。

我们对图像P进行像素分布的分析,结果如下图所示:

在这里插入图片描述

这样的分布可以在直方图中看出,两边的高峰表示图像中存在较亮和较暗的像素值,而中间的凸出区域则表示某种特定区域或物体的存在。其他部分的凹陷可能表示相应的像素值较少。

在这里插入图片描述
不难看出,图像P的纹理图像具有复杂的、重复性强的纹理特征,可以作为信息隐藏的载体。

论文中部分内容为:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
高相似度的直方图可能导致信息嵌入的稳定性增加,即隐藏的信息在不同通道上的影响相似。这可能导致隐写信息更难以被检测到,因为各个通道上的变化较小,不容易引起怀疑。在检测隐写信息时,分析通道间的微小差异可能更为困难,因为直方图的相似性可能使得差异不太明显。

2.1.2 LSB的方法—stegano库测试

上面的方法说明,使用LSB方法将信息嵌入图片的做法是可行的。因此我们建立LSB方法的数学模型,通过LSB方法的原理进行编程。

LSB隐写就是利用图像的最低有效位(Least Significant Bit,LSB)来隐藏信息的技术。图像的每个像素由三种颜色(红绿蓝)组成,每种颜色占8位,也就是一个字节。LSB隐写就是把要隐藏的信息的二进制位替换掉图像每个像素的最低位,从而实现信息的嵌入。由于最低位对图像的质量影响很小,人眼很难察觉出差异,所以这种方法具有较好的隐蔽性 。

可以调用stegano库来进行测试,看看LSB方法效果如何:

使用时,可以直接:pip install stegano

  • 该库要求输入图片为PNG格式,所以先将原图转换为PNG格式。
  • 该库对中文支持不好(即时使用UTF-8),所以本文先将要嵌入的信息进行base64编码再嵌入到图片中;
  • 解析图片中的信息时,则逆过来操作。

部分代码如下:

# 先将图片转换为PNG格式
def convert_to_png(input_path, output_path):
    img = Image.open(input_path)
    img.save(output_path, 'PNG')


# 嵌入信息到图片中
def embed_info(input_path, txt, output_path):
    # 把中文转换为base64编码
    txt = base64.b64encode(txt.encode('utf-8')).decode('ascii')
    secret = lsb.hide(input_path, txt)
    secret.save(output_path)


# 从图片中提取信息
def extract_info(input_path):
    secret_message = lsb.reveal(input_path)
    # 把base64编码还原为中文
    secret_message = base64.b64decode(secret_message.encode('ascii')).decode('utf-8')
    return secret_message

运行结果:

在这里插入图片描述
附件1中的原图如下所示:

在这里插入图片描述
嵌入信息后的图:

在这里插入图片描述
两张图片大小一样,看不出任何差异,因为嵌入的信息量相对于图像的大小很小,只占了0.02%左右(24字节/1228800字节)。

比较两张图片的差异,有多种方法和指标,比如均方误差(MSE)、结构相似性指数(SSIM)等。这些方法都是基于图片的像素值来计算两张图片之间的差异程度,差异越小,说明图片越相似。

部分代码如下:

import cv2
import numpy as np
from skimage.metrics import structural_similarity as ssim


# 定义MSE函数
def mse(imageA, imageB):
    # 计算两张图片之间的均方误差
    # 两张图片必须有相同的尺寸
    err = np.sum((imageA.astype("float") - imageB.astype("float")) ** 2)
    err /= float(imageA.shape[0] * imageA.shape[1])

    # 返回MSE值,越小越相似
    return err


# 读取两张图片
imageA = cv2.imread("B.jpg")
imageB = cv2.imread("SP.PNG")

# 将图片转换为灰度图
imageA = cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY)
imageB = cv2.cvtColor(imageB, cv2.COLOR_BGR2GRAY)

# 计算两张图片的MSE和SSIM值
m = mse(imageA, imageB)
s = ssim(imageA, imageB)

# 打印结果
print("MSE: %.8f" % m)
print("SSIM: %.8f" % s)

我们的输出结果为:

在这里插入图片描述
可见,嵌入“深圳杯数学建模挑战赛”后,两张图片的差异非常非常小。

2.1.3 LSB 方法建模

上面的方法说明,使用LSB方法将信息嵌入图片的做法是可行的。因此我们建立LSB方法的数学模型,通过LSB方法的原理进行编程。

由于题目给的图片是jpg格式,所以本节模型和代码支持原始图片的jpg格式输入。

但是,对jpg原始图片嵌入信息后,不能再保存为jpg格式,因为jpg无法保证完全不丢失细节,这样会对嵌入的信息进行扰乱,所以输出时要无损保存为PNG格式,这样就可以完整记录图片每个像素点rgb值的情况。

数学模型:

这两个函数的基本原理是利用了图像的最低有效位(Least Significant Bit,LSB)来嵌入和提取信息。这种方法是一种简单的隐写术技术,通过修改图像像素的最低有效位来嵌入信息,因为这种修改对图像的视觉效果影响很小,几乎无法察觉。

以下是这两个函数的数学模型:

  1. 嵌入信息 :

    对于每个字符 c 在消息 message 中,将其转换为8位二进制表示 b(c)。然后,遍历图像的每个像素 (r, g, b),并将每个颜色通道的最低有效位替换为 b(c) 的一个位。这可以用以下公式表示:

    r ′ = r − r m o d 2 + b ( c ) i r' = r - r mod 2 + b(c)_i r=rrmod2+b(c)i g ′ = g − g m o d 2 + b ( c ) i + 1 g' = g - g mod 2 + b(c)_{i+1} g=ggmod2+b(c)i+1 b ′ = b − b m o d 2 + b ( c ) i + 2 b' = b - b mod 2 + b(c)_{i+2} b=bbmod2+b(c)i+2

    其中 r', g', b' 是新的像素值,b(c)_ib(c) 的第 i 位,mod 是模运算。
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/d4e4ad10d6934922a079942e8028e6a6.png

  2. 提取信息

    遍历图像的每个像素 (r, g, b),并从每个颜色通道的最低有效位中提取信息位。然后,将这些信息位组合成8位二进制表示,转换为字符。这可以用以下公式表示:

    b ( c ) i = r m o d 2 b(c)_i = r mod 2 b(c)i=rmod2 b ( c ) i + 1 = g m o d 2 b(c)_{i+1} = g mod 2 b(c)i+1=gmod2 b ( c ) i + 2 = b m o d 2 b(c)_{i+2} = b mod 2 b(c)i+2=bmod2
    其中 b(c)_ib(c) 的第 i 位,mod 是模运算。然后,我们将 b(c) 转换为字符 c

部分代码如下:

def embed_info(image_path, message, output_path):
    # 把中文转换为base64编码
    message = base64.b64encode(message.encode('utf-8')).decode('ascii')
    # 把信息转换为二进制位
    bits = ''.join(format(ord(x), '08b') for x in message)
    info_len = len(bits)
    img = Image.open(image_path)
    width, height = img.size
    pixels = img.load()
    index = 0

    for x in range(width):
        for y in range(height):
            r, g, b = pixels[x, y]

            # 如果还有未嵌入的信息位
            if index < info_len:
                # 把当前像素的红色分量的最低有效位替换为信息位
                r = int(format(r, '08b')[:-1] + bits[index], 2)
                index += 1

            if index < info_len:
                # 把当前像素的绿色分量的最低有效位替换为信息位
                g = int(format(g, '08b')[:-1] + bits[index], 2)
                index += 1

            if index < info_len:
                # 把当前像素的蓝色分量的最低有效位替换为信息位
                b = int(format(b, '08b')[:-1] + bits[index], 2)
                index += 1

            pixels[x, y] = (r, g, b)
            if index == len(bits):
                break
        else:
            continue
        break
    img.save(output_path)
    return info_len

第二种代码:

#替换最后一位的数据,source是被替换数据,target是目标数据,就是batarget放到source最后一位
def repLstBit(source,target):
    return replace_reg.sub(target,source)


#字符串转换二进制,不够八位的话补齐8位
def encode(s):
    return ''.join(bin(ord(c)).replace('0b','').rjust(8,'0') for c in s)

#切割从图像中收集到的数据,就是把载密图像的对应最后一位提取出来之后需要进行切割
def cut_text(text,lenth):
    textArr = re.findall('.{'+str(lenth)+'}',text)
    tempStr = text[(len(textArr) * lenth):]
    if len(tempStr)!=0:
        textArr.append(text[(len(textArr)*lenth):])
    return textArr

#二进制转换成字符串,看上面切割方法的注释即可理解该方法存在的意义
def decode(s):
    bitArr = cut_text(s,8)
    return "".join(chr(int(i,2)) for i in bitArr)

在这里插入图片描述
信息解析检验:

在这里插入图片描述
相似度检验:均方误差比使用库低,结构相似性指数则稍高一点点,依旧是肉眼无法分辨。

输出图片:

在这里插入图片描述

2.2 问题二

结果是可以的。

在这里插入图片描述
原因:

  • 原始图片的尺寸是1280*1896。按照本文的lsb模型,可以用来存储信息的二进制位总共有:3 * 1280*1896个。
  • 本文将《中华人民共和国著作权法》保存为txt文件,大小为33KB,在模型中经过编码转换,最终使用7w个二进制位来表示。
  • 要隐藏的信息的二进制位数远远小于图片可供存储的位数。所以可以将所有文字信息嵌入附件1的图片中。

信息嵌入效果:

在这里插入图片描述
图片前后差异依旧不大!还可以参考MSE和SSIM的值。

2.3 问题三

问题一中的算法在图像传递过程中经历了压缩、格式变换、缩放、旋转或其他几何变形等操作后,可能会遇到一些挑战,导致嵌入和提取信息的困难。

图像压缩可能会导致原始图像中的LSB信息丢失,嵌入的信息变得不可读或无法提取。如果图像需要压缩,可以在压缩之前先嵌入信息,然后再进行压缩。这样可以减少信息丢失的可能性。

不同的图片格式可能使用不同的压缩算法和颜色空间,嵌入信息的方式可能会受到格式变换的影响。在格式变换之前,可以将图像还原为原始格式,再嵌入信息。然后,再将其转换为所需的格式。

缩放、旋转和几何变形这些操作可能导致像素值的变化,影响信息的嵌入和提取。在进行这些操作之前,可以记录图像的原始状态,包括像素值和位置。然后,应用这些变换后,再将信息嵌入到已变换的图像中。在提取信息时,需要对变换进行反向操作,以还原原始图像的状态。

在图像经历多次变换和处理后,可能会引入噪声或其他视觉问题,使得信息的嵌入和提取更加困难。使用更稳健的隐写技术,可以容忍一定程度的图像变化和质量损失。此外,可以进行更严格的质量控制,以确保在图像传递过程中尽量减小视觉损失。

在图像传递过程中,可能会出现数据传输错误或丢失,导致信息不完整。为了保证信息的完整性,可以在信息嵌入时添加错误检测和纠正码,以检测和修复在传递过程中引入的错误。

总之,问题1中的算法在图像传递过程中可能需要针对不同情况进行适应和改进。重要的是根据具体情况,综合考虑图像处理操作、数据完整性、加密和隐写技术,以确保信息的可靠嵌入和提取。随着图像传递过程中涉及的操作增多,需要更多的注意和技术手段来处理潜在的问题。

在这里插入图片描述

2.3.1 方法与步骤概述

以下是一些可能的改进方法:

  1. 使用更复杂的嵌入技术:例如,使用离散余弦变换(DCT)或离散小波变换(DWT)等频域方法进行信息嵌入。这些方法将信息隐藏在图像的频域中,而不是像LSB那样直接在空间域中隐藏。这样,即使图像经过一些处理,隐藏的信息也能被提取出来。

  2. 使用错误纠正编码:例如,使用汉明码或里德-所罗门码等错误纠正编码对隐藏的信息进行编码。这样,即使图像处理过程中一部分信息被破坏,也能通过错误纠正编码恢复出原始信息。

  3. 使用水印技术:水印是一种特殊的信息隐藏技术,它的目标是在图像中隐藏一个标识符,即使图像经过处理,这个标识符也能被检测出来。水印技术通常使用一些复杂的嵌入和提取算法,以提高鲁棒性。

  4. 使用更强大的机器学习方法:例如,使用深度学习进行信息隐藏和提取。深度学习可以学习到如何在不同的图像处理操作下保持信息的隐藏和提取,从而提高鲁棒性。

以上这些方法都可以提高信息隐藏技术的鲁棒性,但也需要注意,提高鲁棒性通常会牺牲一些隐藏信息的容量。不过在用于保护著作权时,需要往图片中嵌入的信息也不会很多。

本文选择使用第三种,使用水印技术。

主要步骤为:

  1. 生成水印图片(正方形);
    • 根据文本长度计算合适的行数;
    • 创建空白图片;
    • 在图片上绘制文本;
    • 保存图片。
    • 对水印图片进行Arnold置乱(可选,防止水印被提取和篡改)。
  2. 嵌入水印;
    • 对原始图像执行离散余弦变换(DCT)。
    • 将水印嵌入到DCT块中。
    • 对带有水印的DCT块执行逆离散余弦变换(IDCT)。
  3. 提取水印。
    • 将嵌入水印的图片尽可能恢复到与原始图片相近的状态(针对旋转、裁剪和缩放);
    • 将嵌入水印的图片和原始图片进行DCT变换;
    • 对变换后的图片做差(有系数);
    • 对提取的水印图片进行Arnold逆变换(如果嵌入的黑丝经过Arnold变换后的水印图片)。

2.3.2 基于DCT的暗水印信息嵌入模型

2.3.2.1 “深圳杯数学建模挑战赛”水印图片生成

主要代码:

def create_watermark(text, font_path, font_size=26, opacity=100):
    n = int(math.sqrt(len(text))) + 1
    lines = [text[i:i + n] for i in range(0, len(text), n)]
    width, height = n * font_size, n * font_size
    img = Image.new('RGBA', (width, height), (255, 255, 255))
    font = ImageFont.truetype(font_path, font_size)
    draw = ImageDraw.Draw(img)
    text_color = (0, 0, 0, opacity)
    for i, line in enumerate(lines):
        text_bbox = draw.textbbox((0, 0), line, font)
        line_width = text_bbox[2] - text_bbox[0]
        x = (width - line_width) / 2
        draw.text((x, i * font_size), line, font=font, fill=text_color)
    img.save('./2023_SZ_Cup/Problem_3/output/watermark.png', 'PNG')

水印图片:

在这里插入图片描述

2.3.2.2 水印图片 Arnold置乱

即打乱水印信息,使得信息分布均匀,减小可能得损失,同时防止水印被他人提取和篡改。

Arnold置乱是一种图像加密技术,它是由V.I. Arnold提出的一种二维图像的置乱变换方法。它的基本思想是将图像看作是在二维整数平面上的一个函数,然后通过一定的几何变换,将原图像的像素位置进行置乱,从而达到图像加密的目的。

Arnold置乱的基本公式如下:

对于图像中的每一个像素点(x, y),经过Arnold置乱后,该像素点的新位置(x’, y’)可以通过以下公式计算得到:

x ′ = ( x + y ) m o d N x' = (x + y) mod N x=(x+y)modN y ′ = ( x + 2 y ) m o d N y' = (x + 2y) mod N y=(x+2y)modN

其中,N是图像的宽度或高度(假设图像是正方形的),mod是取模运算。

Arnold置乱的逆操作,也就是解密过程,可以通过以下公式进行:

x = ( 2 x ′ − y ′ ) m o d N x = (2x' - y') mod N x=(2xy)modN y = ( − x ′ + y ′ ) m o d N y = (-x' + y') mod N y=(x+y)modN

这两组公式就是Arnold置乱及其逆操作的基本公式。通过这两组公式,可以实现图像的加密和解密操作。

效果:

一次:

在这里插入图片描述
三次:

在这里插入图片描述
五次:

在这里插入图片描述
部分代码:

def arnold_scramble(image, iterations):
    array = np.array(image)
    height, width, _ = array.shape
    scrambled_array = np.empty_like(array)
    for _ in range(iterations):
        for y in range(height):
            for x in range(width):
                scrambled_array[x,y] = array[(x + y) % height, (x + 2 * y) % width]
        array = scrambled_array.copy()
    scrambled_image = Image.fromarray(np.clip(scrambled_array, 0, 255).astype('uint8'))

    return scrambled_image
2.3.2.3 水印嵌入

本文使用的是基于DCT的暗水印技术。即将水印图片嵌入到图片的频域而不是前面LSB的空域。

在离散余弦变换(DCT)的结果中,低频部分通常包含了图像的大部分信息,如颜色和亮度变化。这是因为图像的大部分区域通常有相似的颜色和亮度,这些信息在频域中表现为低频成分。因此,你可以看到在DCT图像的左上角(低频部分)有更多的亮点。

离散余弦变换(DCT)[9]是一种常用于数据或图像压缩的变换方法。它的主要特点是将空域的信号转换到频域上,因此在压缩过程中具有良好的去相关性性能。DCT变换本身是无损的,且具有对称性。当对原始图像应用离散余弦变换时,DCT系数的能量主要集中在左上角,而其余大部分系数接近于零。在图像压缩中,一般会进行量化操作,即将小于一定阈值的系数归零。这个过程被称为图像量化,接着进行逆DCT运算,以还原压缩后的图像。

DCT变换先将整幅图像分成 大小的像素块,然后对每个像素分块逐一进行DCT变换。在数字图像领域中使用的是二维DCT变换,其中,二维DCT变换的简单公式为:

在这里插入图片描述
在这里插入图片描述
我们生成的DCT的特征图为:

在这里插入图片描述
相反,高频部分包含了图像的细节和纹理信息,如边缘和纹理。这些信息在频域中表现为高频成分。因此,你可以看到在DCT图像的右下角(高频部分)有一些亮点,但通常比低频部分少。

中频部分则介于两者之间,包含了一些颜色和亮度的变化,以及一些细节和纹理信息。

在图像的频域表示中,高频部分通常包含的信息最少。这是因为高频部分对应于图像的细节和纹理,而这些信息在整个图像中的占比通常较小。然而,直接在高频部分嵌入水印可能会导致水印在图像压缩或降低分辨率时丢失,因为这些操作通常会丢弃高频信息。

相反,低频部分包含了图像的大部分信息,如颜色和亮度变化。在低频部分嵌入水印可能会显著改变图像的视觉效果,因为这会改变图像的基本特性。

因此,中频部分通常被认为是嵌入水印的最佳位置。 中频部分包含了一些颜色和亮度的变化,以及一些细节和纹理信息,因此在这个部分嵌入水印不太可能显著改变图像的视觉效果。同时,由于中频部分的信息在图像压缩或降低分辨率时不太可能被丢弃,因此在这个部分嵌入的水印也更有可能保留下来。

因此,本文即是将水印嵌入图像在DCT变换后的中频部分。

效果演示:

alpha = 0.1

在这里插入图片描述
alpha = 0.5

在这里插入图片描述
alpha = 0.9

在这里插入图片描述
部分代码:

def perform_dct(original_array):
    height, width, _ = original_array.shape
    dct_blocks = np.empty_like(original_array, dtype=np.float64)
    for i in range(0, height, 8):
        for j in range(0, width, 8):
            dct_blocks[i:i + 8, j:j + 8] = dct(dct(original_array[i:i + 8, j:j + 8], axis=0, norm='ortho'), axis=1,
                                               norm='ortho')
    return dct_blocks


def embed_watermark(dct_blocks, watermark_array, alpha=0.05):
    dct_blocks_with_watermark = dct_blocks.copy()
    dct_blocks_with_watermark[::8, ::8] += alpha * watermark_array
    return dct_blocks_with_watermark
2.3.2.4 水印提取

第一种情况针对被旋转图片进行水印信息的提取,首先通过Canny算子实现边缘提取,再使用Hough变换对图像进行几何形状检测,通过合理设置阈值筛选出合适的旋转角度并将其恢复水平。最后裁剪掉无效的图像边框得到的图片即可进行提取水印操作。

第二种情况针对被裁剪图片进行水印信息的提取,将被裁剪后的图片与不包含水印的原始图片计算截图匹配,使用OpenCV所提供的matchTemplate()函数实现,找出二者最大匹配位置后,将待检测图片恢复拼接。最后得到的图片即可进行提取水印操作。

第三种情况针对被缩放的图片,通过不断缩放图片并与原始图片进行匹配检测,找到最合适的缩放比例,最后使用OpenCV的扩展库cv2所提供的zoom操作函数得到的图片即可进行提取水印操作。

提取水印的过程中,首先需要将图片再次进行8×8分块,再对子块进行水印的提取。由于在之前的操作中对水印图片进行了加密置乱,故在此处需要进行Arnold逆变换来实现水印信息的解密复原,最终提取出一张水印图片。

效果:

我们下图展示了水印的提取效果,从左到右分别对应0.1,0.5,0.9

在这里插入图片描述
部分代码:

def process_images(image_with_watermark_path, original_image_path, alpha=0.05):
    image_with_watermark = load_image(image_with_watermark_path)
    original_image = load_image(original_image_path)
    image_with_watermark_array = image_to_array(image_with_watermark)
    original_array = image_to_array(original_image)
    # 对图像执行DCT
    dct_blocks_with_watermark = perform_dct(image_with_watermark_array)
    original_dct_blocks = perform_dct(original_array)
    watermark_array = extract_watermark(dct_blocks_with_watermark, original_dct_blocks, alpha)
    watermark_array = clip_and_convert(watermark_array)
    watermark_image = array_to_image(watermark_array)
    
    return watermark_image

2.4 问题四

LSB(Least Significant Bit)是一种常见的信息隐藏技术,通常用于数字水印和隐写术。在使用LSB进行信息嵌入时,需要注意以下几点:

  1. 选择合适的嵌入位置:LSB通常是将信息嵌入到图像的最低有效位,因为这样对图像的影响最小,人眼难以察觉。然而,如果图像可能会受到压缩或其他形式的处理,这些处理可能会改变最低有效位,导致嵌入的信息丢失。因此,如果预计图像可能会受到这种处理,可能需要选择其他的嵌入位置,例如更高的位。

  2. 保护嵌入信息的安全性:虽然LSB嵌入可以隐藏信息,但如果攻击者知道使用了LSB嵌入,他们可能会尝试提取或破坏这些信息。因此,可能需要使用加密或其他形式的保护来确保嵌入信息的安全性。(比如先对要嵌入的信息进行加密再进行嵌入)

  3. 避免过度嵌入:虽然LSB嵌入对图像的影响较小,但如果嵌入的信息过多,可能会导致图像质量明显下降。因此,需要在隐藏信息的需要和保持图像质量之间找到平衡。

在使用最低有效位(LSB)隐写技术进行信息嵌入时,首先需要注意的是隐蔽性和安全性。确保嵌入的信息不会在视觉上或统计上引起异常,避免泄露信息的存在。对敏感信息进行加密,然后再嵌入,以增加信息的安全性。

其次是容量与质量平衡。根据需求选择适当的容量,嵌入过多信息可能导致图像质量下降,容易被察觉。在嵌入信息前后进行图像质量评估,确保不会引起明显的视觉损失。

再次是随机性和伪装。随机选择LSB嵌入的位置,而不是在固定的位置进行嵌入,以增加隐蔽性。在信息嵌入之前,可以在LSB位置上加入随机噪声或微小的变化,以使嵌入更难被检测。

最后要考虑的是检测和提取。记录或嵌入元数据以标识图像中嵌入信息的存在,以便在需要时提取。嵌入前可以添加错误检测和纠正码,以确保信息在提取时的完整性和正确性。

我们问题四的思路如下图所示:

在这里插入图片描述

三、项目工程预览

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
数学建模优秀论文 本节主要讲解数学建模竞赛应该如何准备以及分工的问题。很多新来的学生 都会问我这个问题数学建模好难、我不会建模、我数学底子很差。其实,我觉 得由于从小学到高中的教育,很容易把数学建模等同于数学竞赛。这两者其实真 的天差地别,如果说数学竞赛更多的是一种智力的比拼,那么数学建模更多的是 一共系统与工程协调的比拼。粗俗点说,前者就是做,后者则是科研。 数学建模主要分为三个方向,建模,编程,以及写作。我们通常看到数学建 模证书上面有三个人的名字 xxx,xxx,xxx。如果按照传统思想排队,一般第一 个人负责建模,第二个人负责编程,第三个人负责写作。其实三个人在队伍中的 地位是平等的,所以国奖证书很人性化地把大家的名字都排在自己队伍的第一位。 下面具体说说建模、编程以及写作。 建模主要是需要构建出一个数学模型,这个模型可以是一组方程,可以是一 个可操作的框架,也可以是一个函数。总而言之,能用数学解决问题的一种抽象 方法,就是数学模型。我们高中学的物理,在解物理的过程,其实就是数学建 模的过程。比如 2016 年国赛 A 的第一问,只要用到高中物理的正交分解法, 列出水平方向以及竖直方向的精力平衡,即可解决该问题。我想,大家都是考上 本科的人了,最基础的物理还是会的吧?所以对于建模的同学来说,并不要求你 的数学功底有多么的好,但是需要你在培训或者自学期间,多涉猎一些模型(不 求计算或者推导,只求能有一定的印象,只要这个模型应该用在什么地方即可。) 这样,到了真正比赛的时候,想到用什么方法,结合网络等资源便可以迅速学习 出相关的模型理论,经过自己的一定创新,便可以较好地解决所需要完成的任务。 编程这一块是韩同学的强项。我只谈谈作为建模为主,但是要懂一些编程的 人应该达到的编程水平。严格来说,写 MATLAB 代码还做不到完全脱离书本的水 平。但是我已经具备了看到一大段代码,自己对其中的部分语句进行修改,为我 所用,实现自己想要的功能。对于建模比赛来说,达到这种水平一般来说是够用 了,只要在编程同学写程序的时候,建模的同学可以检查 MATLAB 代码是否符合 数学模型的要求,而不是单纯的代码堆积。如果是计算机或者软件方向的学生, 那么就尽可能地多学习 MATLAB 有关知识,能够自己独立写出代码并且调试错误 那么是再好不过的了。 写作这一块是专门为文科生或者女生准备的福利,其实不管你的模型多么华 丽,不管你的程序复杂度多么地低,如果无法形成一篇语句流畅,图文并茂的论 文出来。你还是只有拿成功参赛奖的命。如果说建模与编程的同学决定了获奖的 11 上限,那么写作的同学则决定了获奖的下限。一篇排版以及语句优秀的论文,可 以让评委老师眼前一亮,迅速获得好评。在国赛中,由于不放心论文,所以两次 论文写作均是我个人操刀,其实两次论文都存在一定的遗憾。如果有一位细心的 女同学可以帮助另外两名队友写作并且细心排版,那么论文的水平将会更上一层 楼。同时,我希望写作的队员不要完全不顾数学,在比赛期间,还是应该或多或 少知道一些建模以及编程人的思路,即使提不出什么意见,也有助于清晰写作的 框架。 上面为不同方向的队员应该是怎样的以及如何准备。而且我建议三名小组成 员最好是从大一一直打到大四的比赛,只有磨合默契的队友,才更有希望冲击国 奖甚至国一。 四、 数学建模竞赛比赛技巧 既然这是谈建模竞赛,那么我还是需要谈一谈应试技巧的话,对于代做或 者直接抄袭他人作品的行为我是十分反对的(不能以身试法,否则不仅损害个人 名誉,损害学弟学妹参赛资格,更加损害学校的声誉)。 1.选机灵点,在选前,建议先上知网等学术网站对相关话进行查找, 如果相关文献较多,那么则更容易从中获得灵感,建立出属于自己的模 型(如果用到了里面的公式或者模型,一定要引用)。不过这种做法存在 一个缺点,就是你这么想,难道别人不会这么想么?所以,最终大家的 论文虽然都是各自独立完成的,但是很容易出现结果差不多,图表差不 多,甚至模型差不多的情况。因此,这样很难分出优劣,对于拿国奖来 说,并不是十分有利。(一般国赛 A 多为这种情况,如果想通过原创冲 击国奖,那么更应该选择可塑性高的问题,如 B )。 2.如要冲击国奖最好选择可塑性高的,一般每年国赛的 B ,都是方案 类问题,即使你在知网或者其他网站上找到相似的文献,但是仔细一看, 往往都是失望而归。因为 B 一般都是热点问题:比如去年的互联网+打 车和今年的小区道路改造问题,都是以往不曾出现过的。所以,如果 B 你可以挖掘出别人挖掘不到的信息,并且建立出一个较为新颖的模型, 那么国一就是你的了。 3.一定要把第一做对(做不对也要给出一个结果)!一定要写一篇较为完 整、格式较为清晰(哪怕只做了一问,也有文章)的论文。如果可以达 到上述要求,那么不论是什么建模比赛,奖状都有你的一份了。。。。但是 很遗憾,每年不管什么类型的比赛,很多同学连这一条也无法达到,所 以同学们应该反思自己,为什么拿不到奖了。 4.对于得不出较为理想的值,则应该从现在所做的所有工作中选一个数据 出来作为答案,并且附上理由。千万不要无端造出程序无法实现的答案 出来,如果万一进了国奖答辩,评委问你这个数据怎么得出来的,你总 不可以说是猜出来的吧? 5.每一次比赛,都认真做,不要总想着还有下一次的比赛可以做,做好每 一次的比赛,都是一次不错的锻炼。 6.写作的同学可以参考往届优秀论文,尤其以广西赛区的优秀论文为主, 学习他人的写作方式,这样可以让自己的论文风格,论文框架,论文排 版均接近国奖论文的素养。 12 7.编程的同学如果想使用他人的程序时,不妨学会其思想,自己设计新算 法并且实现功能。而且对于复杂的程序,最好在论文中附上一个程序框 图,方便评委老师理解。 8.建模的同学应该多多涉猎不同的文献,中文的,外文的最好都阅读以下, 然后自己在草稿纸上画一些思维导图,对这些文献之间的关系进行一定 的梳理,然后结合本问题分析,看看什么地方需要修改,什么地方需要 精简,什么地方需要补充等等。而且,建模的同学一定要尽量把模型程 序化,用一些编程同学听得懂的话进行沟通。比如我把今年 A 第一问 从物理受力问题变成了迭代求解问题,这样编程的同学则会舒服很多 数学建模参考的书目以及网站 书籍 1.《 数学模型》姜启源等著 阅读人群:建模 这本书虽然被奉为数学建模最经典的入门书,但是我本人并不是十分喜欢。 第一,这本书的模型比较杂,而且可操作性较差。意思就是说,告诉你了理论, 你很难再实践中自己去操作。而且很多模型较为基础,对于短期内学习达到国赛 的强度难度较大,因此适合作为一本辅助参考性读物进行学习。如果,你要一个 字一个字读下去,会发现到头来还是什么都不太会(除了暑期培训的时候阅读过, 之后再也没有使用过了) 。 2.《数学建模算法与应用》司守奎等 阅读人群:建模、编程 是我最为推崇的书:《数学建模算法与应用》。这本书是司守奎老师写的新书, 司老师是数模一线教练,经常培养出国一国二。因此他的书与国赛风味十分贴近, 很多问题都是取自国赛原,而且附上了所有程序的源代码,那本书中的光盘则 收入了所有程序的 m 文件(MATLAB 的源文件),实属业界良心(都省去了你抄源 代码的时间)。所以,这本书是可以用来临时抱佛脚的,如果你的目标就是在省 赛区取得一定的名次,那么这本书真的足够你用了(基本上每次比赛,我首先查 阅的必定是这本书)。 3.《数学建模》Frank R. Giordano 等著 叶其孝等译 阅读人群:建模 这本书是美赛负责人写的书,实际上我阅读这本书也觉得没有多大的意思, 和姜启源那本数学模型类似,不适合一页页阅读,更加适合提高建模的修养,但 是不适合用来准备数学建模国赛或者美赛。所以,如果你想要参加美赛,那么建 议你还是稍微看看,毕竟是美赛指定的参考书。 4.《 MATLAB 在数学建模中的应用》卓金武等著 阅读人群:编程 这本书和司守奎老师的那本书风格有点接近,例基本选于国赛赛,但是 这本书对于模型的介绍较少,主要都是给出 MATLAB 代码,每一章最后都有延伸 阅读,因此对于 MATLAB 感兴趣的同学可以将这本以及下一本作为入门参考书。 5. 《MATLAB R2014a 完全自学一本通》刘浩等著 阅读人群:编程 这本书是一本 MATLAB 工具书,并不完全针对数学建模,但是很多 MATLAB 使 用的小技巧都来自于这本书,比如今年我们画的锚链形状图,均来自这本书的灵 感。 6.《 20XX 年全国大学生数学建模竞赛广西赛区经验交流及优秀论文选》吕跃进 著 阅读人群:写作(最为重要)建模(参考) 编程(参考) 13 作为广西赛区优秀论文集,写作的同学尤其需要注意,广西赛区的优秀论文 都是长什么样子的?我们不需要先想着和其他赛区的人比,先学习自己赛区的人 的论文,可以让自己的起步稍微简单一些。XX 的意思就是某某年,一般从 20102015 年的左右参考下即可。 7.《全国各赛区优秀论文》 阅读人群:写作 建模 编程 当你学有余力时,不妨多看看其他省份优秀论文,找找差距,找到一个提高 建模水平的方向。 8.《正确写作美国大学生数学建模竞赛论文》&《美国大学生数学建模竞赛解 析与研究》 王杰等著 阅读人群:建模 写作 这两本书作为美赛官方读物,非常适合美赛冲刺前 2 个月阅读,由于这套书 并没有给出源程序,因此只有写作以及建模的同学进行参考。尤其是《正确写作 美国大学生数学建模竞赛论文》这本书,非常适合写作的同学学习,其中有一些 写作习惯甚至可以用于国赛的写作中去。这本书还有一个特色就是讲解了部分有 关使用 LaTeX 的知识。 9.《 SPSS 统计分析基础教程》&《SPSS 统计分析高级教程》张文彤等著 阅读人 群:编程 这两本书手把手地教你如何使用 SPSS 分析数据,加上 SPSS 本身“傻瓜式” 设计,因此配合这两本书进行一定的学习足够了。 10.《 Origin9.1 科技绘图与数据分析》叶卫平著 阅读人群:编程 建模 如果在短时间之内学会一个软件并且可以进行比赛,那么 Origin 绝对是一 个利器。基本上涉及绘图的问题,大多数 MATLAB 可以完成的,它也可以完成。 几乎与 SPSS 一样的“傻瓜式”设计,非常适合初学者学习掌握。所以我认为建 模的同学多学一个绘图的软件也没有什么不好的(我们美赛的灵感出自这本书) 。 上面 10 本书希望绝大多数同学都可以涉猎一二,即使是枯燥的数学模型那 本书,最好也稍微看看,好歹有一些印象。而司老师那本书,我则希望人手一本。 下面的书籍由于时间成本还有与建模的关系不是那么紧密,所以参考即可。 11.《 SAS 统计分析实用宝典》 姚鑫峰等著 阅读人群:编程 作为最为专业统计软件 SAS,对于处理大数据问题的时候,是当仁不让的王 者,连 MATLAB 都要为其让路。如果你十分热衷于大数据的问题,还有想参加“汇 丰杯”SAS 数据分析大赛的同学,或者参加阿里巴巴天池大数据竞赛的同学不妨 以这本书作为基础,学习 SAS 吧。 12.《 R 语言实战》Robert I. Kabacoff 著 高涛译 阅读人群:编程 作为 SAS 的姊妹,R 语言作为免费开源的数据分析软件同样大受欢迎,如果 你不喜欢昂贵的 SAS,那么投入 R 的怀抱也不错。 13.《物理学原理在工程技术中的应用》马文蔚等著 阅读人群:建模(尤其喜欢 A 的同学) 本来是不太想把物理类的专业书引入到数学建模竞赛中来,无奈自从 2014 年开始,每年国赛 A 问题都是物理问题(可以认为是纯物理问题),2014 年, 卫星变轨问题(万有引力与航天)。2015 年,利用杆子的太阳影子定位(球面天 文学与地球物理学)2016 年,系泊系统的设计(力平衡与力矩平衡) 。所以天知 道 2017 年 A 会出什么样奇怪的问题。这本书有助于大家对于物理在工程上的 应用有一定的认识,以作为知识储备。 14. 《MATLAB 神经网络 43 个案例分析》 王小川等著 阅读人群:编程 最近几年比赛中,智能算法越来越多地出现在本科生的比赛中了,如果你想 14 在国赛或者美赛中使用一些新鲜的算法,那么还是学习这本书中的一些案例吧。 这本书的源程序全部都给你了,只需要对着程序一步步推敲,一定可以学到一些 知识(我们“好贷杯”模型的灵感出自这本书)。 15. 《机器学习》周志华著 阅读人群:建模 由于这个领域现在属于热门领域,因此数模的很大一部分未来的研究方向皆 在于此。我本人对于这个领域也处于学习当中。当然,你想要看懂这本书,还是 先学好概率论与数理统计,线性代数,和部分微积分的知识吧。 网站 1.数学中国论坛:www.madio.net 作为中国最大的数模论坛网站,你可以找到很多奇奇怪怪的数模资料,当然 我还是劝你先学好上面 10 本书之内的东西,因为其实一个人的精力并没有那 么多。 (实际上,我参加数学中国的比赛,很少用体力去上面下载什么资料) 。 2.LaTeX 中国区论坛:www.ctex.org 你想知道的 LaTeX 资料,上面都有。 3.中国知网:www.cnki.net 维普:www.cpvip.com 万方:www.wanfang.com.cn 这三家为中国主流的文献数据库,基本上大多数中文期刊可以找到。 4.由于 Google 学术在中国区无法使用,因此只能使用 Bing 学术搜索外文文献 了:http://cn.bing.com/academic 5.赛氪网:www.saikr.com 作为 APMCM 和 Mathorcup 的主办方,赛氪还是其他很多比赛的报名渠道。不 经意间往往可以发现更多适合自己的竞赛。 6.COMAP:www.comap.com 美赛官方网站,由于美赛是一个只发放电子证书的比赛,因此了解他家官网 还是很有必要的。 7.阿里巴巴天池大数据竞赛:http://tianchi.shuju.aliyun.com 作为数模后续竞赛,对于大三或者大四等高年级的同学,欢迎转战更加具有 实用性质的数据分析竞赛。 8.MATLAB 中文论坛:http://www.ilovematlab.cn 有啥问题就丢上去问就行了。 9.人大经济论坛:http://bbs.pinggu.org/ SAS,SPSS 等统计类的问题,在这个论坛上找出相关的目录,进去发问就好了。 这个论坛是我国经管类最好的论坛。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旅途中的宽~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值