OpenCV:imwrite在保存时更改通道像素值
OpenCV : imwrite changes the channels pixels values when saving
我正在读取一张图像,并在不更改红色和绿色通道的情况下对蓝色通道进行一些处理。
当我处理完蓝色通道后,我将三个通道合并为一个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是一种有损格式:https://en.wikipedia.org/wiki/JPEG
JPEG(/JAY-peg)1是一种常用的有损压缩方法数字图像的压缩,特别是那些生成的图像通过数码摄影。压缩程度可以调节,从而允许在存储大小和图像质量之间进行可选择的折衷。JPEG通常实现10:1的压缩,几乎没有明显的损失在图像质量方面。
解决方案:使用像PNG这样的lossles格式来保存您的图像。
相关文章:
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 如何在24位SDL_Surface上设置像素的颜色
- 如何从SDL_Surface获取特定像素的颜色
- 如何将CMSampleBufferRef/CIImage/UIImage转换为像素,例如uint8_t[]
- 在C++中查找像素 RGB 数据的最快方法是什么?
- 是否可以从 OpenGL 缓冲区获取原始大小的像素?
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- 如何使用 sdl2 快速绘制像素网格?
- 如何在C++中进行像素操作? - Linux
- 他们如何将红外锁定像素转换为镜头前方 1m 的正常平面上的位置
- 访问随机图像像素的快速方法,最多一次
- OpenCV 像素访问点与 at() - 不同的值
- 将每个通道像素乘以给定的向量
- 根据OPENCV中一个通道中的一个值,查找最大颜色像素
- OpenCV:imwrite在保存时更改通道像素值
- 从像素值获得RGB通道没有任何库
- OpenCV从Mat图像中获取像素通道值
- 从Qt中的每个像素读取Alpha通道
- 使用OpenCV多通道Mat沿着通道方向访问像素