2016-09-21 3 views
0

私はいくつかの画像処理コードのために使用しているテストjpegを持っています&私はpythonでopencvと同じ値のuint8値を取得しようとしていますが、PythonではCとPillow(scipy経由)私がgimpを使用してjpegを開くときに取得します。golangでjpegを読み込み、Python/Cと同じunit8の値を取得するにはどうすればよいですか?

色の値を8ビットシフトしてみましたが、これは正確に値を変換しません。丸めているとわかりません。私はすべて使用のlibjpeg GIMPとOpenCVの枕/ scipyのダウンロードを知っているので、私はhttps://github.com/pixiv/go-libjpegを使用しようとした

func Convert(img image.Image) *image.RGBA { 
    b := img.Bounds() 
    rgba := image.NewRGBA(b) 
    for y := b.Min.Y; y < b.Max.Y; y++ { 
     for x := b.Min.X; x < b.Max.X; x++ { 
      r32, g32, b32, _ := img.At(x, y).RGBA() 
      c := color.RGBA{uint8(r32>>8), uint8(g32>>8), uint8(b32>>8), 255} 
      rgba.SetRGBA(x, y, c) 
     } 
    } 
    return rgba 
} 

を使用して8ビットに画像を変換するが、これは依然として一致しません。どうすれば同じ結果を得ることができますか?

答えて

1

JPEG仕様には、デコーダ用のピクセルの正確な定義がないため、異なる実装ではわずかに出力が異なります。独自のlibjpegでも、整数または浮動小数点数演算を使用して、4つの異なる離散コサイン変換実装が実装されています。

imgがすでにimage.RGBAである場合、値はすべてuint8として保存され、ビットを前後にシフトするだけで何もしません。画像がimage.YCbCrの場合は、色変換アルゴリズムにも依存し、YCbCr.RGBA()メソッドはcolor.YCbCrToRGB関数と少し異なります。前者は精度を維持しようとしていますが、単純な右シフトで切り捨てるのではなく、値を適切に丸める必要があります。後者は仕様勧告に近いが、浮動小数点定数は使用されず、他の実装とは異なる場合がある。

最後に、画像自体にICCプロファイルが埋め込まれている可能性があり、画像のデコードに使用されるソフトウェアによっては、生のピクセルデータを表示するときにプロファイルが適用されている場合とされていない場合があります。

関連する問題