web-dev-qa-db-ja.com

写真opencvからまぶしさを取り除く

したがって、私はopencvを使用してドキュメントをキャプチャし、スキャンしてトリミングします。部屋に照明がない場合、それは完全に動作します。部屋に明かりがあり、テーブルにグレアがあり、ドキュメントがその近くにある場合、長方形の一部としてグレアも取り込みます。

写真からグレアを取り除くにはどうすればよいですか?

ここに私が欲しい画像を取得するために使用しているコードがあります:

 Mat &image = *(Mat *) matAddrRgba;
    Rect bounding_rect;

    Mat thr(image.rows, image.cols, CV_8UC1);
    cvtColor(image, thr, CV_BGR2GRAY); //Convert to gray
    threshold(thr, thr, 150, 255, THRESH_BINARY + THRESH_OTSU); //Threshold the gray

    vector<vector<Point> > contours; // Vector for storing contour
    vector<Vec4i> hierarchy;
    findContours(thr, contours, hierarchy, CV_RETR_CCOMP,
                 CV_CHAIN_APPROX_SIMPLE); // Find the contours in the image
    sort(contours.begin(), contours.end(),
         compareContourAreas);            //Store the index of largest contour
    bounding_rect = boundingRect(contours[0]);

    rectangle(image, bounding_rect, Scalar(250, 250, 250), 5);

ここで話されているまぶしさの写真です:

enter image description here

私が見つけたのは、inRangeを使用し、色に適切なスカラーを見つけて、光を取り除くためにペイントします。以下はそのコードスニペットですが、チャンネル付きの8ビット画像が必要であると常にクラッシュします。

Mat &image = *(Mat *) matAddrRgba;

    Mat hsv, newImage, inpaintMask;
    cv::Mat lower_red_hue_range;
    inpaintMask = Mat::zeros(image.size(), CV_8U);
    cvtColor(image, hsv, COLOR_BGR2HSV);
    cv::inRange(hsv, cv::Scalar(0, 0, 215, 0), cv::Scalar(180, 255, 255, 0),
                lower_red_hue_range);
    image = lower_red_hue_range;

    inpaint(image, lower_red_hue_range, newImage, 3, INPAINT_TELEA);
13
Miljan Vulovic

私は以前にこの問題に対処したことがあり、照明の変更は画像の検出と記述のためのコンピュータービジョンでは常に問題です。 RGB/BGRの代わりにHSV色空間の分類子を実際にトレーニングしました。これは、変化する入射光で画像を、突然の明るさ/暗いパッチがないラベルにマッピングしていました(これはラベルです)。これは私にとってはうまくいきましたが、画像は常に同じ背景でした(これも持っているかどうかはわかりません)。

もちろん、機械学習で問題を解決できますが、やり過ぎかもしれません。私が上記のことをしている間に、私は [〜#〜] clahe [〜#〜] に出くわしました。輪郭を検出する前にこれを試すことをお勧めします。さらに、この目的のために、RGB/BGRではなくHSV/Lab/Luvなどの別の色空間で作業することもできます。 CLAHEを各チャネルに個別に適用してから、それらをマージできます。

他に情報が必要な場合はお知らせください。私はあなたの画像でこれをpythonで実装しました、それはかなりうまくいきますが、私はあなたにコーディングを任せます。私は数日後に得た結果を更新するかもしれません(最初にそれらを取得することを望んでいます;))。それが役に立てば幸い。

Gray image

V channel of HSV after CLAHE - clipLimit=10, TileGridSize= (16, 16)

8
Rick M.