图像分类 - 检测楼层平面图

use*_*410 4 php opencv classification image-processing pattern-matching

我正在一个房地产网站上工作,我想编写一个程序,可以弄清楚(分类)图像是平面图还是公司徽标.

由于我在php中编写,我更喜欢php解决方案,但任何c ++或opencv解决方案都可以.

平面图样本:

替代文字http://www.rentingtime.com/uploads/listing/l0050/0000050930/68614.jpg

替代文字http://www.rentingtime.com/uploads/listing/l0031/0000031701/44199.jpg

徽标样本:

替代文字http://www.rentingtime.com/uploads/listing/l0091/0000091285/95205.jpg

Ali*_*xel 6

与往常一样,这里有一个内置的PHP函数.只是在开玩笑.=)

所有的平面图我都看到它们非常单色,我认为你可以玩色彩的数量和颜色饱和度来得到一个很好的猜测是图像是一个标志或平面图.

例如: is the image has less than 2 or 3 colors is a floor plan.

例如: if the sum / average of the saturation is less than X it's a floor plan.

黑色和白色(以及在平面图中使用的其他类似颜色)的饱和度为零或非常接近零,而徽标往往更具视觉吸引力,因此使用更饱和的颜色.

这是一个计算Hex RGB颜色饱和度的简单函数:

function Saturation($color)
{
    $color = array_map('hexdec', str_split($color, 2));

    if (max($color) > 0)
    {
        return (max($color) - min($color)) / max($color);
    }

    return 0;
}

var_dump(Saturation('000000')); // black    0.0000000000000000
var_dump(Saturation('FFFFFF')); // white    0.0000000000000000
var_dump(Saturation('818185')); // grey     0.0300751879699249
var_dump(Saturation('5B9058')); // green    0.3888888888888889
var_dump(Saturation('DE1C5F')); // pink     0.8738738738738738
var_dump(Saturation('FE7A15')); // orange   0.9173228346456692
var_dump(Saturation('FF0000')); // red      1.0000000000000000
var_dump(Saturation('80FF80')); // ---      0.4980392156862745
var_dump(Saturation('000080')); // ---      1.0000000000000000
Run Code Online (Sandbox Code Playgroud)

使用imagecolorat()imagecolorsforindex()可以实现一个简单的函数,它循环通过图像的所有像素,并求和/计算饱和度的平均值.如果图像的饱和度高于自定义阈值,则可以假定图像是徽标.

你不应该忘记的一件事是,具有更高分辨率的图像通常会有更多的饱和度(更多的像素要求和),所以为了这个算法而且为了你的服务器性能,最好调整所有的大小.图像为通用分辨率(比如100x100或50x50)以对它们进行分类,一旦分类,您可以使用原始(未调整大小)图像.

我用你提供的图片做了一个简单的测试,这是我使用的代码:

$images = array('./44199.jpg', './68614.jpg', './95205.jpg', './logo.png', './logo.gif');

foreach ($images as $image)
{
    $sat = 0;
    $image = ImageCreateFromString(file_get_contents($image));

    for ($x = 0; $x < ImageSX($image); $x++)
    {
        for ($y = 0; $y < ImageSY($image); $y++)
        {
            $color = ImageColorsForIndex($image, ImageColorAt($image, $x, $y));

            if (is_array($color) === true)
            {
                $sat += Saturation(dechex($color['red']) . dechex($color['green']) . dechex($color['blue']));
            }
        }
    }

    echo ($sat / (ImageSX($image) * ImageSY($image)));
    echo '<hr />';
}
Run Code Online (Sandbox Code Playgroud)

以下是结果:

green floor plant:      0.0151028053
black floor plant:      0.0000278867
black and white logo:   0.1245559912
stackoverflow logo:     0.0399864136
google logo:            0.1259357324
Run Code Online (Sandbox Code Playgroud)

仅使用这些示例,我会说如果平均饱和度小于0.03或0.035,图像是地板工厂,您可以通过添加额外的示例进一步调整它.