Introduction
何年画像処理の仕事やっているのって話な内容だけど…。
Stride の計算方法があやふやになって、すぐに思い出せなかったのと 4 バイトアライメントが Width に対して適用されると完全に間違って思っていたので忘備録。
同時に、何故か OpenCV の RGB オーダーが RGB だと思い、Windows の Bitmap の順番と違うと完全に勘違いしていた。
コードは下記。
Wrap up!!
Stride
4 バイトアライメントになるのは、行あたりのバイト数であって、幅ではない。
例えば、21 x 21 の 24bit Bitmap の場合、System.Drawing.Imaging.BitmapData が返す各プロパティは下記になる。
Property | Value |
---|---|
Stride | 64 |
Width | 21 |
Height | 21 |
なお、OpenCV の Mat の場合、21 x 21 の 24bit の png を読み込んだ場合、Mat が返す各プロパティまたはメソッドは下記になる。
Property/Method | Value |
---|---|
Step() | 63 |
Cols | 21 |
Rows | 21 |
Stride の計算式は下記の通り。
Step = Width * Channels
Stride = Step + (4 - Step % 4) % 4;
上記式の 4
は 画像の形式云々の 32bit という意味ではなく、あくまで 4 バイトに合わせるという意味である。
つまり、指定した Step
以上の最小の 4 の倍数を求めているだけである。
だから、Step
が 72
の場合は 72
のまま。
また、上記の公式は 8bit だろうが、16bit だろう 32bit にも適用できる。
下記はそれを示した単体テスト。
1 | public static int RoundUp(int width, int factor) |
もっとも、8bit はともかく、16bit のビットマップなんぞお目にかかるとは思えないが。
RGB の順序
画素データを抜き出すコードが省かれているが、おおよそは下記の通り。
1 | [ ] |
Source Code
https://github.com/takuya-takeuchi/Demo/tree/master/ComputerVision/OpenCV/C#/05_StrideAndRGBOrder