6

各ピクセルを赤緑または青に色付けしてセグメント化しようとしている画像があります。各ピクセルの信頼スコアを計算し、信頼を反映するようにピクセルのアルファ透明度を調整したいと考えています。つまり、信頼が低いということは、ほとんど透明であることを意味します。OpenCVでこれを行う方法はありますか? そうでない場合、侵襲性を最小限に抑えたライブラリ (C++) を提案できる人はいますか?

MatAurelius が提案したように、4 チャネル 8 ビットを使用してみました。コードは次のとおりです。

cv::Mat m = cv::Mat(20,20, CV_8UC4);
    for(int i = 0; i < m.rows; i++){
        for(int j = 0; j < m.cols; j++){
            Vec4b& v = m.at<Vec4b>(i,j);
            v[0] = 255;
            v[1] = 0;
            v[2] = 0;
            v[3] = 0.5;
        }
    }

    imwrite("alpha.png", m);
    namedWindow("m");
    imshow("m", m);
    waitKey(0);

表示されている画像はすべて青 (透明度なし) で、画像は完全に透明です。

4

2 に答える 2

5

これを実現するには多くの方法があります。考えられる 1 つの方法は、個々のピクセルにアクセスして変更することです。imageが 4 チャネル、8 ビットであると仮定しcv::Matます。

auto& pixel = image.at<cv::Vec4b>(i,j);
pixel[3] = confidence;

ここでi、 とjはイメージ内のピクセルのインデックスです。

おそらくもっとエレガントな方法は他にもありますが、現在のコードによって異なります。

更新: あなたが説明する動作は予想されるものです。どうやら cv::imshow()透過性をサポートしていません。これは、表示された画像がすべて青色である理由を説明しています。

保存された画像に関しては、画像のタイプがCV_8UC4. つまり、各チャネル要素は として格納されますuchar。の値を割り当てる0.5とゼロに切り捨てられるため、保存された画像は完全に透明になります。

信頼度が range の float 値である場合は、[0,1]255 でスケーリングして、8 ビット イメージでサポートされる範囲に収めます。したがって、

v[3] = 0.5;

になる

v[3] = 0.5 * 255;
于 2013-04-24T15:56:31.890 に答える