2009-08-21 8 views
1

난에서 다음 함수 C를 찾기 위해 시도하고 CImg승산 C++에서 CIMG과 추가 화상

C = B * 리터 + (1-B)를 (S) C, L 및 S는 모두

같은 크기의 RGB 이미지 (B는 단일 채널 그레이 스케일 매트)

픽셀을 반복하는 방법을 알아낼 수 없습니다. 나는 다음과 같은 코드를 보았다 :

cimg_forXYZ(S,x,y,z) {... } 

그러나 내가 전에는 어떤 종류의 구문을 본 적이 없다. 매크로 일 수 있는가?

모든 의견을 환영합니다.

#define cimg_forXY(img,x,y)  cimg_forY(img,y) cimg_forX(img,x) 
#define cimg_forX(img,x)   for (int x=0; x<(int)((img).width); ++x) 
#define cimg_forY(img,y)   for (int y=0; y<(int)((img).height); ++y) 
#define cimg_forZ(img,z)   for (int z=0; z<(int)((img).depth); ++z) 
#define cimg_forXYZ(img,x,y,z) cimg_forZ(img,z) cimg_forXY(img,x,y) 

다음 루프있을 것이라는 점을 의미합니다 : 당신은 CIMG 헤더에 보면

답변

4

, 당신은 아래로 썽크 매크로는, 그 코드가 사실이라고 볼 수

for (int z=0; z<(int)((img).depth); ++z) 
    for (int y=0; y<(int)((img).height); ++y) 
     for (int x=0; x<(int)((img).width); ++x) { 

} 

당신이

cimg_library::CImg<float> image; 
//assign, etc 
float* ptr = image->ptr(); 
cimg_forXYZ(S, x, y, z){ 
    *ptr = *ptr + 10; 
    ++ptr; 
} 
,369처럼 단계별로 그래서, 지금, 당신이 아마하고 싶은 참조 x, y 및 z 좌표, 또는 더 나은, 데이터에 대한 포인터 중 하나입니다

CImg 헤더를 읽는 것이 좋습니다. 꽤 우아합니다. '무료로'많은 기능을 사용할 수 있습니다.

+0

감사합니다. 몇 가지 사항이 정리되었습니다. 여전히 잘못된/일관성없는 결과를 얻는 것 같습니다. 아마도 다른 질문을 게시해야합니다. – zenna

+0

비트 심도 문제로 인해 결과가 잘못되거나 일관되지 않을 수 있습니다. 예를 들어, float 이미지 이외의 다른 것들을 사용하면 그 곱셈은 쉽게 이상하고 나쁜 것을 할 수 있습니다 (예 :주의하지 않으면 바이트 이미지가 쉽게 오버 플로우됩니다). – mmr