web-dev-qa-db-ja.com

画像Opencvの明るさを推定する

私はOpencvで画像の明るさを取得しようとしましたが、これまでのところcalcHistを使用して、ヒストグラム値の平均を検討しました。しかし、実際には画像の明るさを決定するものではないため、これは正確ではないと感じています。私は画像のグレースケールバージョンに対してcalcHistを実行し、明るい画像から得られた平均値と中程度の画像の平均値を区別しようとしました。私は今のところ成功していません。画像の明るさを推定するために、OpenCvを通じて実現できる方法またはアルゴリズムを私に手伝っていただけませんか?前もって感謝します。

19

HSVカラーモデル は、チャネルVが値である問題で役立つと思います。

「値は色の明るさであり、彩度によって変化します。値の範囲は0〜100%です。値が「0」の場合、色空間は完全に黒になります。値の増加に伴い、色空間の明るさは上がり、さまざまな色を示しています。」

したがって、画像をある色空間から別の色空間に変換するOpenCVメソッド cvCvtColor (const CvArr * src、CvArr * dst、int code)を使用します。あなたのケースではコード= CV_BGR2HSV.Thanは3番目のチャネルVのヒストグラムを計算します。

18
Ann Orlova

私は同じことを尋ねようとしていましたが、その後、同じような質問で満足のいく答えが得られなかったことがわかりました。 SOで見つけたすべての答えは、単一ピクセルのRGBとHSVの人間の観察に対処します。

私の観察から、画像の主観的な明るさもパターンに強く依存します。暗い空の星は曇り空よりも明るく見えるかもしれませんが、最初の画像の平均ピクセル値ははるかに小さくなります。

私が使用する画像は、顕微鏡によって生成されたグレースケールの細胞画像です。フォームはかなり異なります。非常に黒い背景にある小さな明るい点である場合もあれば、それほど暗い背景ではない、明るくない大きな領域である場合もあります。

私のアプローチは:

  • ホットピクセルを削除するためのしきい値を使用して、ヒストグラムの最大値(HMax)を見つけます。
  • HMax * 2/3とHMaxの間のすべてのピクセルの平均値を計算します

比率2/3を3/4に増やすこともできます(これにより、明るいと見なされるピクセルの範囲が減少します)。

同じ滴定の異なる細胞パターンが同様の明るさを生み出すので、アプローチは非常にうまく機能します。

PS:私が実際に聞きたかったのは、OpenCVまたはSimpleCVにそのような計算のための同様の関数があるかどうかです。コメントをありがとう!

7

明るい画像と暗い画像を区別するための簡単なチェックのためのOpenCV C++ソースコードのビット。これは、@ ann-orlovaによって何年も前に提供された上記の回答に触発されています。

const int darkness_threshold = 128; // you need to determine what threshold to use

cv::Mat mat = get_image_from_device();

cv::Mat hsv;
cv::cvtColor(mat, hsv, CV_BGR2HSV);
const auto result = cv::mean(hsv);

// cv::mean() will return 3 numbers, one for each channel:
//      0=hue
//      1=saturation
//      2=value (brightness)

if (result[2] < darkness_threshold)
{
    process_dark_image(mat);
}
else
{
    process_light_image(mat);
}
0
Stéphane