如何从混合图像中取消混合两个图像
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】:如果您有一张原始图像加上混合图像,则可以恢复第二张图像。
如果您只有混合图像,则可以将几乎无限数量的 img1
和 img2
组合起来创建这两个图像,因此您无法恢复它们。
对于未来的 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)
很高兴它有效。请注意,如果答案对您有用,您可能希望接受它。以上是关于如何从混合图像中取消混合两个图像的主要内容,如果未能解决你的问题,请参考以下文章