2017-04-18 23 views
9

だから、私は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を使用するには、色に適切なスカラーを見つけ、光を取り除くために塗りつぶします。ここにはそのコードスニペットがありますが、それはいつもchanelsで8bitイメージが必要であると言ってクラッシュします。

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); 
+0

あなたはテーブルの上にグレアの影響を克服するために様々な角度から3-4スナップショットを取得してみてください。 – ZdaR

+1

あなたが答えに返答しないなら、それは難しいと思うでしょう。 –

+0

グレアはレンズフレア除去技術と非常によく似ており、簡単に言えば、RGB色空間に加えて最大値に近づけます。これの分布は複雑になる可能性があり、できるだけ現実的な背景を保つために空間フィルタを使用する必要があります。あなたが3x3マトリックスのセットから始まり、追加のグレア成分を除去し、タマネギの皮の様式で中心に向かって移動するようなもののためのタマネギの皮の方法があります。グレアパターンに従っているかどうかを調べ、それを削除することができます。 –

答えて

4

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

もちろん、機械学習は問題を解決することができますが、それは過度の可能性があります。私が上記のことをしている間、私はCLAHEに出くわしました。これは、ローカルのコントラスト向上のためにはうまくいきました。輪郭を検出する前にこれを試してみることをお勧めします。さらに、この目的のためにRGB/BGRの代わりにHSV/Lab/Luvなどの異なる色空間で作業することもできます。各チャンネルに別々にCLAHEを適用し、それらをマージすることができます。

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

Gray image

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

+0

CLAHEのテクニックはこの面では役に立たないようです。私はあなたが言ったことを試しましたが、それは働いていないようです。どのように役立つと主張していますか? –

+0

@JeruLuke HSVスケールでさまざまなパラメータを試しましたか? –

+0

はい、私はあなたが言ったように正確にそれを試しました。あなたの主張をもう少しサポートできますか?グレア除去の問題はかなり一般的です.... –

関連する問題