Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaで2つの画像を比較する方法:RGB差分から類似度をパーセンテージで算出

2つの画像を比較する手順

Javaで2枚の画像を比較し、その差分をパーセンテージとして求めるには、以下の手順に従います。

  • ImageIO.read() メソッドを使って、比較対象となる2枚の画像を読み込みます。
  • それぞれの画像の幅と高さを取得し、両者のサイズが一致しているかを確認します。
  • 各画像のピクセル値を取得し、そこからRGB(赤・緑・青)の各値を取り出します。
  • 2枚の画像の対応するピクセル同士のRGB値の差をすべて合計します。
  • 次の式を使って、差分の割合(パーセンテージ)を計算します。
Average = difference / (width × height × 3);
Percentage = (Average / 255) × 100;

ここで difference は全ピクセルのRGB差分の合計値、width と height は画像の幅と高さです。RGBの3チャンネル分を掛けることで1ピクセルあたりの平均差分を求め、それを最大値255に対する割合として百分率に変換しています。

サンプルコード

import java.awt.Color;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.File;

public class ComparingImages {
   public static void main(String[] args) throws Exception {
      BufferedImage img1 = ImageIO.read(new File("D:\\Images\\test1.jpg"));
      BufferedImage img2 = ImageIO.read(new File("D:\\Images\\test2.jpg"));
      int w1 = img1.getWidth();
      int w2 = img2.getWidth();
      int h1 = img1.getHeight();
      int h2 = img2.getHeight();
      if ((w1 != w2) || (h1 != h2)) {
         System.out.println("両方の画像は同じサイズである必要があります");
      } else {
         long diff = 0;
         for (int j = 0; j < h1; j++) {
            for (int i = 0; i < w1; i++) {
               // ピクセルのRGB値を取得
               int pixel1 = img1.getRGB(i, j);
               Color color1 = new Color(pixel1, true);
               int r1 = color1.getRed();
               int g1 = color1.getGreen();
               int b1 = color1.getBlue();
               int pixel2 = img2.getRGB(i, j);
               Color color2 = new Color(pixel2, true);
               int r2 = color2.getRed();
               int g2 = color2.getGreen();
               int b2 = color2.getBlue();
               // 2つの画像のRGB値の差を合計
               long data = Math.abs(r1 - r2) + Math.abs(g1 - g2) + Math.abs(b1 - b2);
               diff = diff + data;
            }
         }
         double avg = diff / (w1 * h1 * 3);
         double percentage = (avg / 255) * 100;
         System.out.println("Difference: " + percentage);
      }
   }
}

入力画像1

Javaで2つの画像を比較する方法:RGB差分から類似度をパーセンテージで算出

入力画像2

Javaで2つの画像を比較する方法:RGB差分から類似度をパーセンテージで算出

実行結果

Difference: 92.54901960784314

この例では、2枚の画像の差分は約92.55%という結果になりました。この手法はピクセル単位の単純な比較であるため、比較する画像のサイズが同一である必要がある点に注意してください。また、特徴量マッチングやSSIM(構造的類似性)といったより高度な画像比較を行いたい場合は、OpenCVなどの画像処理ライブラリを活用すると効果的です。

  1. JavaとOpenCVで2つの画像にビット単位のOR演算(bitwise_or)を行う方法

    JavaでOpenCVを利用すれば、org.opencv.core.Coreクラスが提供するbitwise_or()メソッドを使って、2つの画像間でビット単位のOR(論理和)演算を簡単に実行できます。 このメソッドは、演算対象となる2つのソース画像と、結果を格納する出力先として、合計3つのMatオブジェクトを引数に取ります。処理では各要素(ピクセル)ごとにビット単位の論理和が計算され、その結果が出力先のMatオブジェクトに格納されます。OR演算では、対応するビットのどちらか一方でも1であれば結果が1になるため、2つの画像を重ね合わせたような効果が得られます。 サンプルコード 以下のJavaの例

  2. JavaとOpenCVライブラリを使って画像を保存(書き出し)する方法

    OpenCVライブラリを利用すると、画像フィルタリング、幾何学的変換、色空間の変換、ヒストグラム処理など、さまざまな画像処理操作を行うことができます。本記事では、その中でも基本的な操作である「画像の読み込みと保存(書き出し)」の方法を解説します。画像を書き出す(保存する)方法Imgcodecsクラスのimread()メソッドを使って画像を読み込むと、その内容はMat(Matrix)オブジェクトに格納されます。読み込んだ画像をファイルとして保存するには、imwrite()メソッドを使用します。imwrite()メソッドは、以下の2つの引数を受け取ります。file:保存先のファイルパスを表す文字列