5.10. 비트 단위 연산

이전 페이지의 산술 연산은 픽셀 , 즉 정수 밝기나 패킹된 색상 워드에 대해 동작합니다. 비트 단위 연산은 한 단계 더 낮은 수준에서, 그 값 내부의 개별 비트에 대해 동작합니다. 각 픽셀이 단 한 비트인 이진 이미지의 경우, 비트 단위 연산이 자연스러운 산술입니다.

5.10.1. 비트 단위 연산 계열

Image 클래스는 두 입력을 받는 비트 단위 연산의 전체 집합을 제공합니다:

각 연산은 두 이미지 버퍼의 모든 바이트에 대해 비트 단위로 동작합니다. 각 바이트가 여덟 개의 픽셀을 담는 이진 이미지에서는, 처리되는 바이트당 여덟 픽셀에 대해 연산이 실행됩니다. 그레이스케일이나 색상 이미지에서는 모든 채널의 모든 비트에 대해 실행됩니다.

AND, OR, XOR 연산에 대한 세 개의 진리표가 나란히 있습니다. 각 진리표에는 입력 조합 0-0, 0-1, 1-0, 1-1에 대한 네 개의 행과 A, B, 결과로 표시된 열이 있습니다. 진리표 아래에는 두 개의 작은 이진 이미지 A와 B가 검은색과 흰색 셀의 격자로 그려져 있으며, 그것들을 AND한 결과가 오른쪽에 두 입력 모두에서 흰색이었던 셀만 남긴 격자로 표시되어 있습니다.

상단: AND, OR, XOR 진리표 – 각 연산의 비트 수준 의미. 하단: 두 이진 이미지 A와 B, 그리고 A.b_and(B) 의 결과로, 결과는 두 입력 모두에서 켜져 있던 위치만 남깁니다.

5.10.2. 마스크 결합

이 연산들의 가장 흔한 단일 용도는 마스크 결합입니다. 마스크는 위치별로 어떤 조건이 충족되는지를 나타내는 이진 이미지입니다. 서로 다른 조건을 기술하는 두 마스크는 비트 단위 연산 중 하나를 통해 복합 조건을 기술하는 단일 마스크로 결합됩니다:

b_and() 입력 마스크 모두 그 위치에서 켜져 있었을 때만 켜지는 위치를 갖는 마스크를 만듭니다. 즉 두 조건의 자연스러운 “and”입니다. 전경 마스크를 임계값 처리 단계의 출력과 b_and 로 결합하면 임계값의 매칭이 전경으로 제한됩니다.

b_or()어느 한쪽 입력 마스크라도 켜져 있을 때마다 켜지는 위치를 갖는 마스크를 만듭니다. 즉 자연스러운 “or”입니다. 임계값 처리된 두 출력을 OR로 합치면 두 색상 범위 중 어느 하나에라도 일치한 모든 것을 포괄하는 단일 마스크가 만들어집니다.

b_xor()정확히 한쪽 입력 마스크만 켜져 있을 때마다 켜지는 위치를 갖는 마스크를 만듭니다. 두 마스크가 일치하지 않는 위치를 검출하는 데 유용합니다. 즉 임계값 출력이 두 프레임 사이에서 변한 위치, 두 참조 마스크 간의 대칭 차이 같은 것들입니다.

부정형 변형 – b_nand(), b_nor(), b_xnor() – 은 부정되지 않은 대응 연산의 보완을 만듭니다. 조건을 기술하는 자연스러운 방식이 “이 둘 중 어느 것도 아닌” 또는 “둘 다는 아닌”일 때 유용합니다. 흔하지는 않지만, AND 뒤에 별도의 invert() 를 이어 붙여 부정을 구성하지 않아도 되도록 이러한 것이 존재한다는 점을 알아 둘 만합니다.

5.10.3. 이진이 아닌 이미지에서의 비트 단위 연산

비트 단위 연산은 그레이스케일과 색상 이미지에서도 실행됩니다. 이미지가 이진과 유사한 내용을 담고 있을 때, 즉 픽셀이 모두 0 또는 255 인 그레이스케일 프레임이나 완전한 검은색과 완전한 흰색 픽셀만 있는 RGB565 프레임처럼, AND, OR, XOR가 진정한 이진 이미지에서와 같은 조합을 줄 때 가장 유용합니다. 값의 전체 범위에 걸쳐 있는 이미지의 경우, 보통 이전 페이지의 산술 연산이 더 적합합니다.