[영상통신] Pixel 처리

Anna Shakhrai님의 사진

Bitwise Operation

문제 1 : Pixel Filling

RGB Lena24.bmp에서 (x, y) = (j, i) = (235, 254)의 한 개의 pixel을 white로 filling 한다.

 

정답 코드

#include <iostream>

// ...

int main(void)
{
	// ...

	for (int i = 0; i < Height; i++)
	{
		for (int j = 0; j < Width; j++)
		{
			if (i == 254 && j == 235)
			{
				*(RGBBuf + i * Width * 3 + 3 * (j)+0) = 255;
				*(RGBBuf + i * Width * 3 + 3 * (j)+1) = 255;
				*(RGBBuf + i * Width * 3 + 3 * (j)+2) = 255;
			}
		}
	}

	// ...
}

 

결과

좌 : 원본, 우 : filling Image

 

 

문제 2 : Region Filling

rectangle의 vertex 좌표 (100, 100), (300, 300)의 내부를 yellow로 filling 한다.

정답 코드

#include <iostream>

// ...

int main(void)
{
	// ...

	for (int i = 0; i < Height; i++)
	{
		for (int j = 0; j < Width; j++)
		{
			if (i >= 100 && i <= 300 && j >= 100 && j <= 300)
			{
				*(RGBBuf + i * Width * 3 + 3 * (j)+0) = 255;
				*(RGBBuf + i * Width * 3 + 3 * (j)+1) = 255;
				*(RGBBuf + i * Width * 3 + 3 * (j)+2) = 0;
			}
		}
	}
	// ...
}

 

결과

좌 : 원본, 우 : Region filling image

 

 

문제 3 : 이진화 (Binarization)

grayscale영상 Y의 이진화를 수행하시오.

 

정답 코드

#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) >= 128) ? 255 : 0;
		}
	}

	// ...
}

임계값을 128로 설정해 줬다.

 

정답 

 

 

문제 4 : RGB to YCbCr

RGB Lenna에서 아래 변환식을 이용하여 Cb, Cr 영상 2개를 얻는다

 

정답 코드

#include <iostream>

// ...

int main(void)
{
	// ...

	BYTE* Cb = new BYTE[Width * Height]; // Cb
	BYTE* Cr = new BYTE[Width * Height]; // Cr

	for (int i = 0; i < Height; i++)
	{
		for (int j = 0; j < Width; j++)
		{
			//// Cb, Cr 만들기
			BYTE r = *(RGBBuf + (i)*Width * 3 + 3 * (j) + 0);
			BYTE g = *(RGBBuf + (i)*Width * 3 + 3 * (j) + 1);
			BYTE b = *(RGBBuf + (i)*Width * 3 + 3 * (j) + 2);
			*(Cb + (i)*Width + j) = -0.16 * r + -0.33 * g + 0.5 * b + 128;
			*(Cr + (i)*Width + j) = 0.5 * r + -0.42 * g + -0.08 * b + 128;
		}
	}


	// ...
}

Cb, Cr은 GrayScale Image로 저장한다.

 

결과

좌 : Cb, 우 Cr

 

 

문제 5 : Brightness & Contrast 조절

Y의 밝기(brightness, b) 및 대조(contrast, a)를 변화시켜 보세요.  y = ax + b

예) a = 1.5, 0.7,... 및 b = 50, –50,...

정답 코드

#include <iostream>

// ...

int main(void)
{
	// ...

	for (int i = 0; i < Height; i++)
	{
		for (int j = 0; j < Width; j++)
		{
			double a = 1.5;
			double b = -50.0;
			int y = a * (*(YBuf + i * Width + j)) + b;
			if (y > 255) y = 255;
			if (y < 0) y = 0;
			*(YBuf + i * Width + j) = (BYTE)y;
		}
	}
    
	// ...
}

 

결과

a = 1.5, 1.0. 1.0, b = -50, 50, 0

 

 

문제 6 : Histogram

정답 코드

#include <iostream>

// ...

int main(void)
{
	// ...

	int histogram[256];
	for (int i = 0; i < 256; i++) // 초기화
		histogram[i] = 0;

	for (int i = 0; i < Height; i++)
	{
		for (int j = 0; j < Width; j++)
		{
			histogram[*(YBuf + i * Width + j)]++;
		}
	}
	int total = 0;
	for (int x = 0; x < 256; x++)
	{
		printf(" %d %d \n", x, histogram[x]);
		total += histogram[x];
	}
	printf(" Total : %d\n", total);
    
	// ...
}

 

결과

더보기

 0 0
 1 0
 2 0
 3 0
 4 0
 5 0
 6 0
 7 0
 8 0
 9 0
 10 0
 11 0
 12 0
 13 0
 14 0
 15 0
 16 0
 17 0
 18 0
 19 0
 20 0
 21 0
 22 0
 23 0
 24 0
 25 0
 26 0
 27 0
 28 0
 29 0
 30 0
 31 0
 32 0
 33 0
 34 0
 35 1
 36 0
 37 5
 38 10
 39 23
 40 37
 41 65
 42 84
 43 127
 44 181
 45 241
 46 304
 47 398
 48 520
 49 633
 50 822
 51 951
 52 1160
 53 1373
 54 1656
 55 1784
 56 1936
 57 2120
 58 2193
 59 2241
 60 2270
 61 2245
 62 2128
 63 2104
 64 1969
 65 1890
 66 1692
 67 1586
 68 1451
 69 1378
 70 1271
 71 1122
 72 1074
 73 990
 74 979
 75 950
 76 916
 77 872
 78 859
 79 864
 80 821
 81 922
 82 946
 83 1004
 84 944
 85 970
 86 983
 87 989
 88 1036
 89 990
 90 968
 91 971
 92 1076
 93 1080
 94 1124
 95 1080
 96 1218
 97 1270
 98 1266
 99 1396
 100 1484
 101 1633
 102 1763
 103 1941
 104 2058
 105 2135
 106 2195
 107 2101
 108 2010
 109 1988
 110 1938
 111 1871
 112 1699
 113 1539
 114 1517
 115 1576
 116 1456
 117 1611
 118 1538
 119 1519
 120 1566
 121 1625
 122 1620
 123 1731
 124 1744
 125 1877
 126 2034
 127 2091
 128 2381
 129 2459
 130 2418
 131 2530
 132 2681
 133 2528
 134 2560
 135 2334
 136 2313
 137 2226
 138 2283
 139 2227
 140 2410
 141 2548
 142 2618
 143 2745
 144 2814
 145 2797
 146 2816
 147 2681
 148 2750
 149 2734
 150 2880
 151 2947
 152 2941
 153 3093
 154 3152
 155 3045
 156 2877
 157 2803
 158 2561
 159 2376
 160 2272
 161 2199
 162 1930
 163 1675
 164 1580
 165 1468
 166 1483
 167 1482
 168 1471
 169 1433
 170 1465
 171 1384
 172 1362
 173 1307
 174 1205
 175 1013
 176 987
 177 882
 178 826
 179 858
 180 790
 181 742
 182 826
 183 864
 184 825
 185 845
 186 767
 187 799
 188 785
 189 768
 190 836
 191 869
 192 875
 193 889
 194 919
 195 1025
 196 1024
 197 1078
 198 1154
 199 1234
 200 1289
 201 1191
 202 1166
 203 1095
 204 1021
 205 994
 206 874
 207 807
 208 689
 209 627
 210 557
 211 526
 212 396
 213 323
 214 278
 215 206
 216 174
 217 171
 218 147
 219 104
 220 95
 221 66
 222 65
 223 51
 224 35
 225 32
 226 14
 227 7
 228 15
 229 3
 230 8
 231 1
 232 0
 233 1
 234 1
 235 0
 236 0
 237 1
 238 0
 239 0
 240 1
 241 0
 242 0
 243 0
 244 0
 245 0
 246 0
 247 0
 248 0
 249 0
 250 0
 251 0
 252 0
 253 0
 254 0
 255 0
 Total : 262144

 

 

문제 7 : Block 평균을 이용한 영상 Mosaic

1. grayscale Lenna를 NxN 블록으로 나누고 pixel을 해당 block의 평균값으로 채움

2. (c)는 block size가 32x32 임. (32x32) 개의 밝기값의 평균을 구한 다음에, 해당 픽셀들을 평균으로 대체한 것임

3. N값에 따라 code가 수정 없이 실행될 수 있도록, algorithm design 필요함

 

정답 코드

#include <iostream>

// ...

int main(void)
{
	// ...

	int N = 32;
	for (int i = 0; i < Height; i += N) 
	{
		for (int j = 0; j < Width; j += N) 
		{
			double avg = 0.0;
			double sum = 0.0;
			int pixelCount = 0;

			for (int y = i; y < i + N && y < Height; y++) 
			{
				for (int x = j; x < j + N && x < Width; x++)
				{
					sum += *(YBuf + y * Width + x); 
					pixelCount++;
				}
			}

			avg = sum / pixelCount;

		
			for (int y = i; y < i + N && y < Height; y++)
			{
				for (int x = j; x < j + N && x < Width; x++)
				{
					*(YBuf + y * Width + x) = (BYTE)((int)avg);
				}
			}
		}
	}

	// ...
}

 

결과

좌 N = 16, 우 N = 32

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

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