8

의 초핑 필터를 복제하여 보안 문자 이미지의 배경 잡음을 제거 : 맥아피에서 TesserCap라는 유틸리티를 사용하여나는 보안 문자 다음과 같습니다 이미지가 TesserCap

을, I "는을 적용 할 수 이미지에 필터 "가 잘립니다. (이미지를 실행하기 전에 이미지에 흰색과 검은 색 두 가지 색상 만 있었는지 확인했습니다.) 텍스트 상자에 값 2로 필터를 사용한 결과에 매우 감명 받았습니다. 그것은 정확하게 대부분의 노이즈를 제거하지만 결과, 본문을 유지 : 나는 내 자신의 스크립트 중 하나에이 같은 것을 구현하고 싶었

, 그래서 나는 어떤 이미지 처리 라이브러리를 찾으려고 TesserCap이 사용되었습니다. 나는 아무것도 찾을 수 없었다. 그것은 자신의 코드를 사용하여 이미지를 처리하는 것으로 밝혀졌습니다. 그런 다음 정확히 어떻게 프로그램이 작동하는지 설명하는 this whitepaper을 읽습니다.

주어진 그레이 스케일 값에 대한 픽셀의 연속 번호가 숫자 상자에 들어있는 수보다 적은 경우, 자르고 필터가 0이 시퀀스를 대체 그것은 저에게이 도마 필터가하는 일의 다음과 같은 설명을했다 (검은 색) 또는 255 (흰색) 사용자 선택에 따라. 보안 문자는 수평 방향과 세로 방향으로 분석되며 해당 변경 사항이 적용됩니다.

나는 그것이 무엇을하는지 잘 모르겠다. 내 스크립트는 Python으로되어 있으므로 PIL을 사용하여 설명 된 것과 같은 픽셀 종류를 조작 해 보았습니다. 그것은 간단한 종류의 소리,하지만 난 정말 필터가 일을 정확히 알고하지 않았다 아마 때문에, 실패

(이 원형 패턴을 사용하여 약간 다른 보안 문자에서 이루어집니다.)

나는 ImageMagick의 convert.exe로 쉽게 할 수 있는지 보려고 노력했다. 그들의 -chop 옵션은 완전히 다른 것입니다. 일부 - 형태학 명령과 함께 - 미디어를 사용하면 일부 소음을 줄이는 데 도움이되었지만 불쾌한 점이 나타나 문자가 매우 왜곡되었습니다. TesserCap으로 쵸핑 필터를 수행하는 것만 큼 간단하지 않았습니다.

그럼, 내 질문은 다음과 같습니다 : 어떻게 파이썬에서 TesserCap의 초핑 필터를 구현합니까, PIL 또는 ImageMagick을 사용하고 있습니까? 그 도마뱀 붙이기 필터는 제가 시도한 대안보다 훨씬 잘 작동하지만, 그것을 복제하는 것처럼 보이지 않습니다. 나는이 작업을 몇 시간 동안 해왔으며 아직 아무것도 계산하지 못했습니다. 이 (의사)와 같은

+0

http://dsp.stackexchange.com/ – scord

+0

보조 노트로, 통계를 사용하여 시도 할 수 있습니다 : 여기에 수행 파이썬 코드입니다. Outliers (2 sd) 또는 극단적 인 outliers (3.5 sd)는 이미지 품질을 잃지 않고 captcha 이미지 (법적 목적으로)를 제거 할 수있게했습니다. –

답변

10

알고리즘은 필수적으로 행에 여러 개의 대상 픽셀 (이 경우 흰색이 아닌 픽셀)이 있는지 확인하고 픽셀 수가 잘라 내기 계수보다 작거나 같은 경우 해당 픽셀을 변경합니다.

예를 들어, 픽셀의 샘플 행에 # 블랙이다 및 -------###-------#####---------#--###-##---#####---#-#로 변환 할 2의 절단 인자를 적용하는 백색이다. 이는 2 픽셀보다 작거나 같은 검정 픽셀 시퀀스가 ​​흰색으로 교체되기 때문입니다. 2 픽셀보다 큰 연속 시퀀스가 ​​남아 있습니다. 게시물에 원본 이미지에 내 파이썬 코드 (아래)에 구현

는 절단 알고리즘의 결과입니다

'Chopped' image

전체 이미지에이를 적용하기 위해서는 단순히 모든 행과 모든 열에 대해이 알고리즘을 수행하십시오.

import PIL.Image 
import sys 

# python chop.py [chop-factor] [in-file] [out-file] 

chop = int(sys.argv[1]) 
image = PIL.Image.open(sys.argv[2]).convert('1') 
width, height = image.size 
data = image.load() 

# Iterate through the rows. 
for y in range(height): 
    for x in range(width): 

     # Make sure we're on a dark pixel. 
     if data[x, y] > 128: 
      continue 

     # Keep a total of non-white contiguous pixels. 
     total = 0 

     # Check a sequence ranging from x to image.width. 
     for c in range(x, width): 

      # If the pixel is dark, add it to the total. 
      if data[c, y] < 128: 
       total += 1 

      # If the pixel is light, stop the sequence. 
      else: 
       break 

     # If the total is less than the chop, replace everything with white. 
     if total <= chop: 
      for c in range(total): 
       data[x + c, y] = 255 

     # Skip this sequence we just altered. 
     x += total 


# Iterate through the columns. 
for x in range(width): 
    for y in range(height): 

     # Make sure we're on a dark pixel. 
     if data[x, y] > 128: 
      continue 

     # Keep a total of non-white contiguous pixels. 
     total = 0 

     # Check a sequence ranging from y to image.height. 
     for c in range(y, height): 

      # If the pixel is dark, add it to the total. 
      if data[x, c] < 128: 
       total += 1 

      # If the pixel is light, stop the sequence. 
      else: 
       break 

     # If the total is less than the chop, replace everything with white. 
     if total <= chop: 
      for c in range(total): 
       data[x, y + c] = 255 

     # Skip this sequence we just altered. 
     y += total 

image.save(sys.argv[3]) 
+0

고맙습니다! 내가 직면 한 또 다른 문제는 모든 캐릭터가 각기 다른 각도를 가지고 있다는 것입니다. – Kostanos

+1

@kbhomes 약간의 버그가 있습니다. 글자가 더 얇아지는 것을 볼 수 있습니까? for 루프에서 "x + = total"이 작동하지 않기 때문에 while 루프를 만들어야합니다. –

+0

@AndreMiras while 루프에서'x + = total'을 어떻게 만들 수 있습니까? –

3

시도 뭔가 :

for each row of pixels: 
    if there is a group of about 3 or more pixels in a row, leave them 
    else remove the pixels 

그런 다음 단순히 열을 위해 같은 일을 반복합니다. 적어도 조금은 효과가있을 것 같습니다. 이와 같이 가로 및 세로로 이동하면 가로/세로 선도 제거됩니다.

관련 문제