Python+opencv 그림 문자 분할 방법 예제

실현 절차:
1.수평 투영 을 통 해 도형 을 수평 으로 분할 하여 각 줄 의 그림 을 얻 습 니 다.
2.수직 투영 을 통 해 분 단 된 모든 줄 의 그림 을 수직 으로 분할 하고 모든 문자 의 좌표 위 치 를 최종 적 으로 확정 하 며 모든 문 자 를 분할한다.
먼저 투영 법 을 간단하게 소개 한다.각각 수평 과 수직 방향 에서 예비 처리(이치 화)이미지 의 특정한 픽 셀 을 통계 하고 이치 화 이미지 가 검은색 이 아니면 흰색 이 아니다.우 리 는 그 중의 흰 점 이나 검 은 점 을 통계 함으로써 통계 결과 에 따라 각 줄 의 상하 경계 와 각 열의 좌우 경 계 를 판단 하여 분할 의 목적 을 실현 할 수 있다.
다음은 Python+opencv 를 통 해 이 기능 을 실현 합 니 다.
먼저 수평 투영 을 실현 한다.

import cv2

import numpy as np

 

'''    '''

def getHProjection(image):

 hProjection = np.zeros(image.shape,np.uint8)

 #     

 (h,w)=image.shape 

 #            

 h_ = [0]*h

 #              

 for y in range(h):

  for x in range(w):

   if image[y,x] == 255:

    h_[y]+=1

 #        

 for y in range(h):

  for x in range(h_[y]):

   hProjection[y,x] = 255

 cv2.imshow('hProjection2',hProjection)

 

 return h_

 

if __name__ == "__main__":

 #      

 origineImage = cv2.imread('test.jpg')

 #       

 #image = cv2.imread('test.jpg',0)

 image = cv2.cvtColor(origineImage,cv2.COLOR_BGR2GRAY)

 cv2.imshow('gray',image)

 #       

 retval, img = cv2.threshold(image,127,255,cv2.THRESH_BINARY_INV)

 cv2.imshow('binary',img)

 #    

 H = getHProjection(img)

위의 수평 투영 을 통 해 하 얀 작은 산봉우리 의 시작 위치 에 따라 각 줄 의 시작 위 치 를 정 하고 모든 줄 을 나 눌 수 있다.

각 줄 의 그림 을 가 져 온 후 수직 으로 투영 할 수 있 습 니 다.

def getVProjection(image):

 vProjection = np.zeros(image.shape,np.uint8);

 #     

 (h,w) = image.shape

 #            

 w_ = [0]*w

 #              

 for x in range(w):

  for y in range(h):

   if image[y,x] == 255:

    w_[x]+=1

 #         

 for x in range(w):

  for y in range(h-w_[x],h):

   vProjection[y,x] = 255

 cv2.imshow('vProjection',vProjection)

 return w_

수직 투영 을 통 해 모든 문자 좌우 의 시작 위 치 를 얻 을 수 있 습 니 다.그러면 모든 문자 의 구체 적 인 좌표 위치,즉 사각형 상자 의 위 치 를 얻 을 수 있 습 니 다.
다음은 실 현 된 모든 코드 입 니 다.

import cv2

import numpy as np

 

'''    '''

def getHProjection(image):

 hProjection = np.zeros(image.shape,np.uint8)

 #     

 (h,w)=image.shape 

 #            

 h_ = [0]*h

 #              

 for y in range(h):

  for x in range(w):

   if image[y,x] == 255:

    h_[y]+=1

 #        

 for y in range(h):

  for x in range(h_[y]):

   hProjection[y,x] = 255

 cv2.imshow('hProjection2',hProjection)

 

 return h_

 

def getVProjection(image):

 vProjection = np.zeros(image.shape,np.uint8);

 #     

 (h,w) = image.shape

 #            

 w_ = [0]*w

 #              

 for x in range(w):

  for y in range(h):

   if image[y,x] == 255:

    w_[x]+=1

 #         

 for x in range(w):

  for y in range(h-w_[x],h):

   vProjection[y,x] = 255

 #cv2.imshow('vProjection',vProjection)

 return w_

 

if __name__ == "__main__":

 #      

 origineImage = cv2.imread('test.jpg')

 #       

 #image = cv2.imread('test.jpg',0)

 image = cv2.cvtColor(origineImage,cv2.COLOR_BGR2GRAY)

 cv2.imshow('gray',image)

 #       

 retval, img = cv2.threshold(image,127,255,cv2.THRESH_BINARY_INV)

 cv2.imshow('binary',img)

 #     

 (h,w)=img.shape 

 Position = []

 #    

 H = getHProjection(img)

 

 start = 0

 H_Start = []

 H_End = []

 #              

 for i in range(len(H)):

  if H[i] > 0 and start ==0:

   H_Start.append(i)

   start = 1

  if H[i] <= 0 and start == 1:

   H_End.append(i)

   start = 0

 #   ,                 

 for i in range(len(H_Start)):

  #     

  cropImg = img[H_Start[i]:H_End[i], 0:w]

  #cv2.imshow('cropImg',cropImg)

  #          

  W = getVProjection(cropImg)

  Wstart = 0

  Wend = 0

  W_Start = 0

  W_End = 0

  for j in range(len(W)):

   if W[j] > 0 and Wstart ==0:

    W_Start =j

    Wstart = 1

    Wend=0

   if W[j] <= 0 and Wstart == 1:

    W_End =j

    Wstart = 0

    Wend=1

   if Wend == 1:

    Position.append([W_Start,H_Start[i],W_End,H_End[i]])

    Wend =0

 #           

 for m in range(len(Position)):

  cv2.rectangle(origineImage, (Position[m][0],Position[m][1]), (Position[m][2],Position[m][3]), (0 ,229 ,238), 1)

 cv2.imshow('image',origineImage)

 cv2.waitKey(0)

분할 의 결 과 를 보면 기본적으로 그림 속 문자 의 분할 을 실현 했다.그러나 중국어 구조의 복잡성 으로 인해 일부 문자 의 분할 이 이상 적 이지 않다.예 를 들 어'잎','복숭아'등 글 자 는 과도 한 분할 현상 이 나타 날 수 있다.붙 어 있 는 두 글자 에 대해 분할 이 부족 한 현상 이 나타 날 수 있다.예 를 들 어 위의 그림 에서'생각'이다.그러나 이미지 전처리(부식),경계 판단 한도 값 조정 등 측면 에서 최적화 할 수 있다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기