使用OpenCV在JPG中对图像进行编码,避免重影效果

Encode image in JPG with OpenCV avoiding the ghost effect

本文关键字:编码 重影 OpenCV JPG 图像 使用      更新时间:2023-10-16

我有一个应用程序(openCV-C++),它可以从网络摄像头获取图像,用JPG编码,并将其从服务器传输到客户端。网络摄像头是立体声的,所以实际上我有两个图像,左和右。在客户端中,当我收到图像时,我会对其进行解码,并生成一个立体图3D效果。为此,我使用OpenCV。。。我用这种方式编码图像:

 params.push_back(CV_IMWRITE_JPEG_QUALITY);
 params.push_back(60); //image quality
 imshow(image); // here the anagliphic image is good!
 cv::imencode(".jpg", image, buffer, params);

并以这种方式解码:

 cv::Mat imageRecieved = cv::imdecode( cv::Mat(v), CV_LOAD_IMAGE_COLOR );

我看到的是,这种编码会在字形图像中产生"重影效果"(伪影?),因此对象的边缘会产生不良影响。例如,如果看一扇门,门的边缘会产生幻影效果。我确信这取决于编码,因为如果我在编码指令之前显示字形图像,效果会很好。我不能使用PNG,因为它生成的图像太大,这是服务器和客户端之间连接的问题。

我在寻找GIF,但如果我理解得很好,它不受cv::encode函数的支持。

因此,有另一种方法可以在JPG中编码cv:Mat obj,而不会产生这种不良影响,也不会增加图像的大小?

如果你的服务器只用作图像存储,你可以向服务器发送2个原始立体图像(压缩),并在需要时生成Anaglyph。我认为,如果你从服务器获取图像对(JPEG),然后生成Anaglogh(客户端),它将不会出现重影。可能是组合的压缩图像对小于字形.png

我假设浮雕编码是使用线交错将两侧组合成一个图像。

您正在使用JPEG压缩图像。该算法经过优化,可以压缩来自相机的"类似照片"的真实世界图像,并且在这些图像上效果非常好。

"类照片"和其他图像在图像压缩方面的区别在于图像中出现的频率
粗略地说,在"类照片"图像中,高频部分相对较小,并且大多对图像内容不重要
所以高频可以被安全地压缩。

如果两个帧逐行交错,这将创建具有非常强的高频部分的图像。

JPEG算法丢弃了大部分不重要的信息,但因为它实际上很重要,这会导致相对较强的伪影。

JPEG基本上就是对这类图像"不起作用"。

如果您可以将anaqlyph图像的编码更改为并排,或者将完整图像左右交替,JPEG压缩应该可以正常工作。

这是你的选择吗?

如果没有,事情会变得更加复杂。如果你需要良好的压缩,一个问题是,那些非常适合压缩高频图像的算法在压缩"类照片"数据方面真的很糟糕,而这些数据仍然是你图像的大部分。

因此,请非常努力地将编码更改为非行交错,这应该比其他选项容易一个数量级左右。