見出し画像

某オンライン書店の「COVER COMING SOON」の画像をヒストグラムでの類似度で判定し弾くためのプログラム(PHP)

近刊情報を扱うあちこちのサイトで、同じ色の「COVER COMING SOON」の画像を見たことがありませんか。あれ、元は某オンライン書店でまだ画像が準備できていない場合に表示される一時的な画像なんですが、某オンライン書店のアフィリエイト使ってるサイトだとよく見かけますよね。

あれ見るとなんとなく気持ちが下がります(個人の感想です)。

なので、自分で動かしている「近刊検索デルタ」では、表示しないように弾いています。具体的には、ヒストグラムを使って画像の類似度を判定し、似ている場合は弾いています(似ていない場合は使う)。

ということで、近刊検索デルタで実際に使っているコードを公開いたします。自分と同じような気持ちの方のお役に立てるようであれば幸いです。

// 使用するisbnは10桁の数値($isbn10)として用意する。

// 定数(近刊書影なしサンプル画像のヒストグラム)
$hgram = array( 0.30096571428571, 0.57156, 5.7142857142857E-6, 0, 5.7142857142857E-6, 0.019885714285714, 2.2857142857143E-5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.2857142857143E-5, 0, 0, 0, 0.00792, 0.0036, 0, 0, 1.7142857142857E-5, 0.0036457142857143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0002, 0, 0, 5.7142857142857E-6, 0.0057885714285714, 0.0045257142857143, 0, 0, 3.4285714285714E-5, 0.0026914285714286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.4285714285714E-5, 7.4285714285714E-5, 0, 0, 0, 0.078994285714286);

// 画像ファイルを読込み&画像サイズ取得
$filepath = "https://images-na.ssl-images-amazon.com/images/P/" .$isbn10 .".09.THUMBZZZ";
$img = imagecreatefromjpeg($filepath);
$width= imagesx($img);
$height= imagesy($img);

// カラーヒストグラムを生成
$histogram = array();
for ($i = 0; $i < 64; $i++) {
	$histogram[$i] = 0;
}
for($y = 0; $y < $width; $y++){
	for($x = 0; $x < $height; $x++){
		$rgb = imagecolorat($img, $x, $y);
		$r = ($rgb >> 16) & 0xFF;
		$g = ($rgb >> 8 ) & 0xFF;
		$b = $rgb & 0xFF;
		$redNo = (int)($r / 64);
		$greenNo = (int)($g / 64);
		$blueNo = (int)($b / 64);
		$bin = 16 * $redNo + 4 * $greenNo + $blueNo;
		$histogram[$bin] += 1;
	}
}
// 一時的に作成した$imgを破棄
imagedestroy($img);
// ヒストグラムを全体を1になるように正規化
for ($i = 0; $i < 64; $i++) {
	$histogram[$i] = $histogram[$i] / ($width * $height);
}
// 定数hgramとの比較(intersection)
for ($i = 0; $i < 64; $i++) {
	$intersection += min( $hgram[$i], $histogram[$i] ) ;
}
// 比較した結果が0.8を下回る場合、リンク先の画像を採用(1に近いほうが似ているので、この場合は「似ていない」という判断)
if( $intersection < 0.8 ){
	$cover = 'https://images-na.ssl-images-amazon.com/images/P/' .$isbn10 .'.09.LZZZZZZZ';
}

この記事が気に入ったらサポートをしてみませんか?