私は 100 万枚ほどの画像のライブラリを持っていますが、これらの画像の約半分には、同じ場所に同じ半透明の透かしが入っています。
透かしのある画像を検出するには、どこから始めればよいですか? この目的のための標準ツールはありますか?
私は 100 万枚ほどの画像のライブラリを持っていますが、これらの画像の約半分には、同じ場所に同じ半透明の透かしが入っています。
透かしのある画像を検出するには、どこから始めればよいですか? この目的のための標準ツールはありますか?
質問によると、透かしが入った画像を検出したいだけの場合は、次のアルゴリズムを使用できます。
コードは次のようになります。
$no_of_pixels = what_you_got;
$matched = 0;
$thumbpixels = array();
$wmark = imagecreatefrompng("watermark.png");
list($width, $height) = getimagesize("watermark.png");
$tesimage = imagecreatefrompng("test.png");
for($h = 0; $h < $height; $h++){
for($w = 0; $w < $width; $w++){
if(imagecolorsforindex($testimage, imagecolorat($testimage, $w, $h)) == $thumbpixels[0]){
while($thumbpixels[$i++] === imagecolorsforindex($tesimage, imagecolorat($wmark, $w, $h)) && $no_of_pixels != $matched){
$matched++;
}
if($matched == $no_of_pixels) echo "Voila, we found it!";
}
}
}
サムネイルの例を見るだけです。テキストを検出したいだけなら、tesseract-ocrまたはPhpOCRを試すことができます。
PHPSaneも検討してください
画像内のほぼすべての特徴を検出することを、オブジェクト検出と呼びます。OpenCVと呼ばれる広く使用されているライブラリがあります。非常にシンプルな SDK を備えていますが、セットアップは非常に面倒な場合があります。C/C++ と(ほぼ十分にサポートされている) Python で十分にサポートされています。初めてOpenCVを使い始めたとき、自分のClassfier(トレーニング)をトレーニングするのに3週間かかりました。
しかし、私はこのソリューションに完全に依存して優先事項を検討するつもりはありません。また、カスタム分類器で良好なレートを達成することは非常に困難です。他の方法はより時間がかかります。
要するに、完全な正確さではありません。
せいぜい、ヒューリスティックを画像に適用して、透かしと正確に一致するかどうかを確認し、信頼度を取得することしかできませんでした。たとえば、透かしが 50% の白いオーバーレイの場合、主に白いシーンは偽陽性であり、もちろんその逆も真です。
また、画像が JPEG などの非可逆圧縮をエッジとして使用している場合に発生する可能性のある問題もあり、彩度によって透かしが予想どおりに彩度が低下したり、予想どおりに正確に配置されたりする可能性があります。
あなたの場合、予測可能な場所で同じロゴを探している場合、それは比較的簡単です。ただし、メタデータの著作権表示を照合する方がはるかに簡単で高速です (他の場所での私のコメントによると)。
透かしは、コンテンツに一定の変更を加えることはありません。変更された各ピクセルは、透かしと画像自体に基づいて新しい値を取得します。したがって、この情報を抽出する必要があります-画像を微分し、微分の大きさ(位相ではなく)だけを調べます。
次に、差分を透かしの 1 つ (または透かしやその他のコンテンツの多く) と関連付けるだけです。
独自の拡張機能を作成することに満足している場合を除き、PHP でこの種の画像処理を実行したくはありません。ほとんどの画像処理ツールキットは、微分と相関をサポートします。
ところで: 画像を区別する方法がわからない、および/または画像を相互に関連付ける方法がわからない場合は、質問しないでください。このフォーラムはその議論に適したフォーラムではありません。
透かしが常にどこにあるかを知っているため、imagecoloratとimagecolorsforindexを使用して、透かしの内側と外側の両方のピクセルのアルファ値を取得できます。透かしがない場合はアルファ値が似ており、透かしがある場合は異なると予想されます(決定する必要があるしきい値内)。もちろん、これはすべての画像で機能するとは限らないため、100% の精度が必要な場合は、より信頼性の高いものが必要になるでしょう。
これを行うツールがない場合は、次のことを試すことができます。
透かしが表示される場所をピクセルのパーセンテージで識別します (例: 右下 40px x 100px)
画像ごとに一時コピーを作成し、透かしが表示される場所を切り取ります。これにより、透かしのあるバージョンと透かしのないバージョンの両方が同じままになります。
画像を比較します。たとえば、幅 x 高さの組み合わせ、ファイルサイズ、CRC、または実際のピクセルの比較などです。ただし、100 万枚の画像の場合は、かなりの CPU パワーが必要になります。