2013-07-12 38 views
7

JPEG画像を取り込み、そのPGM(Portable Gray Map)バージョンを返すコンバータアルゴリズムを作成しようとしています。 問題は、「公式の」JPG-> PGMコンバーターが、古典的なRGBフォーマットから始まる最終ピクセル(私は0-> 255)にどのような値を割り当てるのか理解できないということです。 *"標準" RGBからグレースケールへの変換

0.30 R + 0.59 * G + 0.11 * B =ヴァル

Iは、単純なコードとを書いた:開始時に

、私は、この式を(それはOpenCVののCV_RGB2GRAY変換で使用されるのと同じです)を使用し私の結果をテストしてください:カラー画像とそのPGM版(すでにGIMPを使って変換済み)が必要です。次に、前の式を使用してカラー画像を変換します。目標は、ピクセル単位でPGM入力に等しいグレースケールイメージを持つことです。

この時点では、同じ値が返されません。手伝って頂けますか?

+0

[wikipedia:Grayscale](https://en.wikipedia.org/wiki/Grayscale)を見たことがありますか? – MrSmith42

+0

本当にそうですか? Y平面をデコードし、色係数を無視するとどうなるでしょうか?さまざまなノイズがあり、その要因は異なる場合があります。 – harold

+0

申し訳ありませんが、私はあなたの投稿を理解していません – TheUnexpected

答えて

5

問題は、私は「公式」JPG-> PGMのconvertitorsは古典から始まる最終ピクセル(私は推測する、0-> 255)に割り当てるどのような値の面でどのように機能するかを理解することができないということですRGBフォーマット。

「公式」ツールで使用している変換では、ガンマ調整が行われている可能性があります。
つまり、は単なる線形変換ではありません。

は、詳細については、このWikipediaの項を参照してください:Converting color to grayscale

私はあなたがCsrgbための式を使用したいと考えています。
試してみて、期待している結果と一致するかどうか確認してください。

基本的に、あなたがこれをやる:

  1. は、彼らが代わりに範囲0..255にいる場合は、単に255.0
  2. で割る R, G, B色( [0,1]範囲内の各)
    • を取ります
    • 計算Clinear = 0.2126 R + 0.7152 G + 0.0722 B
      • これはおそらく線形ですあなたはそれに応じて
    • 計算Csrgb前に適用された変換はこれは、あなたがthis WolframAlpha plot
    • Csrgb = 12.92 ClinearときClinear <= 0.0031308
    • をチェック
    • を欠落していた非線形ガンマ補正作品ですClinear
      • に基づいて、式です
      • Csrgb = 1.055 Clinear1/2.4 - 0.055の場合Clinear > 0.0031308
+0

@ alessandro.francesconi私は基本的な色の科学に慣れていない場合、ウィキペディアのページはちょっと暗いかもしれないので、正確なステップを記入するために少し答えを更新しました。 –

+1

@ alessandro.francesconiまた、WolframAlphaプロットを追加して、ガンマ補正の非線形の形状を見ることができます。 –

+0

私が間違っていると私を修正してください。しかし、私はステップ(1)の後に線形強度に変換する必要があると思います。ですから、パワー2.4でtransformを適用してこのエンコーディングを削除し、次に答えのステップ(2)と(3)を実行するだけです。そうですか? –

1

理論的には、数ピクセル(この場合は3)で、アルゴリズムが何をしているのかを判断できます。 ジュストあなたの3つの画素(P1、P2、P3)、そのRGB値とそれらのPGMグレー値を選択し、あなたが持っている:

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.blueValue = P3 .grayValue。

次に、この問題を解決する(「方程式ソルバ」などを参照)、それらが使用する定数が何であるかを確認します。

+0

ありがとうございますが、いいえ、それは動作しません。私は3つのピクセル値を入れ、3方程式系を解いた。これらの方程式には良い3つの定数があり、4つ目のピクセルではありません。 – TheUnexpected

+0

1)RGBとグレー値に同じピクセルを選択してもよろしいですか? 2)この記事から:http://www.tannerhelland。com/3643/grayscale-image-algorithm-vb6 /私はそれらがいくつかの異なるRGBからPGMアルゴリズムであることを知りました。それらをすべて試して、どれが使用されているか調べてみてください。がんばろう! – Fabinout

+0

有効な方法が見つからなかったと伝えたらどうなりますか? – TheUnexpected

1

単純なアルゴリズムは、OpenCVのPythonでグレースケールに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をグレースケールに変換する1つの方法は、単にCbとCrコンポーネントをドロップすることです。

-grayscaleオプションを使用すると、これを無損失で実行できるユーティリティよりも、jpegtranというユーティリティがあります。 (可逆部分は実際には、generation lossを避けるためにPGMではなくJPEGで終わりたい場合にのみ重要です。)いずれにしても、これはおそらくこの変換を行う最も速い方法でしょう。画像をピクセルに変換し、それぞれの画像で数学を行う必要はありません。

関連する問題