9

「焦点が合っていない」と見なされるまで、画像をどれだけ拡大できるかを判断する方法はありますか?

実用的な例(および私が解決しようとしている問題):

500x500、250x250、120x120 など、いくつかの異なるサイズで保存された画像があります。最も効率的な画像を提供したいだけでなく、最も鮮明な画像も提供したいと考えています。ユーザーが 125x125 の画像を要求した場合、対応するために 120x120 の画像を大きくすることが最も効率的であるだけでなく、明らかなピクセレーションを引き起こさない可能性が最も高いでしょう。

それでも、ユーザーが 180x180 の画像を要求した場合、120x120 の画像を増やす方が効率的かもしれませんが、ほとんどの場合、ぼやけた画像が表示されます。この場合、250x250 の画像を縮小したいと思います。

明らかに、画像の「明瞭度」は相対的であり、画像ごとに異なるだけでなく、画像ごとに異なる可能性がありますが、ある種の「ピクセル化インデックス」を決定するためのアルゴリズムまたは関数があるかどうか疑問に思っています.. 。ありがとう!

注:画像操作にPHPとImageMagickを使用しているため、その領域での答えは素晴らしいでしょう...

明確にするために:上記の例の解決策を正確に探しているわけではありません。元の質問に対する答えを探しています: is there an algorithm that could possibly determine how "pixelated" a blown up image is...上記の問題は、そのようなアルゴリズムがどのように役立つかを示す実用的な例にすぎません。

4

4 に答える 4

1

画像に対してグレースケール ソ​​ーベル エッジ検出フィルターを実行し、エッジのピクセル値を合計してから、この合計をピクセル数に対して平均します (SumOfEdges/(width*height))。それは、画像の「鋭さ」を教えてくれます。これは、画像タイプの比較にのみ使用できます。

これは私のsobel openclフィルターカーネルです

const sampler_t sampler = CLK_ADDRESS_CLAMP_TO_EDGE |
CLK_FILTER_NEAREST;
kernel void
sobel_grayscale(read_only image2d_t src, write_only image2d_t dst)
{
int x = get_global_id(0);
int y = get_global_id(1);

float4 p00 = read_imagef(src, sampler, (int2)(x - 1, y - 1));
float4 p10 = read_imagef(src, sampler, (int2)(x, y - 1));
float4 p20 = read_imagef(src, sampler, (int2)(x + 1, y - 1));
float4 p01 = read_imagef(src, sampler, (int2)(x - 1, y));
float4 p21 = read_imagef(src, sampler, (int2)(x + 1, y));
float4 p02 = read_imagef(src, sampler, (int2)(x - 1, y + 1));
float4 p12 = read_imagef(src, sampler, (int2)(x, y + 1));
float4 p22 = read_imagef(src, sampler, (int2)(x + 1, y + 1));

float4 gx = -p00 + p20 + 2.0f * (p21 - p01)-p02 + p22;

float4 gy = -p00 - p20 +2.0f * (p12 - p10) +p02 + p22;

float gs_x = 0.3333f * (gx.x + gx.y + gx.z);
float gs_y = 0.3333f * (gy.x + gy.y + gy.z);
float g = native_sqrt(gs_x * gs_x + gs_y * gs_y);
write_imagef(dst, (int2)(x, y), (float4)(g,g,g, 1.0f));
}
于 2013-06-10T05:39:26.207 に答える
0

これはあなたが求めたことを正確に行うわけではありませんが、あなたが望むものを達成すると思います。画像がどのようにピクセル化されているかを定量化するアルゴリズムを書くことは自明ではなく、それは間違いなく画像形式固有のものであり (たとえば、 PNG 画像でのみ機能します)、あなたが望むものを達成する必要はないと思います。 .

したがって、この例のために、すべての画像が完全に正方形であると仮定しましょう (非正方形の画像を考慮するようにこれを変更するのはかなり簡単です)。

サイズを変更できるソース画像のリストと、「結果サイズ」 (500 ピクセル x 500 ピクセルなど) があるとします。あなたは次のようなことをするかもしれません:

$resultSize = 500;
$bestRatio = PHP_INT_MAX;
$bestURL = "";

foreach($sourceImageURLs as $url)
{
    $size = getimagesize($url);
    $size = $size[0];

    $ratio = min($resultSize, $size) / max($resultSize, $size);

    if($ratio < $bestRatio)
    {
        $bestRatio = $ratio;
        $bestURL = $url;
    }
}

/*
 * We've now found the image closest to our desired size. All we need
 * to do is resize the image at the URL in $bestURL to $resultSize, and
 * we're done.
 */

「最も効率的な」画像について心配する必要はないと思います。100x100 の画像を 200x200 に拡大するのに対し、300x300 の画像を 200x200 に縮小すると、サイズが非常に似ている 2 つの画像が得られます (特にいくつかを使用する場合)。 PNGOUT などの優れた圧縮ツール)。目的のサイズに最も近いソース画像からスケーリングします。

于 2013-05-30T19:44:06.607 に答える
0

画質は完全に主観的なものであり、元の画像の複雑さに大きく依存します。画像が吹雪の中の白い猫 (基本的には白のみ) の場合、500x500 の画像の主観的な品質は、1000x1000 の画像を縮小して達成した場合でも、100x100 の画像から拡大して達成した場合でも同じです。

しかし、すべての条件が同じであれば、解像度の高い画像は、解像度の低い画像が拡大されるよりも、より良い品質に縮小されると想定できます。

したがって、私の頭の上から、大きな画像をターゲットサイズに縮小し、それをメトリック (理想) として使用して、拡大された小さな画像の品質を評価することができます (行 9 のピクセル 7 が同じものとどのように異なるか)。理想的な画像のピクセルなど)。この比較は、すべてのピクセルに対して行うことも、画像内のサンプル ポイントから行うこともできます。結果として得られる「アウトネス」は、平均化され、拡大された画像の品質の指標として使用できます。

于 2013-07-21T07:57:35.190 に答える