如何将多个图像合并嵌入到一起

4

是否有一些转换函数(例如傅里叶等)可以将多个图像文件(3D)合并成一个文件,例如数字相册。这些文件的组合应该是可逆操作,以便可以分离单个图像。

我尝试过,但我确定这与实际需要相去甚远:

img1=imread('lena_gray.jpg');
img2=imread('pic1.jpg');
img3=imread('pic2.jpg');

defimage=pow2(get(0,'DefaultImageCData'),47);
mag=200;
imshow(bitslice(defimage,47,51),'initialmag',mag);
r=bitslice(img1,50,50);
g=bitslice(img2,50,60);
b=bitslice(img3,100,100);
imshow(cat(3,r,g,b),'initialmag',mag);

这显然导致了一个错误!

另外,如何实现反向操作?Cramer逆矩阵定理是否有助于解复用组合图像?如果有,如何在RGB图像上应用Cramer的规则?


你需要更具体地说明你想要实现什么以及为什么。你是想将图像混合在一起吗?还是想将潜在的图像嵌入到载体图像中,用于类似隐写术的应用程序中? - mpenkov
1
@misha:这是隐写应用程序的前身,但它还处于萌芽阶段。 - SKM
@SKM:你的主要意图是隐藏潜在的图像,还是仅仅将多个图像合并成一张图片?此外,从你的代码来看,你遇到了什么样的错误? - mpenkov
@misha:在第一阶段,我想学习如何将它们组合起来,而不仅仅是普通的加法操作,然后再进一步完善以隐藏它们。错误是??? Error using ==> imshow>ParseInputs Invalid input arguments; see HELP IMSHOWError in ==> imshow at 85 [cdata, cdatamapping, clim, map, xdata, ydata, filename, ...Error in ==> test at 7 imshow(bitslice(defimage,47,51),'initialmag',mag); - SKM
@SKM:你使用imshow函数的方式是错误的。你给了它三个参数--你真的理解它们的含义吗?请阅读文档。http://www.mathworks.com/help/toolbox/images/ref/imshow.html - mpenkov
显示剩余4条评论
3个回答

1

我想您正在尝试实现多路复用和多路分解。建议尝试使用Fresnel变换代替傅里叶变换。


是的,我正在寻找数学解释,我认为可以通过Fresnel变换实现。但是,再次提问,如何在Matlab中完成它,以及为什么要这样做,因为如Jonas所建议的那样可以通过比特切片完成相同的操作。 - SKM

1

我阅读了博客文章并尝试了一些东西,我已经修改了我的问题以及代码片段,但它根本不接近并且会出现错误。这些图像是uint8类型的。请帮忙。 - SKM

0

基于您提供的信息,我可以为您建议几种方法:

  • 将每个图像存储在单独的颜色通道中。这是最简单的方法。您可以以这种方式存储多达3幅图像(RGB或YUV中的一幅)。如果您的文件格式支持Alpha通道,则可以存储4个图像。这假定您使用每个像素8位。
  • 交错您的图像。如果您以无损方式执行此操作,则输出图像的尺寸将增加(乘以要组合的图像数)。如果您以有损方式进行,则会失去空间分辨率(例如,如果您对两个图像执行扫描线交错,则垂直分辨率将降低至原始值的一半)。
  • Jonas已经建议在低阶位中隐藏数据,因此我不会详细介绍它,只会说这是一种有损方法
  • 查看随机重排图像像素以掩盖串联的图像。该链接适用于Python,但Matlab应该有类似的内容。

基本上,你的问题是需要权衡以下方面:

  • 输出图像大小。简单情况下可以通过在网格中平铺图像来实现。这是完全可恢复的,没有任何损失,但也非常明显,因此可能没有用。
  • 有损与无损。有损处理方法将允许您实现更小的输出图像尺寸。
  • 可见性与可恢复性。嵌入内容越明显,恢复它(或至少检测到存在某些内容)就越容易。对于仿射变换和常见的图像处理操作(如模糊),较不可见的嵌入信息通常更加脆弱。请阅读有关水印的更多信息。

这应该足以让你开始了。


在你的方法中,第一点,我需要使用位切片。那么,由于问题中提供的代码出现错误,我该如何处理呢? - SKM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接