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)
분할 의 결 과 를 보면 기본적으로 그림 속 문자 의 분할 을 실현 했다.그러나 중국어 구조의 복잡성 으로 인해 일부 문자 의 분할 이 이상 적 이지 않다.예 를 들 어'잎','복숭아'등 글 자 는 과도 한 분할 현상 이 나타 날 수 있다.붙 어 있 는 두 글자 에 대해 분할 이 부족 한 현상 이 나타 날 수 있다.예 를 들 어 위의 그림 에서'생각'이다.그러나 이미지 전처리(부식),경계 판단 한도 값 조정 등 측면 에서 최적화 할 수 있다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.