문제

저는 부동산 웹 사이트에서 작업 중이며 이미지가 평면도 또는 회사 로고 인 경우 파악할 수있는 프로그램을 작성하고 싶습니다.

나는 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

도움이 되었습니까?

해결책

항상 그렇듯이 a 이를위한 내장 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.

흑백 (및 평면도에 사용되는 기타 유사한 색상)은 포화가 0이거나 0에 매우 가까운 채도를 가지며 로고는 더 시각적으로 매력적이므로 더 포화 된 색상을 사용합니다.

다음은 16 진 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

사용 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 />';
}

결과는 다음과 같습니다.

green floor plant:      0.0151028053
black floor plant:      0.0000278867
black and white logo:   0.1245559912
stackoverflow logo:     0.0399864136
google logo:            0.1259357324

이 예제 만 사용하면 평균 채도가 0.03 또는 0.035 미만인 경우 이미지가 플로어 플랜트라고 말합니다. 추가 예제를 추가하여 조금 더 조정할 수 있습니다.

다른 팁

이것을 인간에게 아웃소싱하는 것이 가장 쉬울 수 있습니다.

예산이 있다면 고려하십시오 아마존의 기계적 터크. Wikipedia를 참조하십시오 일반적인 설명.

또는 아웃소싱을 직접 할 수 있습니다. PHP 스크립트를 작성하여 이미지 중 하나를 표시하고 사용자에게 "로고"로 정렬하라는 메시지를 표시하십시오. 웹 서버 에서이 실행이 있으면 전체 사무실 전체에 이메일을 보내 Ånd는 모든 사람에게 20 개의 이미지를 개인적인 호의로 정렬하도록 요청하십시오.

더 좋은 점은 대회를 만들어보십시오. 대부분의 이미지를 분류하는 사람은 iPod을 이길 것입니다!

아마도 가장 간단하게, 피자와 맥주를 위해 아는 모든 사람을 초대하고 많은 노트북을 설정하고 모든 사람들이 몇 분 동안 분류 할 수있게 해줍니다.

과제를 달성 할 수있는 소프트웨어 방법이 있지만, 수천 개의 이미지가 미만인 일회성 이벤트라면 최소 수백 달러의 예산이 인간을 사용하는 것이 더 쉬울 수 있다고 생각합니다.

가장 먼저 떠오르는 것 중 하나는 평면도가 일반 로고보다 90도에 더 많은 선을 지정하는 경향이 있다는 사실입니다.

빠른 첫 패스는 실행하는 것입니다 캐니 엣지 탐지 이미지에서 a를 사용하여 각도에 투표합니다 허프 변환 그리고 라인의 rho, theta 정의. Rho에 합산 된 theta = (0, 90, 180, 270)에 대한 매우 강력한 서신이 보이면 이미지를 평면도로 분류 할 수 있습니다.

또 다른 옵션은 길고 연속적인 라인 세그먼트에서 투표 만 계산하여 소음을 제거하기 위해 Canny Step 후에 가장자리 이미지를 걸어가는 것입니다.

그러한 도구가 이미 존재하는지 의심스럽고 정확한 도구를 만드는 것이 쉽지 않을 것입니다.기존 이미지 세트를 정렬해야 하는 경우(예: 정렬되지 않은 디렉터리가 있는 경우) "충분히 좋은" 도구를 작성하고 수동으로 오류를 처리할 수 있습니다.새로운 이미지를 사용하여 이 작업을 동적으로 수행해야 한다면 아마도 잘못된 접근 방식일 것입니다.

전자의 경우에 대해 이것을 시도한다면 아마도 프록시로 사용할 수 있는 사소하게 다른 것을 찾을 것입니다.평면도는 일반적으로 로고(파일 크기 또는 이미지 크기)보다 훨씬 더 큽니까?평면도에는 로고보다 색상이 적습니까?사소한 것을 사용하여 75%의 정확도를 얻을 수 있다면 아마도 좋은 방법일 것입니다.

이와 같은 것 - 이미지에서 패턴을 인식하는 것은 시간, 끔찍한 신뢰할 수없고 새로운 사례에 맞게 업데이트 및 패치가 지속적으로 필요하다는 점에서 끔찍한 비싸다.

왜 그렇게 해야하는지 물어봐도 될까요? 웹 사이트 워크 플로에 이미지가 로고인지 평면도인지 수동으로 결정할 수있는 점이 없습니까? 사용자가 업로드시 어느 것이 어느 것이 있는지 결정할 수있는 응용 프로그램을 작성하는 것이 더 쉽지 않습니까? 처음에 혼합 된 데이터 세트가있는 이유는 무엇입니까?

이것이 수동 개입이 필요한 것이라고 생각했지만, 당신이 할 수있는 한 가지는 이미지의 크기를 확인하는 것입니다.

작은 (MB 및 치수 측면에서) 이미지는 로고 일 가능성이 높습니다.

큰 (MB 및 치수 측면에서) 이미지는 평면도 일 가능성이 높습니다.

그러나 이것은 확률 측정 일 뿐이며 결코 완벽하지는 않습니다.

이미지 유형은 또한 표시기이지만 하나는 적습니다. 로고는 JPG, PNG 또는 GIF 일 가능성이 높으며 플로어 플랜은 TIFF 또는 기타 무손실 형식 일 수 있지만 보장은 아닙니다.

먼저 시도 할 간단한 쉬운 시도는 SVM을 사용하여 샘플에서 얻은 SIFT 키패 인을 배우는 것입니다. 그러나 그렇게하기 전에 이미지의 작은 서브 세트에 레이블을 지정하여 -1 (평면도) 또는 1 (로고)을 제공해야합니다. 이미지에 플로어 플랜으로 분류 된 키가 키가 더 많으면 플로어 플랜이어야합니다. 로고로 분류 된 키패 인트가 더 많으면 로고 여야합니다. 컴퓨터 비전에서 이것은 가장 간단한 방법 중 하나 인 기능 가방 접근법으로 알려져 있습니다. 더 복잡한 방법은 더 나은 결과를 얻을 수 있지만 이것은 좋은 시작입니다.

다른 사람들이 말했듯이, 그러한 이미지 인식은 일반적으로 끔찍하게 복잡합니다. PHP를 잊어 버리십시오.

그러나 샘플을 살펴보면 기준이 있습니다. 할 것 같다 잘 작동하고 그렇다면 구현하기가 매우 쉽습니다.

좋은 OCR을 통해 이미지를 실행하고 어떤 문자열이 튀어 나오는지 확인하십시오. 방이나 그 기능을 설명하는 단어가 많이 있다면 ...

이미지를 90도를 회전시키고 다시 수직 레이블을 잡으려고 시도합니다.

편집 : 시도했지만 작동하지 않기 때문에 먼저 혼란을 청소해야합니다. 공백을 기반으로 이미지를 자르십시오. 라인을 구문 분석하려고 시도하는 경우 각 하위 이미지에 대해 OCR을 실행하십시오. 이미지 편집기를 사용하여 수동으로 테스트하여 슬라이스 할 수 있습니다.

색상 포화를 모두 사용하십시오 그리고 이미지 크기 (둘 다 이전 답변에서 별도로 제안). 인간 분류 된 수치의 큰 샘플을 사용하고 2D 공간 (크기 X 포화)에서 어떻게 음모를 꾸미고 경계를 놓을 위치를 결정하십시오. 경계는 직선이 될 필요는 없지만 모든 점을 맞추기 위해 너무 많은 비틀기를 만들지 않거나 새로운 데이터를 희생하여 샘플을 "메모리 징"할 수 있습니다. 대부분의 샘플에 맞는 비교적 간단한 경계를 찾는 것이 좋습니다. 대부분의 데이터에 적합해야합니다.

특정 오류를 견딜 수 있어야합니다. 이것에 대한 어리석은 해결책은 불가능합니다. 회사의 로고로 플로어 플랜을 선택하면 어떻게됩니까? (이것은 농담이 아닙니다. 그것은 단지 재미 있습니다)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top