2010-06-23 3 views
1

Matlab에서 이진 이미지가 있고 C 프로그램에서 이진 배열 (0과 1)이 필요합니다. 어떻게 가져올 수 있습니까?matlab에서 "C"프로그램으로 이진 이미지 가져 오기

Matlab의 이진 이미지를 ".mat"로 저장할 수 있지만 C로 매트 파일을 읽는 방법을 모르겠습니다. 또한 Matlab의 이진 이미지를 ".bin"파일로 저장할 수 있다고 생각했습니다. "C"에서 읽을 수 있지만 다시 ".bin"로 matlab에 이미지를 저장하는 방법을 모르겠다.

도움을 주시면 감사하겠습니다.

답변

3

.

img=rand(10)>.5; %# an array from @Amro's answer 
fid = fopen('test.bin','w'); 
fwrite(fid,img,'int8') 
fclose(fid); 

그렇다면 문제없이 C로 읽을 수 있다고 생각합니다. MATLAB은 행이 아닌 열에 의한 데이터 쓰기를 기억합니다. 첫 번째 열, 두 번째 열 등입니다.당신이 행으로 C에서 그것을 읽고 싶다면, 바로 쓰기 전에 배열을 바꾸어 : (윈도우 같은) 일부 플랫폼에서

fwrite(fid,img','int8') %# notice ' symbol after img 
2

먼저 검색 엔진을 사용하여 그물을 확인하십시오. 처음에 검색 할 곳은 물론 Mathworks입니다. this과 같은 문서를 찾을 수 있습니다. 두 번째 단계는 처음부터 변환기를 작성하는 것이 복잡해 보이기 때문에 필요가 이미 다른 사람이 필요하면 검색하는 것입니다. this과 같은 링크가 유용 할 수 있지만 MATLAB 자체의 요구 사항이 있습니다 (라이브러리 중 하나 인 MAT 파일 인터페이스 라이브러리와 연결). 그러나 나는 그것이 더 간단한 일이라고 믿습니다.

다음 간단한 해결책은 을 읽을 수있는 형식으로 this을 사용하는 것입니다. 입력 배열이 클래스 논리 인 경우 imwrite는 데이터가 이진 이미지라고 가정하고 비트 심도가 형식이 허용하는 경우 1. BMP, PNG 또는 TIFF 형식은 바이너리 이미지를 입력 배열로 허용합니다.

BMP 이미지는 맞춤 루틴으로 처리하기 어렵지 않습니다. PNG 이미지의 경우 png 라이브러리를 사용할 수 있으며 TIFF의 경우 기억이 나지 않지만 다른 옵션을 검색하거나 선택할 수 있습니다.

Here 다른 방법으로 데이터를 저장하는 방법을 설명합니다. 일반 ascii 파일은 사용자 정의 C 루틴에 의해 구문 분석되기 쉽습니다.

2
>> img=rand(10)>.5 
img = 
    1  0  1  1  0  0  1  1  0  0 
    1  1  0  0  0  1  0  0  1  0 
    0  1  1  0  1  1  1  1  1  1 
    1  0  1  0  1  0  1  0  1  1 
    1  1  1  0  0  0  1  1  1  1 
    0  0  1  1  0  0  1  0  0  0 
    0  0  1  1  0  1  1  0  1  1 
    1  1  0  0  1  0  0  0  1  0 
    1  1  1  1  1  1  0  1  0  0 
    1  1  0  0  1  0  0  0  1  0 

>> dlmwrite('file.dat', img, 'delimiter',' ') 
0

당신이 matlab에에서 배열 데이터를 내보내고 C 프로그램으로 가져올 필요가 있다면, 쉬운 하나의 옵션 (배열을 가정하는 것은 거대한되지 않습니다)는 중간에서와 같이 일반 텍스트 파일을 사용하는 것입니다. Matlab에서 배열을 쉼표로 구분 된 각 요소가있는 텍스트 파일에 문자열로 작성하십시오 (예 : 1,0,0,1,0,1,1,etc). 이것을 일반 ASCII 텍스트 파일로 저장하십시오. 이제 fopen으로 C로 파일을 열고 한 번에 한 문자 씩 fgetc으로 읽고 배열을 재구성 할 수 있습니다.

예를 들어, C 부분과 같습니다 또한 텍스트 다음 두 배 정도 작아집니다 바이너리 파일에 데이터를 기록 할 수

FILE* fp; 
char inp[3]; 
int array[PLENTY_OF_ROOM], index=0; 
fp = fopen("exported_data.txt", "r"); 
while (fgets(inp, 3, fp) != NULL) { 
    if ((inp[0] == '0' || inp[0] == '1') && inp[1] == ',') 
     array[index++] = inp[0] - '0'; 
    else { 
     fprintf(stderr, "Error: bad format\n"); 
     exit(1); 
    } 
} 
+0

게시 한 코드는 행 벡터에 사용할 수 있지만 2 차원 행렬에 맞게 조정할 수 있어야합니다. 행 사이에 나타날 줄 바꿈 문자를 감지하고 처리하기 위해). – bta

0

파일을 열 때, 그렇지 않으면/기록 된 바이트 수 읽기 "이진"지정해야 특수 문자로 해석되고 예상대로 파일에 읽거나 쓰지 못할 수 있습니다.

FILE* fin,fout; 
... 
fin = fopen("file1.bin", "rb"); // the 'b' indicates "binary" 
fout = fopen("file1.bin", "wb"); // the 'b' indicates "binary" 
관련 문제