簡體   English   中英

WICConvertBitmapSource BGR 到 Gray 的意外像素格式轉換

[英]WICConvertBitmapSource BGR to Gray unexpected pixel format conversion

我正在使用WICConvertBitmapSource function 將像素格式從 BGR 轉換為灰色,我得到了意想不到的像素值。

...

pIDecoder->GetFrame( 0, &pIDecoderFrame ); 

pIDecoderFrame->GetPixelFormat( &pixelFormat ); // GUID_WICPixelFormat24bppBGR

IWICBitmapSource * dst;
WICConvertBitmapSource( GUID_WICPixelFormat8bppGray, pIDecoderFrame, &dst );

具有以下 BGR 像素值的 4x3 圖像示例:

[  0,   0, 255,   0, 255,   0, 255,   0,   0;
   0, 255, 255, 255, 255,   0, 255,   0, 255;
   0,   0,   0, 119, 119, 119, 255, 255, 255;
 233, 178,  73, 233, 178,  73, 233, 178,  73]

我得到的灰色像素值:

[127, 220,  76;
 247, 230, 145;
   0, 119, 255;
 168, 168, 168]

我期望得到的灰色像素值( ITU-R BT.601 轉換

[ 76, 149,  29;
 225, 178, 105;
   0, 119, 255;
 152, 152, 152]

后台發生了什么樣的轉換,有沒有辦法強制轉換為我想要的行為?

另外值得一提的是,對於 Gray -> BGR 和 BGRA -> BGR,轉換工作正常(如預期的那樣)

至於“后台發生了什么樣的轉換”這個問題:似乎使用了不同的轉換算法。 使用 WINE 項目來計算灰度值,似乎給出了相同的結果,所以它給了我們一個很好的近似值。 使用的公式是R * 0.2126 + G * 0.7152 + B * 0.0722

copypixels_to_8bppGray來源):

float gray = (bgr[2] * 0.2126f + bgr[1] * 0.7152f + bgr[0] * 0.0722f) / 255.0f;

除此之外,它還針對 sRGB 顏色空間進行了校正。

copypixels_to_8bppGray來源):

gray = to_sRGB_component(gray) * 255.0f;

to_sRGB_component ( 來源):

static inline float to_sRGB_component(float f)
{
    if (f <= 0.0031308f) return 12.92f * f;
    return 1.055f * powf(f, 1.0f/2.4f) - 0.055f;
}

插入一些值:

    B    G    R    WINE          You're getting
      0    0  255  127.1021805   127
      0  255    0  219.932749    220
    255    0    0   75.96269736   76
    0    255  255  246.7295889   247
    255  255    0  229.4984163   230
    255    0  255  145.3857605   145
      0    0    0   12.92          0

至於另一個問題,我對框架太陌生,無法回答,所以我將把它留給其他人回答。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM