2011-07-31 20 views
1

我一直在阅读Image Compression (Lossy and Non-lossy)的网页。关于图像压缩算法的困惑

现在,这是我的问题,我成功地使用opencv制作人脸检测项目 - 但是 - 我的项目指南不满意 - 我的项目只是捕获捕捉设备[网络摄像头]中的帧,并将帧函数来检测这些帧中的脸部并在Windows中输出检测帧。

我的项目指南要我实现一些算法无论是图像压缩或变形等,但不开心的看到图书馆等大量使用 -

所以我想知道是什么 - 这可能使用C或C++编码 - 图像压缩算法?如果是,代码大小不会很大? (我的项目应该是一个小的)

请帮助我,假设我想使用RLE压缩使用C++我应该怎么做呢?

+2

“是否有可能使用C或C++ - 图像压缩算法的代码”。恩,是的。你认为图像压缩库是用什么编写的> – Lagerbaer

+0

需要了解多少文件格式如BMP,JPG等 – Tempo

回答

2

你想发明自己的图像压缩或实现其中一个标准的? (我认为这是某种类/作业,你不会在现实世界中做到这一点!)

你可以使用像运行长度一样的东西压缩一些简单的图像,特别是如果你可以减少颜色数量即。一个卡通或图形,但对于一个真正的照片风格的图像,它不会工作 - 这就是为什么像jpeg或小波这样复杂的有损技术被发明的原因。

+0

需要了解多少文件格式,如BMP,JPG等 - – Tempo

+0

BMP是微不足道的, JPEG非常复杂 - 如果您知道FFT的数学运算,但理论相对简单但格式复杂 –

1

这是非常有可能的,而且RLE压缩很容易。如果你想看看RLE的一个相对直接的方法,它不会使用大量的代码,那么请考虑实现packbits的一个版本。

这里还有一个链接,以及:http://michael.dipperstein.com/rle/index.html(包括与源代码为传统的RLE和PACKBITS实现)

顺便说一句,请记住,你可以,有噪声的数据,实际上结束数据比使用RLE方案的未压缩。对于大多数“真实世界”的图像,尽管采用了某种形式的低通滤波和相对较好的信噪比(即40db以上),但您应该预期大约1.5:1至1.7:1的压缩比。

无损压缩的另一种选择是huffman编码...该算法更容忍噪声图像,因为它通常可以防止使用RLE压缩算法编码时可能出现的这些类型图像的数据扩展。

最后,你没有提到你是使用彩色还是灰度图像......如果它是彩色图像,请记住,如果在平面彩色图像中压缩每个颜色通道,通道图像,而不是尝试压缩连续的RGB数据。

0

你想基于与空间填充曲线或空间索引色彩还原实行压缩。 A si将二维复杂度降低到一维复杂度,它看起来像四叉树,有点像分形。你想寻找尼克的希尔伯特曲线四叉树空间索引博客!

这里是另一个有趣RLE编码的想法:Lossless hierarchical run length encoding。也许这是给你的东西?

0

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; 
}; 

编码愉快!