2017-05-16 18 views
1

난 이진 이미지 (JPG 이미지를 opencv를 사용하여 바이너리베이스로 변환) 압축 산술 코드 알고리즘을 구현하려고합니다. 문제는 압축 된 파일, 인코딩 된 문자열 및이 인코딩 된 문자열과 해당 빈도를 생성하는 데 사용 된 기호를 저장해야하므로 디코딩 할 수 있습니다. 심볼을 아스키로 변환하는 경우에도 심볼은 많은 공간을 차지합니다. 각 심볼에 대해 적은 수의 문자를 사용하려고하면 인코딩 된 문자열의 크기가 커집니다. 그래서 가능한 최소 크기로 압축 파일에 심볼을 저장하는 효율적인 방법이 있는지 궁금합니다. 원본 파일에서 심볼을 선택하는 가장 효율적인 방법을 알고 싶습니다. 미리 감사드립니다.효과적인 방법으로 기호를 선택, 산술 코드 알고리즘, C++

+0

"많은 공간"이란 무엇입니까? 즉 압축 전의 이미지 크기, 압축 후의 이미지 크기, 심볼의 크기, 주파수의 크기 등의 예를들 수 있습니까? –

+0

당신을위한 상징이란 무엇입니까? 얼마나 많은 비트가 있습니까? –

+0

325,592,005 바이트의 바이너리 이미지를 가지고 있는데, 각각의 심볼에 대해 64 비트 크기를 압축하려고 할 때, 바이너리베이스로 인코딩 한 다음 인코딩 된 문자열과 심볼을 ASCII로 변환합니다. 인코딩 된 문자열의 크기는 2.8MB이고 심볼 자체의 크기는 6.1MB –

답변

0

325,592,005 바이트는 310 메가 바이트입니다. 이 이미지를 2.8 + 6.1 = 8.9 메가 바이트로 압축하여 크기를 97 % 줄였습니다. 그것은 좋은 결과이고 나는 여기서 걱정하지 않을 것입니다. 6.1 메가 바이트의 64 비트 길이 기호 외에 약 800K의 기호가 있음을 의미합니다. 이는 가능한 최대 심볼, 즉 2^64-1보다 훨씬 적습니다. 이는 다시 좋은 결과입니다.

여러 압축 알고리즘 사용에 관한 질문 사항. 첫째, 느슨한 압축의 경우 심볼 당 최적 비트 수는 엔트로피와 동일하다는 것을 알아야합니다. 그리고 산술 인코딩은 최적이 될 것입니다 (this, this 또는 this 참조). 하나가 산술 인코딩 인 경우, 하나 이상의 알고리즘을 하나씩 사용하는 것은별로 의미가 없다는 것을 의미합니다.

산술 코딩 vs 허프만 코드에 관해서. 후자는 사실 전자의 특별한 경우입니다. 그리고 내가 아는 한 산술 인코딩은 적어도 허프만 코드만큼 좋습니다.

또 하나의 가치가 있습니다. 손실 압축을 고려할 수 있다면 실제로 압축률에는 제한이 없습니다. 즉, 품질 손실이 여전히 허용되는 한 원하는만큼 데이터를 압축 할 수 있습니다. 그러나이 경우에도 여러 압축 알고리즘을 사용하지 않아도됩니다. 그 중 하나가 충분합니다.