2014-08-27 6 views
1

플로트 행렬이 1024x1024이고 파일 내부에이 행렬의 부호를 유지하려고합니다. 이를 위해 부호 행렬을 Matrix of boolean으로 유지하고 싶습니다. 플로트가 4 바이트 인 내 매트릭스 크기는 크기가 4MB 이상인 부울은 1 비트이고, 행렬 크기가 10^20(1M) 때문에디스크에 OpenCV 부울 행렬을 저장하십시오.

2.312, 0.232, -2,132 
5.754, -4,34, -3.23 
-4.34, -1.23, 7.9453 

내 출력

1,1,0 
1,0,0 
0,0,1 

같아야

내 행렬이고, 가정 1M, 나는 bool mat이 일 것이라고 예상하지만 opencvthreshold 메서드를 사용하면 출력 파일이 1MB입니다. 이는 파일이 uchar (8 비트)로 저장됨을 의미합니다.

imwrite를 사용하려고했지만 작동하지 않았습니다.

편집 : 나는 스피드가 내 테스트를위한 또 다른 중요한 요인이라는 것을 깨달았다. 디스크에서 약 1 천만 개의 1K * 1K 행렬을로드 중입니다. 당신이

Mat input; 
Mat A = (input >= 0); 

을 작성할 수 있습니다 OpenCV의 사전

답변

1

에서

덕분에 이제 문제는 OpenCV의 더 비트 맵 데이터 유형이 없다는 것입니다. 따라서 얻을 수있는 최선의 방법은 Mat1u (unsigned char)입니다.

저장 용량을 절약하려면 직접해야합니다. 예를 들어, libpng을 사용하여 비트 깊이 1의 PNG 파일을 작성할 수 있습니다. 불행히도 imwrite은 비트 심도 설정을 지원하지 않습니다 (비트 심도 8 및 16의 PNG를 작성할 수 있음). 당신이 비트 깊이 8 압축 PNG를 작성하려면

, 당신은 imwrite를 사용할 수 있습니다

std::vector<int> flags; 
flags.push_back(CV_IMWRITE_PNG_COMPRESSION); 
flags.push_back(9); // [0-9] 9 being max compression, default is 3 
cv::imwrite("output.png", A, flags); 

이 최고의 압축 노력에 발생합니다. 지금 당신은 비트 깊이 1 저장된 동일한 이미지에 대해 파일 크기를 비교하는 Imagemagick를 사용할 수 있습니다

나는 임의의 예제 이미지 테스트
convert output.png -type Bilevel -define "png:bit-depth=1" -define "png:compression-level=9" output-1b.png 

(아래 참조).

  • 8 비트 압축 PNG : 24,732 바이트
  • 1 비트 압축 PNG : 20,529 바이트
  • 8 비트 압축 PGM : 270,015 바이트
  • 1 비트 압축 PBM : 34,211 바이트

보시다시피, 압축 된 8 비트 저장소는 압축되지 않은 1 비트 저장소보다이 예에서 여전히 좋습니다.

Example bitmap

+0

> = 0은 255 개의 항목을 제공합니다. A = (input> = 0)/255;' – Micka

+0

이 도구를 사용하는 방법에 대해 좀 더 설명해 주시겠습니까?또한 'sign mat'을 8 비트로 변환하면 'imwrite'가 내 데이터를 압축하므로 매우 효율적이지 않습니까? 매트릭스에 가능한 한 작게 유지하고 싶지만 RAM에서는 8 비트로 유지하는 것이 좋습니다. – smttsp

+0

수정 된 답변보기 일반적으로 올바른 압축 매개 변수를 사용하면 8 비트로 충분히 만족할 수 있습니다. – ypnos

관련 문제