【问题标题】:OpenCV : imwrite changes the channels pixels values when savingOpenCV:imwrite 保存时更改通道像素值
【发布时间】:2016-04-15 13:32:04
【问题描述】:

我正在读取图像并在蓝色通道上进行一些处理,而不更改红色或绿色通道。

当我完成蓝色通道的处理后,我将三个通道合并为一个 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;

有没有办法避免这种行为?

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    JPG 是有损格式:https://en.wikipedia.org/wiki/JPEG

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

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

    【讨论】:

    • 这是我尝试的第一件事,但还是一样。
    • 我认为问题不在于有损压缩。我尝试在 Matlab 上做同样的事情,当我保存图像时,我可以看到我在一个通道上所做的任何更改,其他的都不会受到影响。另外,我刚刚发现这篇文章,我认为它可能是相关的:stackoverflow.com/questions/29815299/… 现在我已经设法做我想做的事,我稍后会尝试调查它。并发布正确的答案,或者在此期间有人会找到它。谢谢你!
    • 嗨@AllaouaBenchikh,如果您尝试使用PNG,为什么不在您的问题中写下它?如果您在提问时展示您尝试过的内容,这总是有帮助的!您可以尝试将其保存为 *bmp。如果这不起作用,请仔细检查合并的通道是否正确,以便我们可以找到错误。你是如何做到你想做的事的?如果它是您问题的解决方案(即使它是一个糟糕的解决方案),请与我们分享以帮助未来的读者。
    猜你喜欢
    • 2021-04-10
    • 2015-05-20
    • 2021-11-05
    • 2014-01-19
    • 2013-04-18
    • 2021-02-15
    • 2017-06-28
    • 2019-07-05
    • 1970-01-01
    相关资源
    最近更新 更多