ぼやけや不均一な明るさの可能性がある画像をしきい値設定するための高速で信頼性の高い方法は何ですか?
例(ぼやけているが均一な明るさ):
画像の明るさが均一であるとは限らないため、固定のしきい値を使用することはできません。適応しきい値は問題なく機能しますが、ぼやけているため、機能に切れ目や歪みが生じます(ここでは、重要な機能は数独の数字です)。
また、ヒストグラム均等化(OpenCVのequalizeHist
関数を使用)を使用してみました。明るさの違いを減らすことなく、コントラストを上げます。
私が見つけた最善の解決策は、画像をその形態学的クロージング(この投稿のクレジット)で割って明るさを均一にし、再正規化してから、固定しきい値を使用することです(大津のアルゴリズムを使用して最適なしきい値レベルを選択します):
Android用OpenCVでのこのコードは次のとおりです。
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(19,19));
Mat closed = new Mat(); // closed will have type CV_32F
Imgproc.morphologyEx(image, closed, Imgproc.MORPH_CLOSE, kernel);
Core.divide(image, closed, closed, 1, CvType.CV_32F);
Core.normalize(closed, image, 0, 255, Core.NORM_MINMAX, CvType.CV_8U);
Imgproc.threshold(image, image, -1, 255, Imgproc.THRESH_BINARY_INV
+Imgproc.THRESH_OTSU);
これはうまく機能しますが、閉じる操作は非常に遅くなります。構造化要素のサイズを小さくすると、速度は上がりますが、精度は低下します。
編集:DCSの提案に基づいて、ハイパスフィルターを使用してみました。ラプラシアンフィルターを選択しましたが、SobelフィルターとScharrフィルターでも同様の結果が期待できます。フィルタは、特徴を含まない領域で高周波ノイズを拾い、ぼやけによる適応しきい値と同様の歪みに悩まされます。また、クローズ操作と同じくらいの時間がかかります。15x15フィルターの例を次に示します。
編集2:AruniRCの回答に基づいて、提案されたパラメーターを使用して画像でキャニーエッジ検出を使用しました。
double mean = Core.mean(image).val[0];
Imgproc.Canny(image, image, 0.66*mean, 1.33*mean);
接続された数字を取得するためにパラメータを確実に自動的に微調整する方法がわかりません。