私は1つを持っているBufferedImage image1
とBufferedImage image2
、私はそれらが等しいかどうかを知りたいです。
image1
前に手作り、私が使用して変換イメージファイル、に格納されますImageIO
。しかし、image2
非常に多く、彼らは異なるサイズを有することが保証され、その場で行われます。私が知っていることはつまりimage2
9種類の1に等しくなるimage1
のを。
彼らは同じイメージのあるのであれば、私は何をしたいのチェックですが、彼らは異なるサイズであるため、エッジ上のすべての白画素を無視することは、私はすべてのピクセルを比較する場合、彼らはどんな異なっないだろう。エッジの色の白があり、なぜあなたは迷っている場合は、残りのスペースは白になりますので、画像は数字があります。
あなたはそれを簡単にしたい場合は、実際の画像の色は常に黒になりますが、私は後で概念を使用することができますので、あなたがそれ(アカウント内のすべての色を取る意味)汎用ソリューション作る場合、私はそれをよりよくしたいと思います。
private boolean equals(BufferedImage image1, BufferedImage image2) {
// This is what I want to fill out.
}
私が最初に実行しようとしましたことのない最初の白画素を見つけることだったimage1
、との最初の非白くピクセルをimage2
、その後、everthingが等しいかどうかを確認するために、その後の行を確認してください。しかし、画像はかなり大きいです、そしてこのアプローチはO(N ^ 2)以上になります。私は、より高速な方法が必要です。
私が最初に実行しようとしましたことはイメージ1の最初の非白画素、及び画像2の最初の非白くピクセルを見つけ、その後、everthingが等しいかどうかを確認するために、その後の行を確認することでした。しかし、画像はかなり大きいです、そしてこのアプローチはO(N ^ 2)以上になります。私は、より高速な方法が必要です。
おそらくこのアプローチを使用していない、非常に高速な方法があります。あなたは、エッジ検出を使用することができますが、そのためのアルゴリズムは、あまりにも本当に速くはありません。
私は、各画像(番号)のための境界ボックスを仕事にしようとするだろう。
それは数がある大きさをimage1の節約することが可能であるならば、これは移動するための方法でした。ただ、数の実際の大きさに画像を縮小し、ディスクにそのイメージを保存します。その後、あまりにもそのバウンディングボックスに画像2を縮小することができますし、比較が高速で、非常にシンプルです。
縮小は、noオプションでない場合は、バウンディングボックスの計算はオプションです。画像アレイを通過し、最上部及び両画像における左端の画素を検出します。あなたは、あなたが画像を比較するために必要なすべてでトップと左側、のために少なくとも、境界エッジを取得します。(画像はサイズが異なることができれば、あなたは全体のバウンディングボックスを必要とします)
ところで、あなたは(N ^ 2)Oで実行する必要はありません。あなたは両方の画像の中で最も上部または左端のピクセルを検出した場合、あなたはから仕事にオフセットを設定することができます。あなただけのこれらの数字が異なっている状態との違いを見つける必要があります。あなたはそれが簡単なテストに基づくものでなければならない数を決定するためのロジックと連携することができます。例えば、テイク番号1(1)、ゼロ(0)のために。ゼロは、中央部に白画素を有するのに対し、一方が黒が画素及びその逆を有していなければなりません。だから、数字は間違いなくあなたは9つのエリアまでテストすることによって、画像内の数を推定黒または白の缶の助けをしている領域を検出します。