3

取るフラグと少し混乱していcv::imreadます。

私の目標は、このアルファ チャネルを持つアルファ チャネルを持つイメージをロードすることです (つまり、 としてCV_8UC4)。同時に、それらを常に 8 ビットの深さでロードしたいと考えています。

まず、以下を使用してみました。

cv::imread(/*path*/, cv::IMREAD_COLOR);

これにより、アルファ チャネルが取り除かれ、8 ビット イメージが返されます。透明な TIF の場合、すべてが適切に見えますが、透明な部分だけが黒くなっています。ただし、透明な PNG の場合は、完全に間違っているように見えます。

次に試したのは:

cv::imread(/*path*/, cv::IMREAD_ANYCOLOR);

結果は とまったく同じでしたcv::IMREAD_COLOR。次の試行:

cv::imread(/*path*/, cv::IMREAD_ANYCOLOR | cv::IMREAD_ANYDEPTH);

アルファ チャンネルはまだありませんが、画像の元の深度が保持されます。

それから私は試しました:

cv::imread(/*path*/, cv::IMREAD_UNCHANGED);

これは、PNG画像でも機能しました。ただし、現在は画像のビット深度が維持され、8 ビットに変換されません。これは、追加の手順で変換する必要があることを意味します。これは非常に効率的ではないかもしれないと思います。

また、OpenCV ドキュメントのフラグの説明も確認しました。そこには次のように書かれています。

IMREAD_UNCHANGED    
If set, return the loaded image as is (with alpha channel, otherwise it gets cropped).
IMREAD_GRAYSCALE    
If set, always convert image to the single channel grayscale image.
IMREAD_COLOR    
If set, always convert image to the 3 channel BGR color image.
IMREAD_ANYDEPTH     
If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit.
IMREAD_ANYCOLOR     
If set, the image is read in any possible color format.

したがって、明らかにIMREAD_UNCHANGEDアルファチャンネルのみをサポートしています。しかし、それでIMREAD_ANYCOLOR4 チャンネルの画像を読み取れない場合はどうすればよいでしょうか。

アルファ チャネルを 8 ビット深度に変換した画像を読み込む方法はありますか?

別のことは、私にはかなり奇妙に思えます: オプションを使用してIMREAD_UNCHANGED、アルファ チャネルで RGB 画像を読み取ると、結果は RGBA のように見えます。アルファ チャネルなしで RGB 画像を読み取ると、形式は BGR のようです。チャネルの順序が異なるのはなぜですか? OpenCV は常に BGR 順序付けを使用していると思いました。

次の例は、アルファ チャネルを含む PNG が正しくロードされた場合と正しくロードされていない場合の例です。

ここに画像の説明を入力 ここに画像の説明を入力

4

0 に答える 0