OpenCV:在保存时,imwrite更改通道像素值

3

我正在读取一张图片,并在不改变红色和绿色通道的情况下对蓝色通道进行处理。

当我完成了对蓝色通道的处理后,我将三个通道合并成一个RGB图像。当我使用imshow查看通道时,一切都很正常,我可以看到所做的更改仅影响蓝色通道,而不影响红色和绿色通道。

到这里为止,一切都很好!

但是,当我使用imwrite保存图片时,生成的图片略有不同,似乎对蓝色通道所做的更改会传播到红色和绿色通道,就像imwrite在三个通道之间做了某种平均值:

 image = imread('image.jpg', IMREAD_COLOR);
 split(image, channels);
// Create some changes on channels[0]

merge(channels, 3, image);
// Up to this point every thing is alright
imwrite("modified.jpg", image); // Image changes when written;

有没有任何解决方案可以避免这种行为?
1个回答

9

JPG是一种有损压缩格式:https://zh.wikipedia.org/wiki/JPEG

JPEG(/ˈdʒeɪpɛɡ/ JAY-peg)1是数字图像中广泛使用的有损压缩方法,特别适用于数字摄影所产生的图像。压缩程度可以调整,因此可以在图像质量和存储大小之间进行选择。JPEG通常可以以10:1的压缩比实现,而且图像质量损失很小。

解决方案:使用类似PNG这样的无损格式来保存您的图像。


那是我尝试的第一件事,但仍然是相同的事情。 - Allaoua Benchikh
我不认为问题在于有损压缩。我试着在Matlab上做同样的事情,当我保存图像时,我可以看到我对一个通道所做的任何更改并不会影响其他通道。 此外,我刚刚找到了这篇帖子,我认为它可能是相关的:http://stackoverflow.com/questions/29815299/opencv-2-4-8-2-imshow-differs-from-imwrite?rq=1目前我已经成功实现了我想要的,我以后会尝试研究一下,并发布正确的答案,或者在此期间,也许有人会找到答案。谢谢! - Allaoua Benchikh
嗨@AllaouaBenchikh,如果您尝试使用PNG为什么没有在您的问题中写出来?当提问时展示尝试过的内容总是很有帮助的!您可以尝试将其保存为*bmp。如果这行不通,请仔细检查合并通道是否正确,以便我们定位错误。您是如何做到想要的结果的?如果这是解决方案(即使是不好的),请与我们分享,以帮助未来的读者。 - Mailerdaimon
1
谢谢你的回答,我为这个问题苦恼了好几天。 - pavan

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