だから、私は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);
は話してグレアイムの写真です:
私が発見したものです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);
あなたはテーブルの上にグレアの影響を克服するために様々な角度から3-4スナップショットを取得してみてください。 – ZdaR
あなたが答えに返答しないなら、それは難しいと思うでしょう。 –
グレアはレンズフレア除去技術と非常によく似ており、簡単に言えば、RGB色空間に加えて最大値に近づけます。これの分布は複雑になる可能性があり、できるだけ現実的な背景を保つために空間フィルタを使用する必要があります。あなたが3x3マトリックスのセットから始まり、追加のグレア成分を除去し、タマネギの皮の様式で中心に向かって移動するようなもののためのタマネギの皮の方法があります。グレアパターンに従っているかどうかを調べ、それを削除することができます。 –