神が子猫を殺さないように文書にシールを挿入する方法

Elbaユーザーには、シール、署名の画像をアカウント、行為、請求書、その他の重要な文書に挿入するという夢がありました。 夢想家を喜ばせてはどうだろう、と私たちは考えた。 周りを見てみると、通常、このような場合、すべての汚い仕事はユーザーのせいであることがわかりました(まあ、あなたは知っています:「写真は300 x 400ピクセル、高コントラスト、高解像度、完全に白い背景である必要があります」)。 しかし、コールセンターで行われる私たちのチームの経験から判断すると、カメラから画像をダウンロードするだけでも、ユーザーは深い不況に陥り、「Wordに画像を挿入する」という神様の方法で救助する必要があります。 もちろん、Photoshopでプリントをきれいにすることをユーザーに強制することは間違いありません。できる限り写真を撮らせてください。Elbaが残りの作業を行います。







透明な背景の鮮明な印刷と署名を得るために、電話または石鹸箱で撮影した写真で何をする必要があるかを知りたい場合は、読み進めてください。



実際に、スタンプと署名を処理する方法は1つではなく、3つに分けました。 これは良い人生からではありません-ある方法できれいにされた画像と、別の方法できれいにされた画像があります。 3つすべてを並行して使用し、ユーザーに以下を選択させます。







方法1:科学的アプローチ



どの写真もポイントのコレクションと見なすことができ、各ポイントには特定の色が付いています。 これに基づいて、タスクは非常に単純に見えます-印刷または署名の一部であるポイントのみを取得します。



アイデアは次のとおりです。何らかの方法で元の画像を白黒画像(背景が黒、印刷が白)に変え、すべての白いドット(マスク)のセットを元の画像と交差させます。 座標が白い点と一致する元の画像の部分は、印刷と見なされます。 より詳細に:

  1. 写真を撮る







  2. グレーに翻訳







  3. エッジ検索を実行する



    ここでは、エッジとは何か、どのようにエッジを探しているのかを説明する必要があります。 この図では、色が均一な領域(碑文と円)があり、エッジ自体がこれらの領域の境界です。 多くのグラフィックパッケージとライブラリには、水平エッジと垂直エッジを個別に選択する標準の「Sobel」フィルターがあります(より具体的にはグレーの画像)。 以下は、Sobelに従ってエッジを選択する良い例です。







    そして、これが画像でエッジがどのように見つかったかです:







  4. そのため、印刷のアウトラインを取得しましたが、それは不均一です。黒と白の領域(背景と印刷)に加えて、背景または印刷に近い色のドットがかなりあります。 背景や画像などのポイントを発表することにより、すぐに認識の品質を向上させます。 画像を粗くします。







  5. これらすべての変換の後、印刷領域をかなり適切に選択しました。 しかし、写真全体にゴミがあります-「孤独な」白い点。 「孤独」はキーワードであり、周囲には常に多くの黒人がいます。 次に、画像の解像度を下げます。20×20ポイントの各正方形の代わりに、1つの大きなポイントを作成します。 その色は、この正方形に入ったすべての点の色の平均として定義されます。 白い孤独な点は必然的に黒に変わります。 その後、再び画像を粗くします。







  6. その結果、単一のポイントの形ですべてのゴミが消えた、我々はシールが保証される領域を十分に特定した。 さらに、エッジがあります(「Sobelによると」を見つけたことを思い出してください)。 受け取ったものとエッジを交差させてください。







これをマスクとして元のプリントに適用すると、次のようになります。







画像要素から十分に遠いものはすべて捨ててしまいましたが、これはもちろん成功です。 しかし、印刷物の近くの背景の詳細​​は削除しませんでした。 これは、画像の近くの背景色が写真自体(低品質の写真、不均一な照明など)と十分な違いがなく、粗くする際にこれらの領域が背景に割り当てられなかったために発生しました。 非常に簡単な手順ですぐに提案されます-可能な限り、印刷と印刷の近くの背景領域の違いを増やします。 これを行うのは非常に簡単です。コントラストを上げます。 これを行うには、アンチエイリアスとHistogramEqualizationを使用して元の写真を実行しましょう。







その結果、印刷​​物から遠く離れた背景は印刷物と同じ色になりましたが、気にすることはありません。背景を破棄し、写真に近い背景の領域でのみ作業することを学びました。 それは技術の問題であり、新しいアイデアはありません。灰色、反転、粗い。







したがって、シールの近くのゴミを除くすべてをクリーニングする方法を知っており、結果として何が起こるかをすでに見ています。 印刷物の近くのゴミをきれいにすることを学びましたが、最初に得た結果を適用します:







すでに悪くない。 わずかにぼかしたり、コントラストを上げたり、背景を透明にしたりする必要があることは明らかです。



確かに、高解像度の写真に問題が見つかりました(残念ながら、カメラのメガピクセルをめぐる競争は携帯電話の所有者にも余裕がありませんでした)-幅(10ピクセル、場合によっては100ピクセル)の印刷行は、エッジを2つの別々の行に検索した結果、分割され始めました。



このような小さなトラブルを解消するには、クロージングを使用できます。 私たちの場合、閉鎖は、ストローク間の距離が大きすぎない場合にのみ、ペアのストローク間の背景のすべてのセクションが塗りつぶされるという事実につながります。 AForge.Closingフィルターのドキュメントのクロージャーの例を次に示します。











空洞は、連続した数ピクセル以上の閉鎖をカバーする方法を知らないことがわかります。 そして、私たちと一緒にいる空洞のサイズは、シールが撮影された解像度に依存します。



どうやら-まあ、必要な解像度に合わせて解像度を設定します(特定の値は愚かに実験的に設定されます)。 しかし、問題は、人々が大きな余白のあるプリントの写真を撮ることができる(そして愛する)ことです。



画像を「最適なサイズ」に圧縮すると、写真の隅に小さなプリントができます。



その結果、2回アルゴリズムを実行せずに実行することにしました。 初めて大きなゴミ(および、場合によってはシールの小さな部分)を取り除き、写真のどこに印刷物があるかを理解します。 その後、再び元の写真を撮り、印刷で既に知っている場所を切り取り、目的のサイズに拡大縮小して、背景をきれいにするアルゴリズムを再度実行します。



目標は達成されたように見えましたが、インターネットからスタンプや署名の例を取り上げ始めたとき、新しい問題に直面しました。 私たちのアルゴリズムがほとんどのシールで非常にうまく機能した場合、署名ではすべてがはるかに悪くなりました:写真のコントラストレベルは、エッジの検索が単に線の半分を失うだけであることがあり、検索のバーを下げることも危険です-さらに「ゴミ」の束を取得するリスクがあります



方法2:偉大な自転車の発明



エッジやその他の付加機能を検索する必要があるのはなぜですか? 結局のところ、署名は非常に単純なものです。明るい紙の上に濃いペンでいくつかの線を描きます。



一見したところ、暗闇を光から分離することは小さな科学です。 まず、「私たちと一緒にいない人」というコード名のアルゴリズムは非常に単純に見えました。明るさがグレーよりも高いすべてのポイントをソートし、「背景」に書き込み、それらを破棄します。 「ペン」のために、より暗いものはすべて残されています。



彼らは出会った最初のサインを運転しました-歓声、それはクールです!







彼らは2番目の完全なファイルを運転しました。







何らかの理由で、インターフェイスデザイナーは最初の考えを承認しませんでした-アップロードフォームに「写真をもっとコントラストで撮ってください」とスコアを付けます。 私は脳をオンにしなければなりませんでした。 一部の写真では機能しますが、他の写真では機能しないため、自分で写真を正規化する必要があります。 写真を撮り、すべてのポイントを調べ、簡単なヒストグラムを作成しました。256個の可能な輝度のそれぞれで、この同じ輝度のポイントの数を計算することは一般的でした。 最小の輝度、次に最大の輝度を見つけて、「中間のどこか」のポイントを選択し、背景を切り取りました。







ほら、私たちは言って、ゴミのサインの喜びの例を探し始めました。 まあ、可能な限り多くの証拠を見つけるために、私たちは何の良い仲間です。 人生はいつものようにもっと面白くなりました。文字通り2枚目の写真では、再びハードファイルを待っていました。 「真ん中のどこか」というポイントをどのように選択しても、背景が隅に残っているか、署名の一部が消えています。







ひそかに結果を見て、彼らはオリジナルを開き、考え始めました。



パズルはありませんでした。光だけが消え、写真の一方の端の背景がもう一方のペンよりも暗くなりました(後で判明したように、これは実際に頻繁に起こります)。 明らかに、この状況では、目的のポイントは存在しません。



パラメーターをさらにねじることは無意味であることがわかりました。 彼らは論理的に推論し始めました。「ここで写真を見ると、署名が完全に見えます。 したがって、コントラストは十分です。 少なくとも局所的なコントラスト。」



「ローカル」という言葉が急激に復活し、決定したとき:写真全体に対して「ペンは暗い、背景は明るい」などの点を選択できないため、画像の一部でこれを実行しようとします。



それらは長方形に分割され(実験的に10x10のグリッドに満足しました)、アルゴリズムを各セルに個別に適用しました。 すべては問題ありませんが、セルの一部は背景のみで満たされていることが判明しました。 ここでは簡単です。背景以外に何もないので、ローカルコントラストは非常に低くなります。 これは、ヒストグラムの最も明るい点と最も暗い点が非常に近いことを意味します。



うまくいくようです。







別のセルを取得し、そこからヒストグラムを作成し、左端(最小輝度)と右端(最大輝度)を確認します。 次に、コントラストであるデルタを取得します。 コントラストが特定の値よりも小さい場合(少なくとも、画像の全体的なコントラストに基づいて計算されます)、セル全体を背景と見なし、余分な部分を除外します。 コントラストが大きい場合、「セクション」のポイントを決定し、より明るいものをすべて切り取ります。



3番目の方法、最終



2つのオプションが少し見えたので、3番目のオプションを追加することにしました。「ほぼ完璧な」写真の簡単な処理で、背景全体が白(まあ、またはほぼ白)です。 これを行うために、最大輝度の95%より明るいすべてのピクセルをノックアウトし、フィールドを切り取りました。

その結果、冒頭で述べたように、ユーザーは3つのオプションのいずれかを選択します。 どのオプションも表示されない場合(非常にまれです)、カメラの「傑作」ボタンを押す方法について説明します。



自分試してみることができます 。たとえ印刷物がなくても、署名方法を知っていると思います;)



All Articles