RLE是去这里最好的方式。即使是“最简单”的压缩算法也不是微不足道的,并且需要对颜色空间变换,离散正弦/余弦变换,熵等有深入的了解。
回到RLE ...通过像素循环使用像这样的东西:
cv::Mat img = cv::imread("lenna.png");
for(int i=0; i < img.rows; i++)
for(int j=0; i < img.cols; j++)
// You can now access the pixel value with cv::Vec3b
std::cout << img.at<cv::Vec3b>(i,j)[0] << " " << img.at<cv::Vec3b>(i,j)[1] << " " << img.at<cv::Vec3b>(i,j)[2] << std::endl;
计数相似的像素的数量在一排,并将它们存储在任何数据结构(可能是< #Occurences, Vec3b >
元组中一个vector
?)。一旦你有了最终的vector
,不要忘记在上面提到的vector
(也许在一个简单的compressedImage
结构中)存储图像的大小,并且你只是压缩了一个图像。要将它存储在一个文件中,我建议你使用boost::serialize
或类似的东西。
您的最终结构可能看起来类似于:
struct compressedImage {
int height;
int width;
vector< pair<int, Vec3b> > data;
};
编码愉快!
“是否有可能使用C或C++ - 图像压缩算法的代码”。恩,是的。你认为图像压缩库是用什么编写的> – Lagerbaer
需要了解多少文件格式如BMP,JPG等 – Tempo