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

您可以对图像进行灰度 sobel 边缘检测过滤器,并对边缘的像素值求和;然后将此总和与像素数(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 会给你两个尺寸非常相似的图像(特别是如果你使用一些良好的压缩工具,如 PNGOUT 等)。我只是从最接近所需大小的源图像缩放。

于 2013-05-30T19:44:06.607 回答
0

你可以使用这个重复图像查找器的算法来比较你的高质量图像的指纹和它的低质量双胞胎的指纹。你怎么看?

于 2013-06-17T20:03:42.233 回答
0

图像质量完全是主观的,很大程度上取决于原始图像的复杂性。如果您的图像是暴风雪中的一只白猫(基本上只是白色),那么无论您是通过缩小 1000x1000 图像还是从 100x100 图像增大来实现,500x500 图像的主观质量都是相同的。

但在所有条件相同的情况下,您可以假设高分辨率图像将缩小到比低分辨率图像放大到更好的质量。

因此,在我的脑海中,您可以将较大的图片缩小到目标尺寸,然后将其用作评估放大的较小图片质量的指标(理想)(第 9 行的像素 7 与同一理想图像中的像素等)。可以对所有像素或图像内的样本点进行这种比较。然后可以对产生的“outness”进行平均并用作放大图片质量的指示。

于 2013-07-21T07:57:35.190 回答