JPEG 압축 기술 관련 질문입니다.

yun8085의 이미지

여기 이런 질문을 올려도 되는지 모르겠지만,
답변 받을 곳이 없어서 질문 드립니다. ㅠ

JPEG 압축 과정 중
아래 3가지 압축 기술에 대하여 인간의 눈 (HVS, Human Perception)과 관련 하여 설명 하시오

1. downsampling
2. DCT
3. Quantization

1번의 경우
인간의 눈은 luminance 값이 chrominance 값보다 민감 하기 때문에
YCbCr 값을 4:2:2로 하여 압축 할 수 있다.???

2,3번의 내용이 정리가 잘 안되네요....
DCT는 일단 고주파 영역이 인간의 눈에 덜 민감하다는 것이라고 알고 있는데
정확한 개념도 이해하지 못하니 어떻게 정리 해야 할지 모르겠네요

1,2,3번을 깔끔하게 정리해 주실 분 답변 부탁드립니다.

parkon의 이미지

이런 일반적인 것들에 관해서는 요즘 위키페디아가 아주 좋더군요.
http://en.wikipedia.org/wiki/JPEG
여길 한번 공부해 보심이...

hyde1004의 이미지

안녕하세요.

그 쪽이 전공이라 도와드리고 싶은데, 졸업한지가 10년이 되어서 단편적인 기억만 남아있네요.

parkon 님이 말씀하신대로 wiki를 읽으시면 도움이 될것 같은데,
yun8585님이 배경지식이 없으면 힘드실수도 있겠네요.

저도 wiki를 보면서 드문 드문 기억나는 대로 말씀드리겠습니다.
1. Downsampling : 아마 YCbCr을 의미하나 보군요. ^^
Y는 밝기 정도, CbCr은 색 정보입니다. (간략히 Red, Blue 라고 해두죠)

눈의 구조를 보시면, 망막에 Rod와 Cone이 분포되어 있습니다.
( http://blog.naver.com/eden1101?Redirect=Log&logNo=150026569006 )
Rod가 빛을, Cone이 색을 인지할 수 있습니다. 그런데 Rod가 Cone에 비해 훨씬 많습니다.
비율은 생각이 나지 않네요. 그래서 사람의 눈은 색보다 빛에 민감합니다.
역으로 말하면, 사람은 빛보다 색이 더 중요하다고도 볼 수 있겠죠.
같은 리소스(bit)를 투입해도 색의 변화를 느끼지 못합니다.
따라서, 공학적으로 리소스를 분배해야 한다면, 빛에 더 많은 리소트 (bit)를 하는게 효과가 큽니다.

hyde1004의 이미지

급하게 적다보니 실수한 내용이 있네요.
"그래서 사람의 눈은 색보다 빛에 민감합니다" ==> "빛보다 색에 민감합니다."

hyde1004의 이미지

에고, 정신이 나갔나봅니다.

역으로 말하면, 사람은 빛보다 색이 더 중요하다고도 볼 수 있겠죠 ==> 색보다 빛이 중요하다.

jachin의 이미지

저도 JPEG 압축 알고리즘에 대해서 많이 생각해왔는데요, (누구 말마따나 자뻑 시작입니다.)
일단 1번에 말씀하신 downsampling 부분에서 YCbCr의 색상공간 변환이 필요한 이유는
말씀하신 것처럼, 빛의 스펙트럼을 이용한 색상 기술방법이 눈으로 보는 RGBa 체계의 색상공간과 큰 차이가 없으면서도,
주파수 스펙트럼으로 나타낼 수 있기 때문에 유리한 것이라 생각합니다.

2번의 DCT는 퓨리에 변환을 위한 함수입니다.
퓨리에 변환은 (공부하셔서 아시겠지만) 특정 값을 유사한 삼각함수의 합으로 나타낼 수 있습니다.
DCT는 그러한 퓨리에 변환 중, Sine 파와 Cosine 파의 대칭성을 통해, cosine 항의 표현만으로도 파형의 값을 알 수 있고,
연속된 cosine 항의 수열 중, 1, 2, 3차항까지의 계수만으로도 거의 유사하게 값을 표현할 수 있기 때문에,
주파수 체계의 YCbCr의 색상값을 나타내기에 최적이라 생각하여 사용하게 된 것 같습니다.
(Fast Fourier Transform에 대한 알고리즘은 여러가지가 있습니다.)
이웃하는 픽셀의 주파수 변화는 연속된 영역에서의 작은 변화이기 때문에,
블럭단위(대부분 8x8 픽셀)로 표현할 경우,
하나의 픽셀값과 그 변화량만을 표현하는 것으로 쉽게 데이터 량을 줄일 수 있었습니다.
변화량을 연속된 주파수의 상대값을 주파수 변화율 만큼(색상요소를 구분할 수 있는 최소단위)으로 나누어서,
불연속적인 값(Discrete)으로 표현하고, 몇가지 색상 배치 패턴의 값을 제외하고 나면,
3번에서 말씀하신 양자화 단계로 넘어갑니다.
양자화 단계에서는 (8x8) 블럭내의 픽셀의 위치값을 따로 저장하지 않고,
허프만 코딩방식으로 블럭 내의 픽셀 영역에 해당하는 변환 값들을 일렬로 정렬하여서,
블럭내의 픽셀 정보를 최적화하는 방법이라 생각합니다.

아마 parkon님께서 링크걸어주신 위키 내용의 예제 이미지를 통해 2번과 3번 과정을 이해하시는 것이 빠르시리라 생각합니다.

익명 사용자의 이미지

분명히 "아래 3가지 압축 기술에 대하여 인간의 눈 (HVS, Human Perception)과 관련 하여 설명"하랬는데...

1번은 다른 사람이 먼저쓴거 베낀 설명이니까 넘어가고...

2번, 3번 설명은 인간의 눈과 먼 상관...

머라고 잔뜩 써놨는데 도움되는 내용은 한개도 없네...

C 헤더파일이 /usr/lib 밑에 있는 이유부터 설명해주면 좋을거 같은데...

그건 나만의 바램이겠지...

익명 사용자의 이미지

1번 설명도 인간의 눈이랑 먼 상관이지...

모범 오답 사례로 적절하겠군...

jachin의 이미지

왜 그렇게 저에게 관심받고 싶어하시는지...

C 헤더 파일이야 /usr/include 나 /usr/local/include 에 있겠지요.
다른 일하다가 정신이 없어서 /usr/include를 /usr/lib 로 쳤나봅니다.
아니면 당신께서 소문자 L이나 대문자 i를 혼동하셔서,
라이브러리 호출 옵션을 헤더파일 위치 지정 옵션으로 잘못보셨을 수도 있지요.

그래서 그게 부끄러운 일이니 저에게 사과하시라고 말하고 싶은 겁니까?
분명 그런 답글을 통해 잘못된 내용을 전달한 것에 대해서,
질문자 분들에게 죄송하지요.

그런데 당신께서는 이미 다 알고 계신듯이,
'너 개솔', '병신' 이라고 지적하시면서,
질문자에겐 'X 먹어라, X 뺑이쳐라' 라고
그 내용에 대해 쓰지 않으시는 거 아닙니까?

어이없습니다. :)

unipro의 이미지

다른 사람의 질문에 성심성의껏 답변과 찌질한 감정싸움이 될 만한 상황에서 잘 대처하는 모습이 보기 좋습니다.
jachin님이 헤더파일 경로를 /usr/lib로 적은 것이 단순한 실수였다고 생각해요.

더불어 두분(?) 사이가 원만히 해결되기를 희망합니다. :-)

내 블로그: http://unipro.tistory.com

익명 사용자의 이미지

쓴거 그대로 붙여쓰기해야겠군...

"
단순히 표준 C 라이브러리의 헤더파일을 읽으시길 원하시는 것이라면,

/usr/lib 또는 /lib 폴더 안의 헤더파일들을 확인해보시면 될겁니다. :)
"

/usr/include를 /usr/lib로 잘못 적었다고 오리발내미는거까진 좋은데...

있지도않은 /include 폴더도 /lib로 잘못 적었다고 오리발내밀수도 있으려나...

머 똑같은 주제로 논문을 쓰다보면 아주 우연히...

단어 순서가 완전 똑같은 문장을 여러개쓸수도 있는거겠지 우연히...

머 거기다 정신없이 일하다보면 아주 우연히...

똑같은 위치에서 똑같은 오타를 칠수도 있는거겠지 우연히...

머 사실 이거뿐만이 아니지...

C 표준라이브러리 소스를 GCC 소스 안에서 찾으라고 하지를 않나...

SATA1이랑 SATA2랑 구분하는데 lspci 명령을 쓰면된다고 하질 않나...

아주 개코메디같은 답글만 골라서다는데...

틀린거 들키면 제가 정신이 없어서 헷갈렸네요 요러면 끝이지...

감싸주고 덮어주고 끼리끼리 잘들 논다...

이래놓고 어디가면 문대성 엄청 씹어대겠지...

jachin의 이미지

링크 좀 걸어줘봐.

그리고 나, 너 누군지 알아.

이제 하대할께. 나이가 많아도, 경력이 높아도,

넌 연장자 취급 안해도 될 것 같아.

익명 사용자의 이미지

분명히 자기 손가락으로...

"
g++ 부분에 -l 옵션으로 cstring과 cstdio등을 추가해주시면 되지 않을까요?
"

라고 쳐놓고는 나한테 뒤집어씌우네...

-I 옵션을 -l 옵션으로 잘못쳤다고 오리발내미는거까지는 좋은데...

cstring이랑 cstdio는 기본경로에 있는 애들이라 -I를 지정할 필요가 없거든...

사실은 그밑에 누가 쓴거처럼 -include 옵션을 써야 맞는건데...

-include 옵션이랑 -I 옵션이랑 헷갈린다음...

-I 옵션이랑 -l 옵션이랑 또 헷갈린거라고 오리발내밀면 되겠네...

아니면 원래 -include라고 쓰려고했는데...

다른 일하다가 정신이 없어서 i,n,c,u,d,e를 실수로 안쳤다고 오리발내밀어도 되겠구나...

무슨 답글마다 헷갈리는거 투성이냐...

정신이 그정도로 없으면 답글달지 말라고 젭라...

먼소린지 이해가 안되나...

개코메디하느라 고생이다 진짜...

jachin의 이미지

거짓말이라고 말하면 거짓말이 될 수도 있겠지.

내가 C에 대해 전혀 모르고 무지한 사람이라고 인정받아야 이런 뻘짓을 안하겠다는 건가?

자유게시판의 글들을 보고 있는지는 모르겠지만,

네가 하는 행동은 내가 잘못 전달한 정보의 영향보다 더 안좋아.

내가 거짓말을 했다고 말하는 것도 이상하지만, 잘못된 내용에 대해 인정을 안했어?

너야말로 의도하는게 뭐야? 어차피 나는 너희 사업에 방해물이나 저해요소가 아냐.

그냥 KLDP에 사람들 모이는 게 싫으면, 굳이 와서 어뷰징 안해도 돼.

익명 사용자의 이미지

동문서답이긴 하지만 유용하네요.
근데 동문서답 많이 하시는 것 같긴 함 ㅋ

jachin의 이미지

이번엔 동문서답은 아니고, 보충설명 정도로 생각해주셨으면 좋겠는데 말이죠...

부연설명으로 하는 김에 'Human Perception'과 연관지어 얘기하면,
1. Down Sampling, Chromatic Sampling 이라고도 합니다. YCbCr Color Space는 Y(명도), Cb(고주파 가시광선 영역 요소), Cr(저주파 가시광선 영역 요소)로 나뉘게 되는데, 명도에 민감한 인간의 눈은 Y의 값을 그대로 두고, Cb, Cr영역의 주파수 간격을 절반으로 줄여도 같은 색상으로 인식할 정도로 색상의 구분을 잘 못합니다. 컴퓨터 배경화면에서 색상깊이(Color Depth)를 16 bit로 두는 것과 32 bit로 두는 경우, 단색 배경의 색상차를 못 느낄 정도로 말이지요.

2. DCT, 퓨리에 변환과 관련하여 말하였지만, 같은 주파수의 Cb, Cr 요소와 유사한 파장으로 접근하여 색상값에 변질이 생깁니다. 하지만, 유사한 색상 주파수이기 때문에, 그 차이를 못 느낀다는 것이지요. 위키피디아의 http://en.wikipedia.org/wiki/File:JPEG_example_subimage.svg 링크 이미지는, Y나 Cb, Cr 중 하나의 요소로만 이루어진 이미지 블럭 내에서 DCT를 가했을 때, 주파수의 변화율을 최고점과 최저점의 평활 분포로 흑백 색상 배치한 것입니다. 즉 제일 밝은 중앙부분으로부터 바깥 방향으로, 3, 4 단계의 색상 주파수 변화가 있다는 것을 의미합니다. 3, 4 단계를 각 픽셀별로 데이터 환산하면, 8x8 픽셀에 각각 2 bit 씩만 할당하는 것으로, 이미지 블럭 내 색상값을 결정할 수 있게 되는 것입니다.

3. Quantization, 양자화. 이미지는 대부분 연속된 색상 배열로 되어 있고, 하나의 블럭안에서 특정 순서의 위치로 재배열하여도 병치혼합과 같은 원리로 이미지를 추상할 수 있습니다. 위키피디아 페이지 첫번째 고양이 이미지 http://upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Felis_silvestris_silvestris_small_gradual_decrease_of_quality.png/240px-Felis_silvestris_silvestris_small_gradual_decrease_of_quality.png 를 보면, 오른쪽에서 왼쪽으로 양자화 한 블럭별로 품질이 떨어집니다. 그러나 우리가 물체의 형태를 인식할 수 있는 이유는, 이미지의 연속성, 즉 물체의 윤곽을 대강 보고도 이미지를 인식할 수 있는 추상 능력 덕분입니다.

이렇게 알려드리면, 숙제 대신 해드린 셈이겠죠? :)

그래도 자료 남기는 관점에서는 나쁘지 않은 것 같습니다.

jachin의 이미지

생각해보니 설명이 잘못된 부분이 있는데요, 양자화를 하면서, 8x8 블럭내의 값이 허프만 코딩의 시작점(왼쪽 위)로 높은 값을 갖게 되고, 점점 진행하면서 낮은 값을 갖게 됩니다. 값은 연속적인 값이 아닌 이산값(Discrete Value)라서 불연속적이다보니, 정확한 색상값을 갖지 못하는 이유가 됩니다.

양자화를 통해 색상품질이 떨어지게 되는 이유로 이미지 정보가 손실되지만, 유사한 값이기 때문에 사람의 눈은 같은 이미지로 혼동하게 됩니다.

hyde1004의 이미지

3. Quantization 관련해서 말씀드리면요.

보통 영상처리시에 높은 주파수에 대해서는 중요성을 낮게 봅니다.
왜냐하면 사람의 눈이 인식을 잘 못하기 때문입니다.

아시다시피 주파수 개념이 반복수/단위시간 입니다.
보통 1초에 한번 반복되면 1Hz라고 하죠.

정지영상에서는 주어진 범위(예를 들면 길이)에서 변화되는 정도라고 보시면 될것 같습니다.

모눈종이가 있습니다.
모눈종이의 크기는 1m x 1m 이고, 바로 눈앞에 있다고 생각해봅시다.
모눈의 각 길이는 10cm 라고 하고, 각 모눈에 흰색과 빨간 색을 교차해서 칠했다고 가정합니다.
그러면 다음과 같은 식으로 반복되겠죠.

흰색, 빨간색, 흰색, 빨간색,...
빨간색,흰색, 빨간색, 흰색, ...
흰색, 빨간색, 흰색, 빨간색,...
...

이걸 사람의 눈으로 보면 흰색과 빨간색이 교차하는 구나 느낄수 있습니다.
각 모눈의 길이를 줄여서 다시 반복하면 어떨까요?
모눈의 길이를 1cm로 줄여서 다시 색칠하면 뭐 그런대로 흰색, 빨간색으로 느껴질 겁니다.
그런데, 극단적으로 이 모눈의 길이를 1/1000cm 로 줄여서 반복하면 어떻게 될까요?
사람눈으로 보면 그냥 분홍색으로 보입니다.
그러면 사람눈으로는 단순히 분홍색으로 칠한 것과 구분이 안됩니다.
그럴바에는 각 모눈마다 색 정보를 넣기보다는, 그냥 전체를 분홍색으로 칠하는게 더 편합니다.
따라서 고주파부분(위의 예에서 모눈의 길이를 작게 한 부분)은 중요치않게 생각하고 리소스(bit)를 많이 할당하지 않습니다.

Quantization matrix ( http://en.wikipedia.org/wiki/Quantization_matrix#Quantization_matrices )의 두 번째 행렬이
Quazntization matrix인데, 그 값을 보시면 오른쪽 하단으로 갈수록 값이 커집니다.
이 값이 크면 클수록 실제 정보를 듬성 듬성 구분하게 됩니다.
첫번째 배열을 두번째 배열로 나눈, 세번째 행렬이 결과 값인데,
마지막 결과의 오른쪽 아래로 갈수록 대부분 0이되죠.

jachin의 이미지

저는 그냥 듣보잡 설명이네요. 덕분에 JPEG 내의 양자화에 대해서 이해했습니다.

역시 게시판에서 주거니 받거니 하며 배우는게 제일 좋은 것 같아요. ㅠㅠ)b

익명 사용자의 이미지

저렇게 짧은 설명 잠깐 읽고 JPEG 내의 양자화에 대해서 이해했다니...

JPEG 양자화가 무슨 강아지 이름이냐...

모르는게 있으면 게시판에 질문을 올려야지 왜 답글을 쳐달고 앉았지...

그것도 순 개코메디같은 소리만 골라서하면서...

jachin의 이미지

나도 오늘 질문 할 것 생겼다.

한 번 답변 해줘봐.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.