2014-10-29 2 views
1

아래 그림과 같이 흰색으로 문자를 그리는 Pygame 검정색 디스플레이가 있습니다. 디스플레이의 크기는 100x100 픽셀 이상일 수 있습니다.PyGame 흑백 디스플레이를 7x5 비트 매트릭스로 변환

pygame window

이 나는 ​​표면에 2 차원 배열을 가져 오는 이런 식으로 뭔가를 사용할 수 있습니다 알고, 내가 어떻게 든 7x5 비트 행렬이 배열을 번역하고 싶은, 그러나

miSuface = pygame.display.get_surface() 
    miCoso = pygame.surfarray.array2d(miSuface) 

을하는 공에 은 검은 색 픽셀에 해당하고 1은 흰색 픽셀에 해당합니다. 나의 마지막 의도는 매트릭스를 사용하여 신경망을 훈련시키고 간단한 OCR을 만드는 것입니다. 내가 이것을 성취 할 수있는 방법이 있습니까? 아니면 7x5 매트릭스를 얻는 더 좋은 방법이 있습니까?

답변

1

나는 pygame.surfarray.array2d()에 대한 호출에 대해 명확히 알고 있지 않습니다. 그러나 이진 색상 레이아웃에서 더 작은 이진 색상 행렬로 바뀌므로 결과 사각형을 적절하게 채색하기 위해 새 비율을 사용하여 원본 이미지를 세분 할 수 있습니다. 예를 들어 보겠습니다.

초기 이미지가 14x10이고 7x5 매트릭스를 갖고 싶다고합시다. 당신이해야 할 것은 내가 좋은 숫자를 집어 때문에 5로 분할 X-현명한 7,와 y-현명하다

[[0,0,0,0,0,0,0,0,0,0,0,0,0,0], 
[0,0,0,0,0,0,0,0,0,0,0,0,0,0], 
[0,0,0,0,0,0,0,0,0,0,0,0,0,0], 
[0,0,0,0,0,0,0,1,0,0,0,0,0,0], 
[0,0,0,0,0,0,1,1,1,0,0,0,0,0], 
[0,0,0,0,0,1,1,0,1,1,0,0,0,0], 
[0,0,0,0,1,1,1,1,1,1,1,0,0,0], 
[0,0,0,1,1,1,1,1,1,1,1,1,0,0], 
[0,0,1,1,0,0,0,0,0,0,0,1,1,0], 
[0,1,1,0,0,0,0,0,0,0,0,0,1,1]] 

, 큰 이미지의 조각이 있습니다 : 귀하의 초기 이미지는 다음과 같습니다 찾고있는 것은 2x2입니다. 왼쪽 상단 2x2 블록을 예로 들어 보겠습니다.

[[0,0], 
[0,0]]  ->  [0] 

이 미니 매트릭스는 7x5 이미지의 단일 픽셀로 매핑됩니다.

[[1,0], 
[1,1]]  ->  [1] 

이 당신의 7x5 이미지의 값을 1로 매핑됩니다 : 물론,이 경우에는 오른쪽 아래에 0 살펴 보자 될 것입니다. 보시다시피,이 예제의 까다로운 경우는 1과 0이 같을 때입니다. 다행히 초기 이미지가 항상 100x100 이상이므로 큰 문제는 아닙니다.

내 예에이 방법을 적용, 수축의 7x5 이미지는 다음과 같습니다

[[0,0,0,0,0,0,0], 
[0,0,0,0,0,0,0], 
[0,0,0,1,1,0,0], 
[0,0,1,1,1,1,0], 
[0,1,0,0,0,0,1]] 

Psuedocode 단계 :

  1. 5로 미니 행렬의 크기 (분할 찾기 및 7).이 이미지는 크기가 7x5보다 큰 이미지에서 작동합니다.

  2. 각 미니 매트릭스에 대해 흑백 공간 (0과 1)을 센다.

  3. 마지막 7x5 행렬의 공간이 검정색인지 흰색인지 결정하십시오. 나의 예에서는 최종 공간이 검은 색이어야한다고 (흰 사각형의 수> 검은 사각형의 수)라고합니다. 펜 크기가 7x5 디비전 크기보다 상대적으로 얇기 때문에이 방법을 사용하면 문제가 발생할 수 있습니다. 이것이 문제라면 if (흰색 사각형의 수 * 2> = 검은 사각형의 수)와 같은 것을 시도해보십시오. 이것은 효과적으로 흰 사각형을 더 가중시킵니다.

이 psuedocode에 대해 자세히 설명 드리겠습니다. 바로 알려주세요.

마지막으로 문제가 계속되는 경우 7x5보다 큰 크기를 사용해보십시오. OCR 알고리즘을 사용하면 정밀도가 높아집니다. 행운을 빕니다.

+0

도움을 주셔서 대단히 감사합니다. 구현을 시작하고 무엇이 발생하면 알려 드리겠습니다. 다시 한 번 감사드립니다. –

2

array2d를 작은 배열이나 1 비트의 색상 정보로 압축하는 방법을 알지 못합니다. 그러나 다음을 수행 할 수 있습니다.

  1. 배열을 반복합니다. 색상이 888888보다 작거나 같으면 000000으로 변경하십시오. 더 큰 경우 FFFFFF로 변경하십시오.
  2. 새 [7] [5] 배열을 만듭니다.
  3. 다시 반복합니다. 주어진 배열의 35 번째 각 픽셀 (검정 = 0, 흰색 = 1)의 값을 추가하십시오. 샘플 크기는 원본 array2d의 크기에 전적으로 의존합니다. 해당 블록의 평균이 17.5보다 크거나 같으면 행렬에 흰색 요소를 추가하십시오. 17.5보다 작 으면 매트릭스에 검은 색 요소를 추가하십시오.
관련 문제