2013-07-12 6 views
7

JPEG 이미지를 사용하고 PGM (Portable Gray Map) 버전을 반환하는 변환기 알고리즘을 작성하려고합니다. 문제는 "공식적인"JPG -> PGM 변환기가 고전적인 RGB 형식에서 시작하여 최종 픽셀 (내 생각에, 0-> 255)에 할당 할 값의 관점에서 어떻게 작동하는지 이해할 수 없다는 것입니다."표준"RGB에서 회색조로 변환

0.30 * R + 0.59 * G가 + 0.11 * B = 브로

I 쓴 단순한 코드 : 시작시

는 I (이것은 OpenCV의의 CV_RGB2GRAY 변환에 의해 사용되는 동일한 'S) 공식을 사용 내 결과를 테스트 해 보라 : 컬러 이미지와 PGM 버전 (이미 김프를 사용하여 변환 된 이미지)이 필요하다. 그런 다음 이전 공식을 사용하여 컬러 이미지를 변환합니다. 목표는 PGM 입력과 동일한 픽셀 대 픽셀의 회색 음영 이미지를 만드는 것입니다.

이 시점에서 동일한 값을 반환하지 않습니다. 나 좀 도와 줄 수있어?

+0

이미 [wikipedia : Grayscale] (https://en.wikipedia.org/wiki/Grayscale)을 보셨습니까? – MrSmith42

+0

그게 사실입니까? Y 평면을 디코딩하고 색 계수를 무시하면 어떨까요? 당신은 다른 소음을 가질 것이고, 요인들은 다를 수 있습니다. – harold

+0

죄송합니다, 내 게시물을 이해하지 못합니다. – TheUnexpected

답변

5

문제는 내가 "공식적인"JPG-> PGM의 convertitors이 (내가,> 255 0 - 추측) 고전부터 최종 픽셀에 할당하는 것을 가치의 측면에서 어떻게 작동하는지 이해 할 수 없다는 것입니다 RGB 형식.

"공식"도구에서 사용하는 변환에서 감마 조정이있을 수 있습니다.
즉, 은 단순한 선형 변환이 아닙니다. Converting color to grayscale

난 당신이 Csrgb의 공식을 사용하려는 생각 :

은 자세한 내용은이 위키 백과 섹션을 참조하십시오.
시험해보고 예상 한 결과와 일치하는지 확인하십시오.기본적으로

, 당신은이 작업을 수행 할 수 있습니다 :

  1. 들이 대신 범위 0..255에 있다면, 단순히 255.0
  2. 에 의해 분할
    • ([0,1] 범위에서 각) R, G, B 색을 가지고
    • 계산 Clinear = 0.2126 R + 0.7152 G + 0.0722 B
      • 이것은 선형 일 가능성이 높습니다. 이 Clinear
        • 에 기초하여, 수식의이하면
        • 체크 아웃 this WolframAlpha plot
        • Csrgb = 12.92 Clinear 누락 된 비선형 감마 보정 조각하면
      • 계산 Csrgb이있어서 전에인가 된 변형시 Clinear <= 0.0031308
      • Csrgb = 1.055 Clinear1/2.4 - 0.055Clinear > 0.0031308
+0

@ alessandro.francesconi 나는 위키피디아 페이지가 약간의 기본적인 색 과학에 익숙하지 않은 경우 조금 애매 할 수 있기 때문에 정확한 단계를 설명하기 위해 조금 대답을 업데이트했다. –

+1

@ alessandro.francesconi 또한 감마 보정의 비선형 모양을 볼 수 있도록 WolframAlpha 플롯을 추가했습니다. –

+0

만약 내가 틀렸다면 Timothy, 제발 정정 해주세요.하지만 단계 (1) 이후에 선형 강도로 값을 변환해야합니다. 왜냐하면 RGB 값을 파일에서 가져올 때 이미 1/2.4로 감마 부호화되어 있기 때문입니다. 먼저 파워 2.4로 변형을 적용하여이 인코딩을 제거한 다음, 답의 단계 (2)와 (3)을 수행해야합니다. 그게 맞습니까? –

1

이론상 몇 가지 픽셀 (이 경우 3 개)을 사용하면 알고리즘이 수행하는 작업을 결정할 수 있습니다. Juste는 자신의 RGB 값과 PGM 회색 값을 사용자의 세 가지 픽셀 (P1, P2, P3)를 선택하고, 당신은 :

RedConstant * p1.redValue + GreenConstant * p1.greenValue + BlueConstant * p1.blueValue = (P1) .grayValue

RedConstant p2.redValue * + * GreenConstant p2.greenValue BlueConstant + * = p2.blueValue p2.grayValue

RedConstant p3.redValue * + * GreenConstant p3.greenValue BlueConstant + * = P3 p3.blueValue .grayValue.

그런 다음이 문제를 해결하고 ("방정식 해결사"또는 그 밖의 것을 찾아보십시오) 사용하는 상수가 무엇인지 확인하십시오.

+0

고마워요. 그렇지만, 작동하지 않습니다. 나는 3 개의 픽셀 값을 넣고 3 방정식 시스템을 풀었다. 그 방정식에 좋은 세 개의 상수가 나오고 네 번째 픽셀은 아닙니다. – TheUnexpected

+0

1) RGB와 회색 값에 대해 동일한 픽셀을 선택 했습니까? 2) : http : //www.tannerhelland.com/3643/grayscale-image-algorithm-vb6/저는 RGB-to-PGM 알고리즘이 서로 다르다는 것을 알았습니다. 그것들을 모두 시험해보고 사용 된 것을 발견하십시오. 행운을 빕니다! – Fabinout

+0

유효한 방법을 찾지 못했다고하면 어떻게됩니까? – TheUnexpected

1

SIMPLE 알고리즘을 OpenCV 파이썬에서 그레이 스케일로 RGB 이미지를 변환하는!

코드를 사용하여 코드가 자명합니다. 그러나 신속하게 작동합니다.

import cv2 
import numpy as np 
img1 = cv2.imread('opencvlogo.png') 
row,col,ch = img1.shape 
g = [ ] #the list in which we will stuff single grayscale pixel value inplace of 3 RBG values 
#this function converts each RGB pixel value into single Grayscale pixel value and appends that value to list 'g' 
def rgb2gray(Img): 
    global g 
    row,col,CHANNEL = Img.shape 
    for i in range(row) : 
     for j in range(col): 
     a =  ( Img[i,j,0]*0.07 + Img[i,j,1]*0.72 + Img[i,j,2] *0.21 ) #the algorithm i used id , G = B*0.07 + G*0.72 + R* 0.21 
                        #I found it online 
     g.append(a) 
rgb2gray(img1) #convert the img1 into grayscale 
gr = np.array(g) #convert the list 'g' containing grayscale pixel values into numpy array 
cv2.imwrite("test1.png" , gr.reshape(row,col)) #save the image file as test1.jpg 
SO

나는이 이미지 파일을 사용 ... enter image description here

그레이 스케일 다음 파일을 생성

내 프로그램 ..

은 "Y 평면"에 대한 해롤드의 점에

enter image description here

0

: 표준 색상 JPEG는 YCbCr 색 공간을 사용하여 인코딩됩니다. 여기서 Y는 휘도 성분 (즉 밝기)이고 Cb 및 Cr은 파란색 및 빨간색 차이 색도 구성 요소입니다. 따라서 컬러 JPEG를 그레이 스케일로 변환하는 한 가지 방법은 단순히 Cb 및 Cr 구성 요소를 드롭하는 것입니다.

-grayscale 옵션을 사용하면 무손실로 수행 할 수있는 것보다 jpegtran이라는 유틸리티가 있습니다. (무손실 부분은 실제로는 generation loss을 피하기 위해 PGM이 아니라 JPEG로 끝나기를 원하는 경우에만 중요합니다.) 어쨌든이 변환을 수행하는 가장 빠른 방법 일 것입니다. 이미지를 픽셀 단위로 변환하여 각각에 대해 수학을 적게합니다.

관련 문제