5.10. 비트 단위 연산¶
이전 페이지의 산술 연산은 픽셀 값, 즉 정수 밝기나 패킹된 색상 워드에 대해 동작합니다. 비트 단위 연산은 한 단계 더 낮은 수준에서, 그 값 내부의 개별 비트에 대해 동작합니다. 각 픽셀이 단 한 비트인 이진 이미지의 경우, 비트 단위 연산이 자연스러운 산술입니다.
5.10.1. 비트 단위 연산 계열¶
Image 클래스는 두 입력을 받는 비트 단위 연산의 전체 집합을 제공합니다:
b_and()– 비트 단위 AND.b_or()– 비트 단위 OR.b_xor()– 비트 단위 배타적 OR(XOR).b_nand()– NOT-AND.b_nor()– NOT-OR.b_xnor()– NOT-XOR.
각 연산은 두 이미지 버퍼의 모든 바이트에 대해 비트 단위로 동작합니다. 각 바이트가 여덟 개의 픽셀을 담는 이진 이미지에서는, 처리되는 바이트당 여덟 픽셀에 대해 연산이 실행됩니다. 그레이스케일이나 색상 이미지에서는 모든 채널의 모든 비트에 대해 실행됩니다.
상단: 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가 진정한 이진 이미지에서와 같은 조합을 줄 때 가장 유용합니다. 값의 전체 범위에 걸쳐 있는 이미지의 경우, 보통 이전 페이지의 산술 연산이 더 적합합니다.