如何从混合图像中取消混合两个图像

Posted

技术标签:

【中文标题】如何从混合图像中取消混合两个图像【英文标题】:How to unblend two images from a blend image 【发布时间】:2010-06-13 20:13:49 【问题描述】:

我已经用这段代码混合/合并了 2 个图像 img1 和 img2,效果很好。我想知道的是如何获得原始的两个图像 img1 和 img2。混合代码如下

img1=imread('C:\MATLAB7\Picture5.jpg');
img2=imread('C:\MATLAB7\Picture6.jpg');
for i=1:size(img1,1)
  for j=1:size(img1,2)
    for k=1:size(img1,3)
      output(i,j,k)=(img1(i,j,k)+img2(i,j,k))/2;
    end
   end
end
imshow(output,[0 255]);

【问题讨论】:

【参考方案1】:

如果您有一张原始图像加上混合图像,则可以恢复第二张图像。

如果您只有混合图像,则可以将几乎无限数量的 img1img2 组合起来创建这两个图像,因此您无法恢复它们。

对于未来的 matlab 编程,请注意,在 matlab 中您不需要您编写的循环,这与您提供的代码等效:

img1=imread('C:\MATLAB7\Picture5.jpg');
img2=imread('C:\MATLAB7\Picture6.jpg');
output = (img1 + img2) ./ 2;
imshow(output,[0 255]);

【讨论】:

考虑你是如何生成它的:new = (im1 + im2) / 2。现在,使用代数解决您没有的问题。假设你没有im2: 2*new = im1+im2 -> im2 = (2*new) - im1。这为您提供了在给定已知图像和混合的情况下恢复未知图像的算法。 这里有一个非常重要的警告。如果这对图像是 uint8 值,那么将它们加在一起,然后除以 2 往往会产生 8 位溢出。例如,A = uint8(255); (A+A)/2, ans = 128【参考方案2】:

如果你像这样混合图像:

img1=imread('C:\MATLAB7\Picture5.jpg');
img2=imread('C:\MATLAB7\Picture6.jpg');
blendedImg = (img1/2 + img2/2); % divide images before adding to avoid overflow

如果你有 img2,你可以从混合图像中取回 img1(可能有一些舍入错误)

img1recovered = 2*(blendedImg - img2/2);

figure,subplot(1,2,1)
imshow(img1,[0 255])
subplot(1,2,2)
imshow(img1recovered,[0 255])

【讨论】:

谢谢你,Donnie 和 Jonas。不知道这么简单!!感谢你的时间和耐心。 但是,没有恢复确切的图像,有颜色损失..它比原来的 iamge 更暗,说 img2 正在恢复,但恢复不是 100% 完美。如何克服这个问题并获得原始图像? 在进行混合和反混合之前将图像转换为双倍。这大大减少了舍入误差。另外,如果它更暗:您是否将未混合的结果乘以 2? @gavishna:改用double(img2) 很高兴它有效。请注意,如果答案对您有用,您可能希望接受它。

以上是关于如何从混合图像中取消混合两个图像的主要内容,如果未能解决你的问题,请参考以下文章

在iOS swift中旋转和混合图像

用于像素混合的调色板量化

请教PS CS4两个问题,混合图层和自动吸附~~

混合图层图像Android上的触摸事件

在 OpenCV 中加法混合两个部分重叠的图像

使用opencv复制/混合不同大小的图像