2014-09-22 1 views
0

ANN을 사용하여 필기 인식 시스템을 작성하고 있는데 문제가 있습니다. 스캔 한 이미지에 문자를 구분하고 각각의 AABB를 얻고 싶습니다. 그것은 이미지 만 문자는 검은 색과 배경 (이미 임계 알고리즘을 작성했습니다)이미지에 많은 객체의 AABB를 계산하는 중

std::vector < unsigned char > px; // pixel data (RGBARGBARGBARGBA...) 
unsigned w, h; // width and height of image 

lodepng::decode(px, w, h, infile); // i use LodePNG to decode image 

for(int i = 0; i < px.size(); i += 4) 
{ 
    unsigned char & r = px[ i ], & g = px[ i + 1 ], & b = px[ i + 2 ], & a = px[ i + 3 ]; 

    // and what now? 
} 

lodepng::encode(outfile, px, w, h); 

Image of problem (죄송에만 흰색 것으로 가정 할 수 있지만이 없어

)이 계산 이미지 게시를위한 충분한 담당자 :()

+0

"AABB"란 무엇입니까? – MSalters

+0

[링크] (http://en.wikipedia.org/wiki/Minimum_bounding_box) – kubawal

+0

축 정렬 경계 상자 - 확인. – MSalters

답변

0

이미지에 표시된 이미지 처리 작업을 "분할"이라고합니다. 그렇게하는 방법은 많습니다. 가장 쉬운 방법은 첫 번째 검정색 픽셀 (가장 왼쪽 상단)을 선택하고 그 오른쪽 (x + = 1) 또는 그 바로 아래 (y + = 1, x + = {-1, 1,0,1) 중 하나 인 4 픽셀 중 하나가 있는지 확인하는 것입니다. })도 검은 색입니다. 인접한 8 개의 픽셀도 검은 색입니다. 이 문자를 같은 문자에 속한 픽셀 집합에 추가하고 반복합니다. 무한 재귀를 방지하려면 이전 재귀에서 추가 한 점의 이웃을 확인하고 점을 두 번만 추가하면 안됩니다. 입력 한 크기의 빈 캔버스를 만들고 픽셀 값을 발견 한 반복으로 설정하여 추가 한 포인트를 추적 할 수 있습니다. 따라서 첫 번째 픽셀은 값 1을 가져오고 이웃들은 값 2를 얻고 이웃 픽셀의 이웃은 값 3을 얻습니다.

특정 시점에서 문자의 왼쪽 아래 픽셀을 찾았으므로 귀하의 의견을 모두 지우십시오. 이렇게하면 새로운 왼쪽 상단 검정색 픽셀이 두 번째 문자에 속하게됩니다.

이제 문자의 모든 픽셀에 대해 축 정렬 경계 상자가 최소/최대 x/y로 변경되었습니다.

+0

문자가 A와 같은 경우 어떻게됩니까? 왼쪽 위의 픽셀은 AABB의 왼쪽 상단이 아닙니다 ... – kubawal

+0

True. 그러나 각 반복에서 확인하는 4 개의 이웃 픽셀 중 하나가 y + = 1, x + = - 1에 있기 때문에 대각선을 왼쪽 하단으로 걸을 것입니다. – MSalters

0

다른 알고리즘을 사용했습니다 (이 아이디어를 제공 한 MSalters에게 감사드립니다). 어쩌면 그것은 누군가를 도울 수 있습니다. 그래서 이것을 의사 코드로 알려줍니다. (나는 그것을 테스트했다)

Copy image to image2 
for each(Pixel p in image2) 
{ 
    if(p is black) 
    { 
    Add p to container 
    Set p color to white 
    Call findNeighbours(p position) 

    left top of aabb = (lowest x of pixels in container, lowest y of pixels in container) 
    right down of aabb = (highest x of pixels in container, highest y of pixels in container) 
    Save this aabb 
    Clear container 
    } 
} 
All objects found, all pixels should be white 

function findNeighbours(x, y) 
{ 
    for each(neighbour of pixel (x, y)) 
    { 
    if(this neighbour is black) 
    { 
     Set this neighbour's color to white 
     Add this neighbour's position to container 
     Call findNeighbours(this neighbour's position) 
    } 
    } 
} 
+0

그러나이 알고리즘은 문자 인식을위한 알고리즘이 아닙니다. 'i'character :(.이 작업을해야합니다. – kubawal

+0

점이 끊어져있는 문제입니까? 그 자체로 공정한 질문입니다. – MSalters

+0

ANN이 점없이 점을 인식하고 점을 인식하도록 훈련 할 것입니다. 하나의 문자로 연결하십시오 – kubawal

관련 문제