[영상통신] Bitwise Operation

Bitwise Operation

문제1 : bitwise and, or, xor, not

정답 코드

#include <iostream>

// ...

int main(void)
{
	// ...

	int x = 10;
	int y = 200;
	int z;
	z = x & y;
	z = x | y;
	z = x ^ y;
	z = ~x;
	printf("%d \n", z); printf("%02X,\n", z);

	// ...
}

 

 

문제 2 : XOR를 이용하는 두 개의 변수 (a,b) → (b,a) swapping

정답 코드

#include <iostream>

// ...

int main(void)
{
	// ...

	int a = 10;
	int b = 200;
	printf("%d %d\n", a, b);
	a = a ^ b; b = a ^ b; a = a ^ b;
	printf("%d %d\n", a, b);

	// ...
}

결과

 

문제 3 : bitwise &를 이용하는 image masking : grayscale Lenna

x & 0xF0 >> pixel의 4개의 LSB bit를 0으로 한다.

x & ? >> pixel의 4개의 MSB bit를 0으로 한다.

정답 

?는 0x0F

 

 

문제 4 : ~x을 이용한 Inverse image 만들기 : grayscale Lenna

정답 코드

#include <iostream>

// ...

int main(void)
{
	// ...
	
    	for (int i = 0; i < Height; i++) {
		for (int j = 0; j < Width; j++) {
			*(YBuf + i * Width + j) = ~*(YBuf + i * Width + j);
		}
	}
	
	// ...
}

 

결과

좌 : GrayScale, 우 : Inverse Image

 

 

문제 5 : bitshift로 image의 brightness 조절 : grayscale Lenna

1. X >> 1 (우측으로 1bit씩 이동) : pixel값이 2배 어두어짐

2. X << 1 (좌측으로 1bit씩 이동) : pixel 값이 2배 밝아짐

int output_1D[16] = {0, };

3. NNI. 좌표값은 반올림해 역방향 사상으로 각 출력 배열의 원소를 채운다. (overflow 처리 필요함)

 

정답 코드

#include <iostream>

// ...

int main(void)
{
	// ...

	for (int i = 0; i < Height; i++) {
		for (int j = 0; j < Width; j++) {
			BYTE xb = *(YBuf + i * Width + j);
			// int yy = xb << 1;
			int yy = xb >> 1;
			if (yy > 255) yy = 255;
			if (yy < 0) yy = 0;
			*(YBuf + i * Width + j) = yy;
		}
	}
    
	// ...
}

결과

원본 / 밝기 2배 / 밝기 2배 어둡게

 

 

문제 6 : XOR을 이용하여 image에서 특정 값을 가지는 pixel을 0으로 함

1. 두 개의 값이 같으면, XOR 는 0이 되는 특성을 활용

2. Grayscale Lenna에서 특정값 key를 가지는 pixel을 찾아서 black으로 filling한다.

3.  key=123이면 pixel 값에 (x^key)을 적용하면, 123을 가지는 pixel은 0으로 된다.

 

정답 코드

#include <iostream>

// ...

int main(void)
{
	// ...

	for (int i = 0; i < Height; i++) {
		for (int j = 0; j < Width; j++) {
			BYTE x = *(YBuf + i * Width + j);
			BYTE key = 123;
			if ((x ^ key) == 0x00)
			{
				*(YBuf + i * Width + j) = (BYTE)0x00;
			}
		}
	}

	// ...
}

 

결과

 

 

문제 7 : XOR을 이용하는 Image 암호화 : grayscale Lenna 이용

1. 암호화(encryption) : 입력 image → key로 XOR 적용 → 출력영상 ⓵

2. 복호화(decryption) : 출력영상 ⓵ → key로 XOR 적용 → 출력영상 ⓶ (=입력 image)

 

정답 코드

#include <iostream>

// ...

int main(void)
{
	// ...

	memcpy(Out, YBuf, Width * Height * 3);

	char key = 0x2F;
	for (int i = 0; i < Height; i++) {
		for (int j = 0; j < Width; j++) {
			*(Out + i * Width + j) = *(YBuf + i * Width + j) ^ key;
			*(YBuf + i * Width + j) =  *(Out + i * Width + j) ^ key;
		}
	}

	// ...
}

 

결과

암호화된 이미지 ⓵ : Out

 

 

문제 8 : Hamming Distance

두 데이터 A, B 의 Hamming Distance(HD)는 xor에서 set bit=1의 개수임.

정답 코드

#include <iostream>

// ...

int main(void)
{
	// ...

	int x = 64;
	int y = 5;
	int z = x ^ y;
	int HD = 0;
	while (z > 0)
	{
		HD += z & 0x1;
		z >>= 1;
	}
	
	printf(" HD : %d \n", HD);

	// ...
}

결과

 

 

문제 9 : byte append 하여 bitstream 만들기

a = [FF F2 A3], b = [F2 2F] 일 때, c = [a, b] = [FF F2 A3 F2 2F]을 만든다.

 

정답 코드

#include <iostream>

// ...

int main(void)
{
	// ...

	BYTE a[] = { 0xFF, 0xF2, 0xA3 };
	BYTE b[] = { 0xF2, 0xF2 };

	int aL = sizeof(a) / sizeof(a[0]);
	int bL = sizeof(b) / sizeof(b[0]);

	int totalLength = aL + bL;
	BYTE* result = (BYTE*)malloc(totalLength);
	memset(result, 0x00, totalLength);
	memcpy(result, a, aL);
	memcpy(result + aL, b, bL);

	for (int i = 0; i < totalLength; i++)
		printf(" %02X ", result[i]);

	printf("\n");
	free(result);
    
	// ...
}

결과

 

 

 

 

 

'공부 > 영상통신' 카테고리의 다른 글

[영상통신] 압축 기술  (0) 2024.12.15
[영상통신] 영역처리  (0) 2024.12.15
[영상통신] Pixel 처리  (0) 2024.12.15