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;
}
}
}
// ...
}
결과
문제 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;
}
}
}
// ...
}
결과
문제 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로 저장한다.
결과
문제 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;
}
}
// ...
}
결과
문제 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);
}
}
}
}
// ...
}
결과
'공부 > 영상통신' 카테고리의 다른 글
[영상통신] Bitwise Operation (0) | 2024.12.15 |
---|---|
[영상통신] 압축 기술 (0) | 2024.12.15 |
[영상통신] 영역처리 (0) | 2024.12.15 |