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

C++ OpenCV:imwrite在保存时更改通道像素值,c++,opencv,C++,Opencv,我正在读一幅图像,在蓝色通道上做一些处理,而不改变红色和绿色通道 当我处理完蓝色通道后,我将三个通道合并回一个RGB图像。当我使用imshow查看频道时,一切正常,我可以看到我所做的更改只影响蓝色频道,而不影响红色和绿色频道 到目前为止,一切都很好 但当我使用imwrite保存图像时,结果图像略有不同,在蓝色通道上所做的更改似乎传播到红色和绿色通道,这就像imwrite在3个通道之间做某种平均值: image = imread('image.jpg', IMREAD_COLOR); spli

我正在读一幅图像,在蓝色通道上做一些处理,而不改变红色和绿色通道

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

到目前为止,一切都很好

但当我使用imwrite保存图像时,结果图像略有不同,在蓝色通道上所做的更改似乎传播到红色和绿色通道,这就像imwrite在3个通道之间做某种平均值:

 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;
有什么办法可以避免这种行为吗

JPG是一种有损格式:

JPEG(/ˈdʒeɪpɛɡ/JAY-peg)是一种常用的有损压缩方法 数字图像压缩,尤其是生成的图像 通过数码摄影。压缩程度可以调整, 允许在存储大小和图像质量之间进行可选择的权衡。 JPEG通常实现10:1的压缩,几乎没有明显的损失 在图像质量方面

解决方案:使用无损格式(如PNG)保存图像。

JPG是一种有损格式:

JPEG(/ˈdʒeɪpɛɡ/JAY-peg)是一种常用的有损压缩方法 数字图像压缩,尤其是生成的图像 通过数码摄影。压缩程度可以调整, 允许在存储大小和图像质量之间进行可选择的权衡。 JPEG通常实现10:1的压缩,几乎没有明显的损失 在图像质量方面


解决方案:使用无损格式(如PNG)保存图像。

这是我尝试的第一件事,但仍然是一样的。我认为问题不在于有损压缩。我试着在Matlab上做同样的事情,当我保存图像时,我可以看到我在一个通道上所做的任何更改,其他通道都不会受到影响。另外,我刚刚发现了这篇文章,我认为它可能是相关的:因为现在我已经设法做到了我想做的,我稍后会尝试研究它。然后贴出正确的答案,或者在这段时间内有人会找到它。谢谢你,伙计!嗨@AllaouaBenchikh,如果你试图使用PNG,为什么不在你的问题中写下它?如果你在提问时表现出你的努力,这总是很有帮助的!您可以尝试将其保存为*bmp。如果这不起作用,请仔细检查合并的通道是否正确,以便找到错误。你是怎么做到你想做的?如果这是你问题的解决方案(即使是一个糟糕的解决方案),请与我们分享,以帮助未来的读者。这是我尝试的第一件事,但仍然是一样的。我不认为问题在于有损压缩。我试着在Matlab上做同样的事情,当我保存图像时,我可以看到我在一个通道上所做的任何更改,其他通道都不会受到影响。另外,我刚刚发现了这篇文章,我认为它可能是相关的:因为现在我已经设法做到了我想做的,我稍后会尝试研究它。然后贴出正确的答案,或者在这段时间内有人会找到它。谢谢你,伙计!嗨@AllaouaBenchikh,如果你试图使用PNG,为什么不在你的问题中写下它?如果你在提问时表现出你的努力,这总是很有帮助的!您可以尝试将其保存为*bmp。如果这不起作用,请仔细检查合并的通道是否正确,以便找到错误。你是怎么做到你想做的?如果这是你问题的解决方案(即使是一个坏的),请与我们分享,以帮助未来的读者。