本次作業我只做了hsi色彩模型的部份,通過公式可計算出不同角度以及半徑所呈現的顏色,角度部分的計算我是用了內建的atan2()函數實現,這次作業實作時沒有任何問題,但對於成品而言似乎出現瑕疵,照理說零度角應該是紅色,可是我的零度角卻是藍色,最後才發現原來C#實際上也是BGR,而非RGB,因此重新修正後便完成色彩模型。如下圖:
2013年1月17日 星期四
2013年1月12日 星期六
98360915 資工四甲 周立祥
本次作業著重於分析jpeg影像的header,但可惜的是,由於忘記該如何利用各張table來decode存放在scan header後方的data,因此本次作業範圍缺失了decode這部分。
另外,由於目前使用之作業系統已無windows,因此這次作業是單純使用C++撰寫完成,首先先看這次的開發過程,如下圖:
另外,由於目前使用之作業系統已無windows,因此這次作業是單純使用C++撰寫完成,首先先看這次的開發過程,如下圖:
圖一
以下是成品之執行狀態,如下圖:
圖二
由圖一可了解到huffman tree每個節點的結構以及各個資料的存放陣列,而接下來先展示分析老師課堂教學圖片(Rex.jpg)之資訊,如下:
圖三
start: ffd8
marker: ffe0 length: 010
Application Segments
marker: ffe1 length: ee1
Application Segments
marker: ffed length: 139a
Application Segments
marker: ffe1 length: 1248
Application Segments
marker: ffee length: 0e
Application Segments
marker: ffdb length: 084
Quantization Table:
element precision: 0
destination id: 0
elements: 2 2 2 2 2 2 2 2 2 2 3 2 2 2 3 4 3 2 2 3 4 5 4 4 4 4 4 5 6 5 5 5 5 5 5 6 6 7 7 8 7 7 6 9 9 10 10 9 9 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
Quantization Table:
element precision: 0
destination id: 1
elements: 3 3 3 5 4 5 9 6 6 9 13 10 9 10 13 15 14 14 14 14 15 15 12 12 12 12 12 15 15 12 12 12 12 12 12 15 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
marker: ffc0 length: 011
Frame Header:
type: Baseline DCT
sample precision: 8 bits
height: 120 pixels
width: 120 pixels
image components: 3
-The 1 Component:
component id: 1
horizontal sampling factor: 1
vertical sampling factor: 1
quantization table: 0
-The 2 Component:
component id: 2
horizontal sampling factor: 1
vertical sampling factor: 1
quantization table: 1
-The 3 Component:
component id: 3
horizontal sampling factor: 1
vertical sampling factor: 1
quantization table: 1
marker: ffdd length: 04
Restart Interval:
MCU restart interval: f
marker: ffc4 length: 1a2
Huffman Table:
tc: 0 th: 0 (DC Table)
bits: 0 0 7 1 1 1 1 1 0 0 0 0 0 0 0 0
-Before Value Ordering:
size: 3 3 3 3 3 3 3 4 5 6 7 8
value: 4 5 3 2 6 1 0 7 8 9 a b
code: 0 1 2 3 4 5 6 14 30 62 126 254
-After Value Ordering:
size: 3 3 3 3 3 3 3 4 5 6 7 8
value: 0 1 2 3 4 5 6 7 8 9 a b
code: 6 5 3 2 0 1 4 14 30 62 126 254
Huffman Table:
tc: 0 th: 1 (DC Table)
bits: 0 2 2 3 1 1 1 1 1 0 0 0 0 0 0 0
-Before Value Ordering:
size: 2 2 3 3 4 4 4 5 6 7 8 9
value: 1 0 2 3 4 5 6 7 8 9 a b
code: 0 1 4 5 12 13 14 30 62 126 254 510
-After Value Ordering:
size: 2 2 3 3 4 4 4 5 6 7 8 9
value: 0 1 2 3 4 5 6 7 8 9 a b
code: 1 0 4 5 12 13 14 30 62 126 254 510
Huffman Table:
tc: 1 th: 0 (AC Table)
bits: 0 2 1 3 3 2 4 2 6 7 3 4 2 6 2 73
-Before Value Ordering:
size: 2 2 3 4 4 4 5 5 5 6 6 7 7 7 7 8 8 9 9 9 9 9 9 10 10 10 10 10 10 10 11 11 11 12 12 12 12 13 13 14 14 14 14 14 14 15 15 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
value: 0/1 0/2 0/3 1/1 0/4 0/0 0/5 2/1 1/2 3/1 4/1 5/1 0/6 1/3 6/1 2/2 7/1 8/1 1/4 3/2 9/1 a/1 0/7 1/5 b/1 4/2 2/3 c/1 5/2 d/1 e/1 3/3 1/6 6/2 f/0 2/4 7/2 8/2 f/1 2/5 4/3 3/4 5/3 9/2 a/2 b/2 6/3 7/3 c/2 3/5 4/4 2/7 9/3 a/3 b/3 3/6 1/7 5/4 6/4 7/4 c/3 d/2 e/2 0/8 2/6 8/3 0/9 0/a 1/8 1/9 8/4 9/4 4/5 4/6 a/4 b/4 5/6 d/3 5/5 2/8 1/a f/2 e/3 f/3 c/4 d/4 e/4 f/4 6/5 7/5 8/5 9/5 a/5 b/5 c/5 d/5 e/5 f/5 6/6 7/6 8/6 9/6 a/6 b/6 c/6 d/6 e/6 f/6 3/7 4/7 5/7 6/7 7/7 8/7 9/7 a/7 b/7 c/7 d/7 e/7 f/7 3/8 4/8 5/8 6/8 7/8 8/8 9/8 a/8 b/8 c/8 d/8 e/8 f/8 2/9 3/9 4/9 5/9 6/9 7/9 8/9 9/9 a/9 b/9 c/9 d/9 e/9 f/9 2/a 3/a 4/a 5/a 6/a 7/a 8/a 9/a a/a b/a c/a d/a e/a f/a
code: 0 1 4 10 11 12 26 27 28 58 59 120 121 122 123 248 249 500 501 502 503 504 505 1012 1013 1014 1015 1016 1017 1018 2038 2039 2040 4082 4083 4084 4085 8172 8173 16348 16349 16350 16351 16352 16353 32708 32709 65420 65421 65422 65423 65424 65425 65426 65427 65428 65429 65430 65431 65432 65433 65434 65435 65436 65437 65438 65439 65440 65441 65442 65443 65444 65445 65446 65447 65448 65449 65450 65451 65452 65453 65454 65455 65456 65457 65458 65459 65460 65461 65462 65463 65464 65465 65466 65467 65468 65469 65470 65471 65472 65473 65474 65475 65476 65477 65478 65479 65480 65481 65482 65483 65484 65485 65486 65487 65488 65489 65490 65491 65492 65493 65494 65495 65496 65497 65498 65499 65500 65501 65502 65503 65504 65505 65506 65507 65508 65509 65510 65511 65512 65513 65514 65515 65516 65517 65518 65519 65520 65521 65522 65523 65524 65525 65526 65527 65528 65529 65530 65531 65532 65533 65534
-After Value Ordering:
size: 4 2 2 3 4 5 7 9 16 16 16 4 5 7 9 10 11 16 16 16 16 5 8 10 12 14 16 16 16 16 16 6 9 11 14 16 16 16 16 16 16 6 10 14 16 16 16 16 16 16 16 7 10 14 16 16 16 16 16 16 16 7 12 15 16 16 16 16 16 16 16 8 12 16 16 16 16 16 16 16 16 9 13 16 16 16 16 16 16 16 16 9 14 16 16 16 16 16 16 16 16 9 14 16 16 16 16 16 16 16 16 10 15 16 16 16 16 16 16 16 16 10 16 16 16 16 16 16 16 16 16 10 16 16 16 16 16 16 16 16 16 11 16 16 16 16 16 16 16 16 16 12 13 16 16 16 16 16 16 16 16 16
value: 0/0 0/1 0/2 0/3 0/4 0/5 0/6 0/7 0/8 0/9 0/a 1/1 1/2 1/3 1/4 1/5 1/6 1/7 1/8 1/9 1/a 2/1 2/2 2/3 2/4 2/5 2/6 2/7 2/8 2/9 2/a 3/1 3/2 3/3 3/4 3/5 3/6 3/7 3/8 3/9 3/a 4/1 4/2 4/3 4/4 4/5 4/6 4/7 4/8 4/9 4/a 5/1 5/2 5/3 5/4 5/5 5/6 5/7 5/8 5/9 5/a 6/1 6/2 6/3 6/4 6/5 6/6 6/7 6/8 6/9 6/a 7/1 7/2 7/3 7/4 7/5 7/6 7/7 7/8 7/9 7/a 8/1 8/2 8/3 8/4 8/5 8/6 8/7 8/8 8/9 8/a 9/1 9/2 9/3 9/4 9/5 9/6 9/7 9/8 9/9 9/a a/1 a/2 a/3 a/4 a/5 a/6 a/7 a/8 a/9 a/a b/1 b/2 b/3 b/4 b/5 b/6 b/7 b/8 b/9 b/a c/1 c/2 c/3 c/4 c/5 c/6 c/7 c/8 c/9 c/a d/1 d/2 d/3 d/4 d/5 d/6 d/7 d/8 d/9 d/a e/1 e/2 e/3 e/4 e/5 e/6 e/7 e/8 e/9 e/a f/0 f/1 f/2 f/3 f/4 f/5 f/6 f/7 f/8 f/9 f/a
code: 12 0 1 4 11 26 121 505 65436 65439 65440 10 28 122 501 1012 2040 65429 65441 65442 65453 27 248 1015 4084 16348 65437 65424 65452 65507 65521 58 502 2039 16350 65422 65428 65481 65494 65508 65522 59 1014 16349 65423 65445 65446 65482 65495 65509 65523 120 1017 16351 65430 65451 65449 65483 65496 65510 65524 123 4082 32709 65431 65461 65471 65484 65497 65511 65525 249 4085 65420 65432 65462 65472 65485 65498 65512 65526 500 8172 65438 65443 65463 65473 65486 65499 65513 65527 503 16352 65425 65444 65464 65474 65487 65500 65514 65528 504 16353 65426 65447 65465 65475 65488 65501 65515 65529 1013 32708 65427 65448 65466 65476 65489 65502 65516 65530 1016 65421 65433 65457 65467 65477 65490 65503 65517 65531 1018 65434 65450 65458 65468 65478 65491 65504 65518 65532 2038 65435 65455 65459 65469 65479 65492 65505 65519 65533 4083 8173 65454 65456 65460 65470 65480 65493 65506 65520 65534
Huffman Table:
tc: 1 th: 1 (AC Table)
bits: 0 2 2 1 2 3 5 5 4 5 6 4 8 3 3 6d
-Before Value Ordering:
size: 2 2 3 3 4 5 5 6 6 6 7 7 7 7 7 8 8 8 8 8 9 9 9 9 10 10 10 10 10 11 11 11 11 11 11 12 12 12 12 13 13 13 13 13 13 13 13 14 14 14 15 15 15 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
value: 0/1 0/0 0/2 1/1 0/3 0/4 2/1 1/2 3/1 4/1 0/5 5/1 1/3 6/1 2/2 0/6 7/1 8/1 9/1 3/2 a/1 b/1 f/0 1/4 c/1 d/1 e/1 2/3 4/2 1/5 5/2 6/2 7/2 f/1 3/3 2/4 3/4 4/3 8/2 1/6 9/2 5/3 2/5 a/2 6/3 b/2 c/2 0/7 7/3 d/2 3/5 e/2 4/4 8/3 1/7 5/4 9/3 0/8 0/9 0/a 1/8 1/9 2/6 3/6 4/5 1/a 2/7 6/4 7/4 5/5 3/7 f/2 a/3 b/3 c/3 2/8 2/9 d/3 e/3 f/3 8/4 9/4 a/4 b/4 c/4 d/4 e/4 f/4 6/5 7/5 8/5 9/5 a/5 b/5 c/5 d/5 e/5 f/5 4/6 5/6 6/6 7/6 8/6 9/6 a/6 b/6 c/6 d/6 e/6 f/6 4/7 5/7 6/7 7/7 8/7 9/7 a/7 b/7 c/7 d/7 e/7 f/7 3/8 4/8 5/8 6/8 7/8 8/8 9/8 a/8 b/8 c/8 d/8 e/8 f/8 3/9 4/9 5/9 6/9 7/9 8/9 9/9 a/9 b/9 c/9 d/9 e/9 f/9 2/a 3/a 4/a 5/a 6/a 7/a 8/a 9/a a/a b/a c/a d/a e/a f/a
code: 0 1 4 5 12 26 27 56 57 58 118 119 120 121 122 246 247 248 249 250 502 503 504 505 1012 1013 1014 1015 1016 2034 2035 2036 2037 2038 2039 4080 4081 4082 4083 8168 8169 8170 8171 8172 8173 8174 8175 16352 16353 16354 32710 32711 32712 65426 65427 65428 65429 65430 65431 65432 65433 65434 65435 65436 65437 65438 65439 65440 65441 65442 65443 65444 65445 65446 65447 65448 65449 65450 65451 65452 65453 65454 65455 65456 65457 65458 65459 65460 65461 65462 65463 65464 65465 65466 65467 65468 65469 65470 65471 65472 65473 65474 65475 65476 65477 65478 65479 65480 65481 65482 65483 65484 65485 65486 65487 65488 65489 65490 65491 65492 65493 65494 65495 65496 65497 65498 65499 65500 65501 65502 65503 65504 65505 65506 65507 65508 65509 65510 65511 65512 65513 65514 65515 65516 65517 65518 65519 65520 65521 65522 65523 65524 65525 65526 65527 65528 65529 65530 65531 65532 65533 65534
-After Value Ordering:
size: 2 2 3 4 5 7 8 14 16 16 16 3 6 7 9 11 13 16 16 16 16 5 7 10 12 13 16 16 16 16 16 6 8 11 12 15 16 16 16 16 16 6 10 12 15 16 16 16 16 16 16 7 11 13 16 16 16 16 16 16 16 7 11 13 16 16 16 16 16 16 16 8 11 14 16 16 16 16 16 16 16 8 12 16 16 16 16 16 16 16 16 8 13 16 16 16 16 16 16 16 16 9 13 16 16 16 16 16 16 16 16 9 13 16 16 16 16 16 16 16 16 10 13 16 16 16 16 16 16 16 16 10 14 16 16 16 16 16 16 16 16 10 15 16 16 16 16 16 16 16 16 9 11 16 16 16 16 16 16 16 16 16
value: 0/0 0/1 0/2 0/3 0/4 0/5 0/6 0/7 0/8 0/9 0/a 1/1 1/2 1/3 1/4 1/5 1/6 1/7 1/8 1/9 1/a 2/1 2/2 2/3 2/4 2/5 2/6 2/7 2/8 2/9 2/a 3/1 3/2 3/3 3/4 3/5 3/6 3/7 3/8 3/9 3/a 4/1 4/2 4/3 4/4 4/5 4/6 4/7 4/8 4/9 4/a 5/1 5/2 5/3 5/4 5/5 5/6 5/7 5/8 5/9 5/a 6/1 6/2 6/3 6/4 6/5 6/6 6/7 6/8 6/9 6/a 7/1 7/2 7/3 7/4 7/5 7/6 7/7 7/8 7/9 7/a 8/1 8/2 8/3 8/4 8/5 8/6 8/7 8/8 8/9 8/a 9/1 9/2 9/3 9/4 9/5 9/6 9/7 9/8 9/9 9/a a/1 a/2 a/3 a/4 a/5 a/6 a/7 a/8 a/9 a/a b/1 b/2 b/3 b/4 b/5 b/6 b/7 b/8 b/9 b/a c/1 c/2 c/3 c/4 c/5 c/6 c/7 c/8 c/9 c/a d/1 d/2 d/3 d/4 d/5 d/6 d/7 d/8 d/9 d/a e/1 e/2 e/3 e/4 e/5 e/6 e/7 e/8 e/9 e/a f/0 f/1 f/2 f/3 f/4 f/5 f/6 f/7 f/8 f/9 f/a
code: 1 0 4 12 26 118 246 16352 65430 65431 65432 5 56 120 505 2034 8168 65427 65433 65434 65438 27 122 1015 4080 8171 65435 65439 65448 65449 65521 57 250 2039 4081 32710 65436 65443 65495 65508 65522 58 1016 4082 32712 65437 65471 65483 65496 65509 65523 119 2035 8170 65428 65442 65472 65484 65497 65510 65524 121 2036 8173 65440 65461 65473 65485 65498 65511 65525 247 2037 16353 65441 65462 65474 65486 65499 65512 65526 248 4083 65426 65453 65463 65475 65487 65500 65513 65527 249 8169 65429 65454 65464 65476 65488 65501 65514 65528 502 8172 65445 65455 65465 65477 65489 65502 65515 65529 503 8174 65446 65456 65466 65478 65490 65503 65516 65530 1012 8175 65447 65457 65467 65479 65491 65504 65517 65531 1013 16354 65450 65458 65468 65480 65492 65505 65518 65532 1014 32711 65451 65459 65469 65481 65493 65506 65519 65533 504 2038 65444 65452 65460 65470 65482 65494 65507 65520 65534
marker: ffda length: 0c
Scan Header:
image components: 3
-The 1 Component:
scan component: 1
dc table: 0
ac table: 0
-The 2 Component:
scan component: 2
dc table: 1
ac table: 1
-The 3 Component:
scan component: 3
dc table: 1
ac table: 1
start of spectral: 0
end of spectral: 63
approximation high: 0
approximation low: 0
接著我們來分析這次我所利用之圖片,如下:
圖四
start: ffd8
marker: ffe0 length: 010
Application Segments
marker: ffe1 length: 060
Application Segments
marker: ffdb length: 084
Quantization Table:
element precision: 0
destination id: 0
elements: 3 2 2 3 2 2 3 3 3 3 4 3 3 4 5 8 5 5 4 4 5 10 7 7 6 8 12 10 12 12 11 10 11 11 13 14 18 16 13 14 17 14 11 11 16 22 16 16 19 28 28 21 21 12 15 23 24 22 20 24 29 20 27 14
Quantization Table:
element precision: 0
destination id: 1
elements: 3 4 4 6 5 6 10 6 6 10 15 14 12 14 14 16 16 16 15 14 13 14 14 12 14 13 17 14 15 16 13 12 18 15 15 15 13 13 14 12 14 16 12 15 16 12 13 13 13 13 13 12 16 12 15 13 12 13 13 15 12 13 12 13
marker: ffc0 length: 011
Frame Header:
type: Baseline DCT
sample precision: 8 bits
height: 44 pixels
width: 44 pixels
image components: 3
-The 1 Component:
component id: 1
horizontal sampling factor: 1
vertical sampling factor: 1
quantization table: 0
-The 2 Component:
component id: 2
horizontal sampling factor: 1
vertical sampling factor: 1
quantization table: 1
-The 3 Component:
component id: 3
horizontal sampling factor: 1
vertical sampling factor: 1
quantization table: 1
marker: ffc4 length: 01a
Huffman Table:
tc: 0 th: 0 (DC Table)
bits: 0 3 1 1 1 1 0 0 0 0 0 0 0 0 0 0
-Before Value Ordering:
size: 2 2 2 3 4 5 6
value: 5 6 7 8 4 3 0
code: 0 1 2 6 14 30 62
-After Value Ordering:
size: 6 5 4 2 2 2 3
value: 0 3 4 5 6 7 8
code: 62 30 14 0 1 2 6
marker: ffc4 length: 036
Huffman Table:
tc: 1 th: 0 (AC Table)
bits: 0 1 3 2 4 5 2 4 1 d 0 0 0 0 0 0
-Before Value Ordering:
size: 2 3 3 3 4 4 5 5 5 5 6 6 6 6 6 7 7 8 8 8 8 9 10 10 10 10 10 10 10 10 10 10 10 10 10
value: 0/1 0/2 0/3 0/4 0/5 1/1 0/0 0/6 1/2 2/1 0/7 1/3 2/2 3/1 4/1 5/1 6/1 2/3 3/2 8/1 9/1 1/4 0/8 1/5 1/7 4/2 4/3 5/2 7/1 8/2 a/2 b/1 c/1 d/2 f/0
code: 0 2 3 4 10 11 24 25 26 27 56 57 58 59 60 122 123 248 249 250 251 504 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022
-After Value Ordering:
size: 5 2 3 3 3 4 5 6 10 4 5 6 9 10 10 5 6 8 6 8 6 10 10 7 10 7 10 8 10 8 10 10 10 10 10
value: 0/0 0/1 0/2 0/3 0/4 0/5 0/6 0/7 0/8 1/1 1/2 1/3 1/4 1/5 1/7 2/1 2/2 2/3 3/1 3/2 4/1 4/2 4/3 5/1 5/2 6/1 7/1 8/1 8/2 9/1 a/2 b/1 c/1 d/2 f/0
code: 24 0 2 3 4 10 25 56 1010 11 26 57 504 1011 1012 27 58 248 59 249 60 1013 1014 122 1015 123 1016 250 1017 251 1018 1019 1020 1021 1022
marker: ffc4 length: 01a
Huffman Table:
tc: 0 th: 1 (DC Table)
bits: 0 2 3 1 1 0 0 0 0 0 0 0 0 0 0 0
-Before Value Ordering:
size: 2 2 3 3 3 4 5
value: 4 5 2 3 6 0 1
code: 0 1 4 5 6 14 30
-After Value Ordering:
size: 4 5 3 3 2 2 3
value: 0 1 2 3 4 5 6
code: 14 30 4 5 0 1 6
marker: ffc4 length: 02a
Huffman Table:
tc: 1 th: 1 (AC Table)
bits: 0 1 4 0 4 4 6 3 1 0 0 0 0 0 0 0
-Before Value Ordering:
size: 2 3 3 3 3 5 5 5 5 6 6 6 6 7 7 7 7 7 7 8 8 8 9
value: 0/1 0/0 0/2 0/3 1/1 0/4 1/2 2/1 5/1 0/5 1/3 3/1 4/1 8/1 9/1 a/1 b/1 d/1 f/0 6/1 7/1 c/1 2/3
code: 0 2 3 4 5 12 13 14 15 32 33 34 35 72 73 74 75 76 77 156 157 158 318
-After Value Ordering:
size: 3 2 3 3 5 6 3 5 6 5 9 6 6 5 8 8 7 7 7 7 8 7 7
value: 0/0 0/1 0/2 0/3 0/4 0/5 1/1 1/2 1/3 2/1 2/3 3/1 4/1 5/1 6/1 7/1 8/1 9/1 a/1 b/1 c/1 d/1 f/0
code: 2 0 3 4 12 32 5 13 33 14 318 34 35 15 156 157 72 73 74 75 158 76 77
marker: ffda length: 0c
Scan Header:
image components: 3
-The 1 Component:
scan component: 1
dc table: 0
ac table: 0
-The 2 Component:
scan component: 2
dc table: 1
ac table: 1
-The 3 Component:
scan component: 3
dc table: 1
ac table: 1
start of spectral: 0
end of spectral: 63
approximation high: 0
approximation low: 0
基本上每個marker中所代表之意思已可從上述文件中取得,唯一需要注意的是在0xFFDA(Scan Header)結束後緊接著則是每個scan編碼後的data,該data長度並無標示,由於本次作業並無做到解碼部分,因此讀取時無法順利跳過該data直至0xFFD9。
另外值得注意的是,0xFFC4(Huffman Table)的marker會依據不同的處理軟體而有不一樣的個數,就如同老師上課所用之教學圖片(Rex.jpg),該圖便只有一個0xFFC4,然而這次作業的圖片(圖四)則有四個0xFFC4,針對每一張huffman table分別給一個marker,從上述文件中即可看出端倪。
接著說明撰寫程式時所需要注意的事項,在讀取檔案時,C++所使用的方式是以file stream讀取,但讀取方式是以getline()為主,而所謂getline(),說明了是只讀取檔案至字元'\n'為止稱為line,而其實字元'\n'並不會真的如期讀入陣列中,因此遇到字元'\n'時需自己補上0xA,否則會造成後續處理檔案之問題。
Jpeg的header中只要是存放length的兩個byte處理時同樣要注意,其存放方式是以big endian存放,而我們目前使用之pc皆以little endian,在此我以two-byte pointer(unsigned short*)指向該地址,讀入後再將little endian之數字改為big endian,如此便可正確讀取其length。
2012年11月15日 星期四
98360915 資工四甲 周立祥
本次作業主要在於實作平滑化(Averaging)、銳化(Laplacian)、中值濾波器(Median)等三種濾波器,以下原圖引用於Facebook俞老行軍團粉絲頁,作者:俞蘇。
第一種:
平滑化(Averaging):
顧名思義是將圖片柔化,而柔化後的圖片將不再如此銳利,會讓人感覺圖片上蒙上一層面紗般的朦朧感,調整好適當數值,搭配亮度以及色溫調整即可達到美肌效果。本次只展現平滑化,使用之window size為3x3,而在3x3的mask中,中央的pixel則是希望被替換之pixel。以下共使用兩種mask:第一種:
圖一
依照圖一所示,周遭八個加上自己本身共九個pixel,給予每個pixel相對應的權重(在此皆為1),再將所有pixel乘上對應之權重並加總除以權重加總,例圖一則為sum / 9,而平均後的數值便為欲取代中央的數值。下圖是以圖一作為mask之平滑化:
第二種:
圖二
依照圖二所示,一樣給予對應之pixel權重,在此加總後是除以16,而此mask相對於圖一之mask所計算出之圖片較為清晰,原因在於中央(也就是自己本身)之pixel權重大於周遭其他pixel之權重。下圖是以圖二作為mask之平滑化:
由於圖片過小看不出差異性,可將圖片下載後再行比對,放大後可看出經由圖一運算後的圖片較為模糊,而經由圖二運算後的圖片較為清晰些。
註:
看數字(62)的部分較為明顯。
銳化(Laplacian):
顧名思義是將圖片變得更清晰,而銳化後的圖片將不再感覺到原先那樣的模糊,銳化最明顯的部份在於顏色反差極大的部份,例如一個物體的邊線,若調整好適當數值,銳化後的圖片會讓人感覺較為清晰,但假設數值過大,將會造成圖片太過死硬。本次展現之銳化同樣是使用3x3的window size。以下共使用兩種mask:
第一種:
圖三
依照圖三所示給予每個pixel相對應的權重,再將所有pixel乘上對應之權重並加總後的數值便為欲取代中央的數值。下圖是以圖三作為mask之銳化:
第二種:
圖四
依照圖四所示,一樣給予對應之pixel權重,之後加總後便為欲取代中央的數值,但此mask相對於圖三之mask所計算出的圖片銳化度較小,原因在於考慮的pixel數變少,在此為四個角之pixel皆不納入考量。下圖是以圖四作為mask之銳化:
在此一樣由於圖片過小看不太出差異性,可將圖片下載後再行比對,放大後可看出經由圖三運算後的圖片銳化較明顯,而經由圖四運算後的圖片銳化較不明顯些。
中值濾波器(Median):
此filter如同前面兩種一樣,是利用某一大小之window size作為mask,中央之數值一樣為希望被替換之數值,然而這次的作法是將周遭與自己本身排序後取出中位數作為替換之數值,這樣的filter可以用來過濾一些雜訊,但經由此filter過濾後的圖片依然會失去原先的清晰度(意即較為模糊)。下圖是原圖加入雜訊後:
加入這樣黑白小點之雜訊後,經由此filter可將雜訊點替換成周遭其他pixel之color,原因在於黑點(0)、白點(255)的關係,排序後黑點及白點會被置放於最左及最右,因此取出中位數後即可稍微將影像還原些,其理論在於周遭之pixel幾乎與自己本身相近所得出。下圖是經由過濾後之圖片:
感想:
由於同樣是使用C#實作,而C#在讀取圖片記憶體的方式較為不便,他只可取得圖片第一個byte的地址,其後要靠自己加入相對的數值做指標的移動,而換行依然要注意經由Memory Alignment後多出的padding byte,因此稍微計算錯誤則會導致整個圖片變得非常詭異,另外,本次處理有對圖片邊框做處理,圖片四角則是2x2之mask,邊的部份為2x3之mask。
2012年10月17日 星期三
98360915 資工四甲 周立祥
2012/10/17 20:43:
介紹:
這次作業是利用C#完成的,程式介面如圖一所示,而我針對本次作業是著重於實現直方圖均化的效果,而直方圖的部份只有基本樣子呈現。另外,由於C#本身不希望使用者使用指標的功能,因此對外開放一般讀寫的method讓使用者存取各個圖片的pixel值,但這種作法對於影像處理的效能並不好,而C#本身還是帶有指標功能,只是一般預設為不可使用,若要使用則必須在在組態設定部分開啟同意unsafe區塊,如此使用者便可使用類似於Borland C++ Builder的ScanLine方式讀取圖片,但實際用法卻頗為複雜,針對此部份的實際做法將於最後做介紹。
(圖一)
接下來將展現直方圖均化的效果,圖二是在學校CC棟三樓所拍攝,將手機相機的ISO值降到最低即可達到這樣的效果。利用圖一所示的直方圖可以繪製出目前色彩的分佈,如圖三所示,由圖可得知所有色彩分布都在最暗的部份,所以整張照片看上去是漆黑一片。
(圖二)
(圖三)
接著是利用圖一所示的均化來調整整張圖片的色彩分布,圖四為圖二均化後的樣子,而圖五則是均化後的色彩分布圖。
(圖四)
(圖五)
心得:
針對圖四的部份懷疑是否因演算法錯誤或是畫素問題導致均化後的圖片看上去顏色並不自然,而且噪點極多,整張照片的成像品質並不好。
另外,先前所提到在C#利用類似於Borland C++ Builder的ScanLine方式的作法是:
1. Project -> "XXX" Properties... -> Build 將Allow unsafe code勾起
2. 利用Bitmap提供的LockBits方法來將圖片鎖定到記憶體中
3. 利用BitmapData取得該圖記憶體位址
4. 利用BitmapData提供的Scan0方法取得每列的圖片像素點(類似於ScanLine)
這裡要注意的是,C#處理圖片的方式是將每個像素點以四個byte方式存入(因CPU存取記憶體是以WORD方式讀取,所以對於程式存放資料時會做Memory Alignment),然而圖片像素的顏色只有三個byte,因此BitmapData還提供一個叫做Stride的屬性,該屬性表示每一列之長度,因此,若讀取圖片後需要換行時則需將地址加上Stride減去處理過的像素點個數,如此便可正常處理圖片。
題外話:
因我的程式撰寫方式是引入一個存放圖片的位置,之後將該位置內的所有圖片全部加入程式中,但假設圖片畫素過大以及圖片過多時,會造成程式類似於當機的狀態,針對此部份是另外新增一個thread去執行這部份,用以解決若圖片過大或過多造成程式引入時呈現當機的假象。
2012/11/02 1:44補充:
由於先前誤解演算法,導致均化效果不佳,如今重新更改圖片以及新增老師的範例圖片處理,如下:
關於均化的演算法,首先統計出各個亮點的分佈,也就是直方圖,然後統計出各個亮點的累積圖,最後將原圖每個亮點依照累積圖所映射的數值做更改即可完成。
註:參照的映射為灰階直方圖,利用該直方圖去針對給個RGB做修改,因此均化後的圖片必定有許多點的成像被破壞,導致圖片看似出錯。
2012年9月25日 星期二
98360915 資工四甲 周立祥
攝影一直被視為是平面的藝術,而且現在是幾乎人手一機的時代,不管是數位相機或是智慧型手機上面都會配備相機,拍攝的品質例如光圈、快門,以及ISO、白平衡等等,皆可以透過軟體最佳化;不過相機操作方式改良到多麼簡便,取景構圖還是要靠自己摸索鑽研,必須熟練如何透過畫面,確實傳達出讓人感動的張力,這一點是絲毫不變的。就算自動化的相機會自動調整曝光或對焦等拍攝條件,取景構圖依然只能靠自己決定,因此我去圖書館借了”完美構圖”這本書來研讀。


從目錄中可以看到,此書中構圖的技巧還有細分為,
◆海 ◆山 ◆高原 ◆森林 ◆樹木 ◆瀑布 ◆溪流 ◆湖泊 ◆櫻花 ◆新綠 ◆紅葉 ◆雪景 ◆近山 ◆天空 ◆大街小巷 ◆花田 ◆花(近攝)自然景觀(自然科學相片) ◆動物 ◆水族館 ◆電車 ◆大城小鎮 ◆建築 ◆晨曦 / 黃昏 / 夜景 ◆旅遊 ◆祭典 ◆運動 ◆紀念照 ◆居家 ◆隨興快拍。
因此我挑了幾個有興趣的主題來小試身手。
此頁是在介紹海景如何拍攝會較為生動,圖2則以7:3的比例出海浪與海,這樣的拍法使浪頭的白花呈對角線,不但不突兀還更顯的立體。
下圖是於澎湖小試身手所拍攝: 同樣以7:3的比例呈現,顯現出山壁的陡峭以及海連著天無限延伸的感覺。
右圖於日本大阪城小試身手,由下往上拍攝,一顆顆立體的浮雲彷彿是要吞噬佇立於圖中的NHK電視台,下方入鏡的行人更顯現出浮雲高大、壓境的意象。
此頁是在介紹,通常拍照大家都比勝利手勢或是僅僅保持微笑,略嫌呆版,若是能拍攝出隨興、自然的一面會更好。
我認為往往越自然的照片越能紀錄當下的心情,下圖於澎湖跨海大橋拍攝,設定自動拍攝,以攝取最自然的一瞬間。
右圖小試身手。
此頁是在在介紹 "個人創意構圖",看完此頁後了解到,取景構圖沒有一定的規則,只要在按下快門前稍微想一下自己想要拍攝出甚麼感覺,或是在畫面上想要表現甚麼。
下圖於高雄旗津拍攝,利用距離表現出能一手掌握山的感覺。
看完本書後,更加了解道構圖的原理,並乘著假日出遊小試身手,感覺獲益良多。雖然不是很高深的技巧,但了解構圖後再加上實際拍攝的心得,讓我更充分的學習到,若是換個構圖方式就能讓照片看起來更加豐富化、立體化。只要善用構圖技巧不需要高深的技術、高級的相機,就可以用照片紀錄生活、紀錄心情甚至可以用照片說故事,因此這本書一定要推薦給大家。
訂閱:
文章 (Atom)