리눅스에서...컬러 영상을 gray 영상으로 바꾸는데...

younkyun의 이미지

24bit bmp 파일을
gray 영상으로 바꿀라구 하는데요...
물론 리눅스에서 C 로 프로그램 합니다..

일단 파일 불러오는것 부터 막히 거등요...
어찌해야 좋을지요....ㅜㅜ......
관련된 소스나 자세한 설명 부탁드릴께요...

익명 사용자의 이미지

1. bmp파일 포맷을 분석: 헤더+바디
=> 이미지의 각 픽셀에 대한 RGB(red, green, blue)를 추출
2. 단순하게 g를 기준으로 r,b에 g의 값으로 채운다.
3. 이를 디스플레이해본다.
* 음... 그럴듯한가? 본다.
*사실 dithering 알고리즘을 찾아서 해결하시는게 올바른 접근입니다.

익명 사용자의 이미지

참고로 r == g == b 가 그레이계열이지요.
r == g == b == 0 검은색
...
r == g == b == 128 중간정도 흰색(?)
...
r == g == b == 255 가장 밝은 흰색

sio4의 이미지

일단 파일을 처리하는 과정에는

1) bmp 형식에 대한 이해를 기반으로 직접 구현한다.
2) bmp 형식에 대한 다른 사람의 구현을 빌려쓴다.
3) bmp를 포함한 일반적인 이미지 처리 라이블러리/툴을 찾아 사용한다.

등의 방법이 있을겁니다. 물론, 공부를 목적으로 하는 것이라면 1) 번을 선택하시겠지만 그렇지 않다면 2)나 3)을 쓰시는 편이 좋겠죠.

2) 번의 장점은 데이터 형식에 관한 부분에 신경을 끄고 다음 단계에 투자할 수 있다는 점이 있을 것이고, 3) 번의 경우에는, 어쩌면, 하시려는 일을 모두 소화할 수 있는 툴을 찾으실 수 있을 것이라는 장점이 있습니다. (사실, 단순히 bmp를 명도단계 이미지로 만드는 것이야 현존하는 툴로 충분하죠)

1), 3) 번의 경우 말할 것도 없고, 2) 번의 경우 EasyBMP 라는 도구가 있는데, 얼마전에 비슷한 글에 URL을 적어뒀습니다. (freshmeat 등에서 쉽게 찾을 수 있습니다.)

컬러 이미지로부터 명암단계를 뽑아내는 과정에서 RGB 각각의 요소를 같은 비중으로 보시면 안됩니다. 예를 들어, #FF0000, #00FF00, #0000FF 는 각각 한 채널에 대하여 100%, 다른 두 채널에 대하여 0%인 조합들이지만 이들의 명도단계가 같지는 않습니다. 상대적으로 G 요소는 밝기에 많은 영향을 주는 요소이고 R, B는 비교적 밝이에 대한 영향을 적게 미치는 요소입니다.

참고로, 여러 색공간(color space) 중에 YCrCb라는 것이 있는데, 이것은 명도단계(Y)와 붉고 푸른 정도(Cr, Cb)의 세 값을 이용하여 색을 표현합니다.

색공간, 색의 표현 형식,... 등에 대한 기초 지식을 찾아보시면 원하시는 작업을 위해 어떻게 접근해야 할지... 길이 보이실것 같습니다.

--
"The love you take is equal to the love you make." The End, by Beatles

lifthrasiir의 이미지

younkyun wrote:
24bit bmp 파일을
gray 영상으로 바꿀라구 하는데요...
물론 리눅스에서 C 로 프로그램 합니다..

일단 파일 불러오는것 부터 막히 거등요...
어찌해야 좋을지요....ㅜㅜ......
관련된 소스나 자세한 설명 부탁드릴께요...

공부하시는 거라면 bmp 파일 포맷에 대해서 이해하는 것이 좋을 겁니다. 크게 어려운 편은 아니고, 바이너리 파일을 어떻게 다뤄야 하는 지 익히는 데 좋을 것 같네요. bmp 파일 포맷 자체는 압축을 아예 하지 않는 방법과 RLE(Run-Length Encoding) 방식을 이용한 초보적인 압축 방법을 선택해서 사용할 수 있게 되어 있는데, 풀어 내는 방법 자체는 그냥 스펙 보고 따라 해도 되니까-_- 큰 문제는 없을 겁니다.

일단 포맷을 이해한다면 읽기 쓰기는 별 무리가 없으실 거고, grayscale로 바꾸는 것은 sio4 님의 말씀처럼 r,g,b를 평균 내는 것보다 가중치를 적당히 줘서 변환하는 것이 더 좋겠습니다. 위키백과 같은 곳을 참고하세요.

- 토끼군

익명 사용자의 이미지

문제해결을 위한 큰 틀은 윗분들께서 이미 제시하신 것 같네요.
파일포맷에 대한 것으로는 'bitmap 파일 형식' 과 같은 키워드로 구글해보시면 많은 자료를 얻을 수 있을 것 입니다. (한글 자료도 많을 거예요~)

그리고 grayscale 로 변환하는 것은 'rgb to yuv' 를 이용하시면 되겠습니다.
yuv 성분 중 y 는 luminance, u와 v는 chrominance 를 의미합니다.
그 변환식은, 자료마다 조금씩 차이는 있지만, 대략 아래와 같습니다.

Y = 0.2990R + 0.5670G + 0.1140B
U = -0.1687R - 0.3313G + 0.5000B
V = 0.5000R - 0.4187G - 0.0813B

grayscale 로의 변환에는 luminance 성분인 Y 값만 있으면 되겠네요 :)

익명 사용자의 이미지

sio4 wrote:
일단 파일을 처리하는 과정에는

1) bmp 형식에 대한 이해를 기반으로 직접 구현한다.
2) bmp 형식에 대한 다른 사람의 구현을 빌려쓴다.
3) bmp를 포함한 일반적인 이미지 처리 라이블러리/툴을 찾아 사용한다.

등의 방법이 있을겁니다. 물론, 공부를 목적으로 하는 것이라면 1) 번을 선택하시겠지만 그렇지 않다면 2)나 3)을 쓰시는 편이 좋겠죠.

2) 번의 장점은 데이터 형식에 관한 부분에 신경을 끄고 다음 단계에 투자할 수 있다는 점이 있을 것이고, 3) 번의 경우에는, 어쩌면, 하시려는 일을 모두 소화할 수 있는 툴을 찾으실 수 있을 것이라는 장점이 있습니다. (사실, 단순히 bmp를 명도단계 이미지로 만드는 것이야 현존하는 툴로 충분하죠)

1), 3) 번의 경우 말할 것도 없고, 2) 번의 경우 EasyBMP 라는 도구가 있는데, 얼마전에 비슷한 글에 URL을 적어뒀습니다. (freshmeat 등에서 쉽게 찾을 수 있습니다.)

컬러 이미지로부터 명암단계를 뽑아내는 과정에서 RGB 각각의 요소를 같은 비중으로 보시면 안됩니다. 예를 들어, #FF0000, #00FF00, #0000FF 는 각각 한 채널에 대하여 100%, 다른 두 채널에 대하여 0%인 조합들이지만 이들의 명도단계가 같지는 않습니다. 상대적으로 G 요소는 밝기에 많은 영향을 주는 요소이고 R, B는 비교적 밝이에 대한 영향을 적게 미치는 요소입니다.

참고로, 여러 색공간(color space) 중에 YCrCb라는 것이 있는데, 이것은 명도단계(Y)와 붉고 푸른 정도(Cr, Cb)의 세 값을 이용하여 색을 표현합니다.

색공간, 색의 표현 형식,... 등에 대한 기초 지식을 찾아보시면 원하시는 작업을 위해 어떻게 접근해야 할지... 길이 보이실것 같습니다.

소맛라면의 이미지

Anonymous wrote:
1. bmp파일 포맷을 분석: 헤더+바디
=> 이미지의 각 픽셀에 대한 RGB(red, green, blue)를 추출
2. 단순하게 g를 기준으로 r,b에 g의 값으로 채운다.
3. 이를 디스플레이해본다.
* 음... 그럴듯한가? 본다.
*사실 dithering 알고리즘을 찾아서 해결하시는게 올바른 접근입니다.

bmp파일은 어떻게 분석하나요??

무엇을 위해 사는가..

deisys의 이미지

색공간으로 YUV, YCrCb 같은게 언급되었는데 HSV, HSL 같은 녀석들은 어떤가요? Dithering에는 별로 적합하지 않은가요?

제가 코드에 사용해본건 HSV뿐인데, 당시 그것만으로도 굉장한 충격이었습니다. "새...색깔을 이렇게 쉽게 구분하다니" (Hue값을 보고 나서였죠.)

아, 위키에 이런부분이 있군요.

Quote:

YUV models human perception of color more closely than the standard RGB model used in computer graphics hardware, but not as closely as the HSV color space.

......

they remain compatible with black and white analog television

......

Another advantage of YUV is that some of the information can be discarded in order to reduce bandwidth

사람의 시각을 흉내내는 데에는 HSV가 적당하다. ... TV등의 영상장치에 사용하거나 제한된 bandwidth를 가진 선로를 통해 영상을 뿌릴때에는 YUV가 유리하다 ... 정도인가요. 저 두번째 문장으로 봐서는 YUV나 YCrCb쪽이 디더링에 낫다고 추측해볼 수 있겠군요.

lifthrasiir의 이미지

소맛라면 wrote:
Anonymous wrote:
1. bmp파일 포맷을 분석: 헤더+바디
=> 이미지의 각 픽셀에 대한 RGB(red, green, blue)를 추출
2. 단순하게 g를 기준으로 r,b에 g의 값으로 채운다.
3. 이를 디스플레이해본다.
* 음... 그럴듯한가? 본다.
*사실 dithering 알고리즘을 찾아서 해결하시는게 올바른 접근입니다.

bmp파일은 어떻게 분석하나요??

wotsit 같은 곳에서 문서를 뒤져 보세요.

- 토끼군

익명 사용자의 이미지

* 그래픽 파일 포맷 분석
그냥 책하나 사세요. Bitmaped graphics등 유사책들이 널렸겠습니다.
Graphics File Format, 이 책도 좋고,
인터넷 문서도 좋고, 그러나, 그래픽 파일 포맷을 분석하는게 그리 의미있는 작업은 아닙니다.(학습이 목적이라면 의미있음!)
요즘에는.....말이지요.

* 포맷을 보다보면, 응용 알고리즘(압축등)을 접하게도 되고, 칼라에 대한 개념등을 부수적으로 얻게 됩니다.

byungsil의 이미지

gray = r * 0.30 + g * 0.59 + b * 0.11

jungjury의 이미지

파일 불러오는것과 저장하는것을 쉽게 하실려면 사용해보시는 것도 좋을것 같네요...

http://www.libsdl.org/
http://www.libsdl.org/projects/SDL_image/

안녕하세요 : )

liush79의 이미지

void effect_gray( PBYTE out_buf, PBYTE in_buf, int stride, int height )
{
     int gray = 0;
     int n_stride = 0;
     for( int i = 0; i < height; i++ )
     {
          n_stride = i*stride;
          for( int j = 0; j <= stride; j+=4 )
          {
               gray = (in_buf[n_stride+j+0]+in_buf[n_stride+j+1]+in_buf[n_stride+j+2])/3;
               out_buf[n_stride+j+0] = gray;
               out_buf[n_stride+j+1] = gray;
               out_buf[n_stride+j+2] = gray;
               out_buf[n_stride+j+3] = 255; // 알파값 고정
           }
     }
}

32bit(4byte) 소스 이니까

24bit 로 수정 하심 될겁니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.