2023年深圳杯数学建模B题电子资源版权保护问题解题全过程文档及程序

328 篇文章 53 订阅
8 篇文章 1 订阅

2023年深圳杯数学建模

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条注意事项,并说明理由。

整体求解过程概述(摘要)

  在当今广泛应用计算机网络的时代,电子资源的快速网络传递日益普遍。与此同时,保护电子资源的著作权问题也逐渐成为至关重要的议题,在信息安全领域占据关键地位。数字图像隐写是一种将信息隐藏在数字图像中的技术,这种技术可以用于各种安全和隐私保护应用。本文从数字图像的全局和局部统计分布特性两个方面出发,系统地探讨了数字图像隐写的发展情况。依据图像分析技术和LSB原理,考虑如何对已知图片建立嵌入图片、信息时的模型,考虑在信息传递过程中受到外界影响时如何改进模型,具体做法如下:
  针对问题一,首先,我们使用工具如MATLAB对附件1中的图片P进行分析,以深入了解其像素分布、色彩特征、纹理特性等。我们必须仔细考虑将信息嵌入到图片P中的位置、方法以及嵌入的信息量。可以通过微调像素颜色分布或像素值来实现嵌入,以尽量减小对视觉效果的影响。其次,基于前文的图像分析结果,我们可以建立LSB方法的数学模型,将信息嵌入方案形式化,以生成嵌有信息的图片SP。根据这个模型,我们可以编写代码并生成所需的结果图像,并从结果图像提取嵌入信息。最后,我们需要进行相似度检验,计算原始图像与嵌入信息图像之间的均方误差(MSE)和结构相似性指数(SSIM)等值,分别为0.53和0.999,说明我们的隐写技术未破坏原始图像的结构特征。
  对于问题二,首先,我们将《中华人民共和国著作权法》(第三次修正案)的文本信息存储为txt文件,评估字节数或字符数。其次,对《中华人民共和国著作权法》(第三次修正案)的文本信息进行编码转换,可知最终生成的349952个位二进制数据,远小于图片可供存储的位数7280640,因此能将《中华人民共和国著作权法》(第三次修正案)中的所有文本信息嵌入附件1的图片中,使用问题一的LSB方法,将文本信息嵌入图像的像素中。最后,生成嵌入文本信息的结果图像,并进行视觉分析,对比嵌入前后的图像,评估潜在的视觉失真。使用相同地隐写技术从嵌入后的图像中提取文本信息,进行解码和还原。
  针对问题三,在信息传递过程中,应考虑压缩、格式变换、缩放、旋转或其他几何变形等操作导致的嵌入和提取信息的困难。我们希望采用一种称为“鲁棒”的信息隐藏技术改进我们的算法,因此我们在问题一的基础上提出了一些可能的改进方法:(1)使用更复杂的嵌入技术;(2)使用错误纠正编码;(3)使用水印技术;(4)使用更强大的机器学习方法。本文选择水印技术进行信息嵌入算法的改进。首先,通过离散余弦变换(DCT)的暗水印技术进行信息嵌入,使得图像经其他处理后仍能提取出隐藏的信息,以改进LSB方法的不足。其次,对图片进行8×8分块,再对子块进行水印的提取。此时进行Arnold逆变换实现水印信息的揭秘复原,最终提取出水印图片。
  针对问题四,我们根据LSB算法的不足,在选择合适的嵌入位置、保护嵌入信息的安全性以及避免过度嵌入这三方面提出注意事项。

模型假设:

  在进行图像的操作过程中,我们结合相关文献给出以下假设:
  假设1:附件1中的图片P是未经过重大变形或处理的原始图片。
  假设2:图片P用数字矩阵的形式表示,每个像素值在0~255范围内,没有信息的损失。
  假设3:算法嵌入的信息以文本形式存在时,我们可以将其转化为适当的数据格式以进行嵌入。
  假设4:嵌入算法的调整不会引起明显的视觉变化或损害。
  假设5:附件1的图片格式和质量不会影响算法的可行性。
  假设6:预处理过程可能会在一定程度上抵消传递过程中的变形影响,但不一定能完全恢复原始状态。
  假设7:问题1中的算法在发生轻微缩放或旋转等小范围变形时可能仍然有效,但在较大程度变形时可能需要调整。
  假设8:算法应该在信息嵌入和视觉质量之间取得平衡,以确保嵌入信息的可读性和图片的外观。
  假设9:算法具备一定程度的鲁棒性,能够在轻微的处理和变形情况下保持嵌入信息的稳定性。
  这些假设为我们在解决问题时提供了指导和基础。在实际的解决问题的过程中,我们将对这些假设进行验证和调整,以确保所设计的算法在不同情况下的可靠性和有效性。

问题分析:

  问题一分析
  问题一的第一个问题要求基于附件1的图片P,构建一个生成图片SP的数学模型,其中SP包含嵌入了“深圳杯数学建模挑战赛”信息,同时确保在人的视觉感知下SP与原图P尽可能相似。问题一的第二个问题要求设计并实现一个能够生成图片SP的算法。该算法需要将生成SP的源代码以及生成的结果图片SP都放置于参赛作品的附录A中。另外,还需要提供从图片SP中提取著作权信息所使用的源代码,并将其置于参赛作品的附录B中。
  问题一的核心目标是通过嵌入信息的方式,生成一张新的图片SP,使得这张图片在人的视觉上尽可能与原始图片P相近,同时确保嵌入的信息不会对图片的视觉质量产生明显影响。为了解决这个问题,我们需要进行以下详细的问题分析:
  首先,我们需要对附件1中的图片P进行分析,使用MATLAB工具对图片P进行处理,了解其像素分布、色彩特征、纹理特征等。这有助于我们确定如何在图片中进行信息嵌入,以及如何在生成图片SP时保持相似的视觉效果。要将"深圳杯数学建模挑战赛"信息嵌入到图片P中,需要考虑嵌入的位置、方式以及嵌入的信息量。我们可以利用像素的颜色分布或像素值的微调来实现嵌入,以尽可能地减小对视觉效果的影响。
最后设计出一个算法,建立LSB方法[3]的数学模型,基于前面的信息嵌入方案,将生成图片SP的过程形式化。这个算法需要考虑如何在保持图片相似性的同时进行信息嵌入。要注意调整像素值时的阈值,以避免引起明显的视觉差异。
在问题一的解答过程中,我们将遵循这些要求,确保所提供的模型、算法和代码都能够满足问题的目标,并在附录部分提供相关内容。这样,读者可以全面了解我们的方法和技术,验证其有效性并对结果进行评估。
  问题二分析
  问题二要求我们使用问题1中的模型与算法,能否将《中华人民共和国著作权法》(第三次修正案)中的所有文字信息嵌入附件1的图片中,如果不能,需要给出能嵌入多少字。
  文本信息的容量通常以字节为单位进行计算,而图像的容量通常以像素为单位进行计算。文本信息的嵌入需要足够的像素来隐藏,而像素数量决定了能够嵌入的文本容量[7]。问题一的方法是通过改变像素的最低有效位(LSB)来嵌入信息[5],因为改变最低位通常对图像的视觉影响较小。然而,这种方法有其限制,嵌入大量文本可能会导致图像中的视觉失真。图像的特性,如分辨率、色彩深度等,会影响能够嵌入的文本容量。更高分辨率和色彩深度的图像通常具有更多的像素,从而具有更大的潜在嵌入空间。
  文本嵌入图像时通常需要将文本信息进行编码,例如使用ASCII编码、UTF-8编码等。编码会影响实际嵌入容量,因为某些编码方式可能需要更多的位来表示字符。
  综上所述,问题二的分析将涉及对附件1的图像属性、文本信息的容量以及嵌入技术的合理性进行综合考虑。最终能够嵌入的文本容量取决于图像的特性以及隐写技术的应用方式。如果要精确地确定能够嵌入多少文本,需要对图像和文本进行详细的分析和实验。
  问题三分析
问题一中的算法在图像传递过程中经历了压缩、格式变换、缩放、旋转或其他几何变形等操作后,可能会遇到一些挑战,导致嵌入和提取信息的困难。
  图像压缩可能会导致原始图像中的LSB信息丢失,嵌入的信息变得不可读或无法提取。如果图像需要压缩,可以在压缩之前先嵌入信息,然后再进行压缩。这样可以减少信息丢失的可能性。
不同的图片格式可能使用不同的压缩算法和颜色空间,嵌入信息的方式可能会受到格式变换的影响。在格式变换之前,可以将图像还原为原始格式,再嵌入信息。然后,再将其转换为所需的格式。
  缩放、旋转和几何变形这些操作可能导致像素值的变化,影响信息的嵌入和提取。在进行这些操作之前,可以记录图像的原始状态,包括像素值和位置。然后,应用这些变换后,再将信息嵌入到已变换的图像中。在提取信息时,需要对变换进行反向操作,以还原原始图像的状态。
  在图像经历多次变换和处理后,可能会引入噪声或其他视觉问题,使得信息的嵌入和提取更加困难。使用更稳健的隐写技术,可以容忍一定程度的图像变化和质量损失。此外,可以进行更严格的质量控制,以确保在图像传递过程中尽量减小视觉损失。
  在图像传递过程中,可能会出现数据传输错误或丢失,导致信息不完整。为了保证信息的完整性,可以在信息嵌入时添加错误检测和纠正码,以检测和修复在传递过程中引入的错误。
  总之,问题1中的算法在图像传递过程中可能需要针对不同情况进行适应和改进。重要的是根据具体情况,综合考虑图像处理操作、数据完整性、加密和隐写技术,以确保信息的可靠嵌入和提取。随着图像传递过程中涉及的操作增多,需要更多的注意和技术手段来处理潜在的问题。
  问题四分析
  在使用最低有效位(LSB)隐写技术进行信息嵌入时,首先需要注意的是隐蔽性和安全性。确保嵌入的信息不会在视觉上或统计上引起异常,避免泄露信息的存在。对敏感信息进行加密,然后再嵌入,以增加信息的安全性。
  其次是容量与质量平衡。根据需求选择适当的容量,嵌入过多信息可能导致图像质量下降,容易被察觉。在嵌入信息前后进行图像质量评估,确保不会引起明显的视觉损失。
  再次是随机性和伪装。随机选择LSB嵌入的位置,而不是在固定的位置进行嵌入,以增加隐蔽性。在信息嵌入之前,可以在LSB位置上加入随机噪声或微小的变化,以使嵌入更难被检测。
  最后要考虑的是检测和提取。记录或嵌入元数据以标识图像中嵌入信息的存在,以便在需要时提取。嵌入前可以添加错误检测和纠正码,以确保信息在提取时的完整性和正确性。

模型的建立与求解整体论文缩略图

在这里插入图片描述
在这里插入图片描述

全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

程序代码:

% 像素分布 
A=imread('b.jpg');
% get the histogram 
[Y,X]=size(A); % Y Row , X column
grayvalue=unique(A);
imginfo=[];
for i=1:length(grayvalue)
        [ANSy,ANSx]=find(A==grayvalue(i));
        imginfo.gray(i)=grayvalue(i);
        imginfo.position{i}=[ANSy,ANSx];
        imginfo.count(i)=length(ANSy)/(Y*X);
end
subplot(1,2,1);
imshow(A);
title('Original Image');
subplot(1,2,2);
stem(imginfo.gray,imginfo.count,'Marker','none');
xlabel('Graylevel');
ylabel('Proportion');
axis([0 255 0 max(imginfo.count)]);
title('原始图像像素分布')


% 纹理提取
oriImg = imread('B1.jpg');
grayImg = rgb2gray(oriImg);
 
[m,n] = size(grayImg);
Features = zeros([m,n]);
 
for i = 2:m-1
    for j = 2:n-1
        % 得到领域,比较心细
        neighbor = [ oriImg(i-1, j-1)  oriImg(i-1, j) oriImg(i-1, j+1)  oriImg(i, j-1)...
                     oriImg(i, j+1) oriImg(i+1, j-1) oriImg(i+1,j) oriImg(i+1, j+1)] ...
                   > oriImg(i,j);
        pixel = 0;
        for k = 1:8
            pixel = pixel + neighbor(1,k)*bitshift(1,8-k);  %将其转换为十进制
        end
        Features(i,j) = pixel;
    end
end
Features = uint8(Features);
subplot(1,2,1);
imshow(A);
subplot(1,2,2);
imshow(Features)


% 色彩特征
% 一二三阶矩的计算
clear;
clc;
I=imread('B1.jpg');
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);
figure;
subplot(221);imshow(I);title('ԭͼ');
subplot(222);imshow(R);title('R');
subplot(223);imshow(G);title('G');
subplot(224);imshow(B);title('B');
R=double(R);
G=double(G);
B=double(B);
[m,n]=size(R);
%一阶矩(均值)
Rmean=mean2(R);
disp(Rmean)
Gmean=mean2(G);
disp(Gmean)
Bmean=mean2(B);
disp(Bmean)
%二阶矩(标准差)
Rstd=std2(R);
disp(Rstd)
Gstd=std2(G);
disp(Gstd)
Bstd=std2(B);
disp(Bstd)
%三阶矩(偏差)
sum=0.0;
for i=1:m
    for j=1:n
        sum=sum+(R(i,j)-Rmean)^3;
    end
end
Rske=(sum/(m*n))^(1/3);
disp(Rske)
sum=0.0;
for i=1:m
    for j=1:n
        sum=sum+(G(i,j)-Gmean)^3;
    end
end
Gske=(sum/(m*n))^(1/3);
disp(Gske)
sum=0.0;
for i=1:m
    for j=1:n
        sum=sum+(B(i,j)-Bmean)^3;
    end
end
Bske=(sum/(m*n))^(1/3);
disp(Bske)

%RGB颜色空间
I=imread('B1.jpg');
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);
figure(1);
subplot(221);imshow(I); title('原图')
subplot(222);imshow(R); title('R')       
subplot(223);imshow(G); title('G')     
subplot(224);imshow(B); title('B')          
figure(2);
subplot(131);imhist(R);title('R直方图')       
subplot(132);imhist(G);title('G直方图')          
subplot(133);imhist(B);title('B直方图') 
from PIL import Image
import base64

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


def extract_info(image_path, info_len):
    img = Image.open(image_path)
    width, height = img.size
    pixels = img.load()
    bits = ''
    for x in range(width):
        for y in range(height):
            r, g, b = pixels[x, y]
            bits += format(r, '08b')[-1]
            bits += format(g, '08b')[-1]
            bits += format(b, '08b')[-1]
    # 把二进制字符串转换为ASCII码列表
    bits = bits[:info_len]
    chars = [chr(int(bits[i:i + 8], 2)) for i in range(0, len(bits), 8)]

    # 把ASCII码列表转换为字符串,并去掉末尾可能存在的空字符(\x00)
    message = ''.join(chars).rstrip('\x00')
    # 把base64编码还原为中文
    message = base64.b64decode(message.encode('ascii')).decode('utf-8')
    return message

if __name__ == '__main__':
    image_path = "1.jpg"
    output_path = "3.PNG"
    msg_len = embed_info(image_path, "fff", output_path)

    msg = extract_info(output_path, msg_len)
    print(msg)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值