Background Removal API を試してみる
画像の背景を切り抜くサービスを、Javaから利用してみました。
準備
まずは上記サイトで登録とAPIキーの取得を行います。 各言語ごとにサンプルが用意されているので簡単に利用出来ます。
今回はJavaから利用するので、httpclientが必要になりました。 予めダウンロードしてクラスパスに通して置きます。
実装
このAPIでは画像が透過PNGとして出力されるようです。 イートスマートではJPEG形式の画像を利用しているので、最終的にPNGからJPEGへ変換する必要があります。 背景色が白の画像に透過PNGを重ね合わせ、JPEG形式で出力するコードを書いてみました。
public class RemoveBackground { final String API_KEY = "[API_KEY]"; void removeBackground(File from, File to) throws IOException { Response response = Request.Post("https://api.remove.bg/v1.0/removebg") .addHeader("X-Api-Key", API_KEY) .body( MultipartEntityBuilder.create() .addBinaryBody("image_file", from) .addTextBody("size", "auto") .build() ).execute(); response.saveContent(to); } void saveAsJpeg(File png, File jpeg) throws FileNotFoundException, IOException { BufferedImage source = ImageIO.read(png); int width = source.getWidth(); int height = source.getHeight(); BufferedImage dest = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); Graphics2D g2d = dest.createGraphics(); try { g2d.setBackground(Color.WHITE); g2d.clearRect(0, 0, width, height);[f:id:eatsmart:20190703203931j:plain] g2d.drawImage(source, 0, 0, width, height, 0, 0, width, height, null); } finally { g2d.dispose(); } ImageIO.write(dest, "JPEG", jpeg); } }
検証
もぐナビニュースで実際に使われた写真をサンプルに、背景画像を切り抜いてみます。
まずは以下の写真でテストを行いました。 お皿に乗ったお菓子がどう扱われるかが気になります。
以下のようになりました。
綺麗にテーブルクロスだけが切り抜かれお皿が残りました。
続いては、同じくお皿に乗ったパンケーキです。 先程の写真ではお皿が残りましたが、この写真ではホイップクリームがお皿からはみ出しています。 このあたりの影響はあるのでしょうか?
以下のようになりました。
こちらも先程の写真と同じく、お皿が残りました。 お皿からはみ出したホイップクリームが残っているので、背景と区別がされているようです。 写真の中央にお皿がある場合、背景の判別が行いやすいのかもしれません。
最後に、これまでとは異なる写真を試してみます。 テーブルの上のお皿ではなく、カップに入った状態です。 また、テーブルとスクリーンの2つの異なる背景があります。
以下のようになりました。
これまでの写真と同様背景は切り抜かれましたが、手前のクッキーが残ってしまいました。 また、カップの左下にも何かしら残っています。 これまでと異なり商品と背景の差があいまいで難易度は高いと思いますが、わずかな手直しで済みそうです。
まとめ
簡単な検証ですが、綺麗に背景が切り抜かれることがわかりました。 プログラムから利用することが想定されており、APIキーさえ取得すれば簡単に利用することが出来ました。 このAPIを利用して画像を事前に処理してけば、人は確認と手直しに専念することができそうです。