2009-03-20 5 views
0

나는 이상한 (회색이 아닌) 배경, 즉 녹색이나 노란색 (기본적으로 오래된 종이)에 기본적으로 검은 색으로 인쇄 된 스캔 이미지가 있습니다.이미지를 파란색 상자에 넣을 수 있습니까?

녹색/노란색을 제거하고 원래 이미지의 회색 구조만큼 많은 회색 그림을 어떻게받을 수 있습니까? 나는. 앤티 앨리어스 효과 또는 회색 영역의 글자 주위에 회색을 유지하고 싶지만 원격으로 녹색/노란색이 순수한 흰색으로 변하는 것을 전환하고 싶습니다.

배경이 균일 한 것은 아닙니다. 따라서 알고리즘은 색상과 오류 마진 또는 색상 범위를 받아 들일 수 있어야합니다.

보너스 포인트 : 배경색을 자동으로 결정하려면 어떻게합니까?

이미징 라이브러리 또는 ImageMagick과 함께 Python을 사용하고 싶습니다.

참고 : unpaper과 같은 패키지를 알고 있습니다. 제지의 문제점은 BCR & W 이미지가 OCR 소프트웨어에는 좋지만 사람의 눈에는 좋지 않을 수 있습니다.

답변

1

나는 파이썬 프로그래머보다 C++가 많기 때문에 코드 샘플을 제공 할 수 없다. 그러나 일반적인 알고리즘은 다음과 같습니다.

배경색 찾기 : 이미지의 히스토그램을 만듭니다. 히스토그램에는 배경색과 전경색을 나타내는 두 개의 피크가 있어야합니다. 배경의 강도가 높다는 것을 알기 때문에 높은 강도의 피크를 선택하면 배경색이됩니다. 이제 흰색으로 배경을 설정 RGB 배경 (R_bg, G_bg, B_bg)

이 모든 픽셀 이상 당신 루프와 배경의 거리 계산 : 거리 당신이 설정 임계 값보다 작 으면

distance = sqrt((R_bg - R_pixel)^2 + (G_bg - G_pixel)^2 + (B_bg - B_pixel)^2) 

을 픽셀에서 흰색. 좋은 결과를 얻을 때까지 다른 임계 값을 실험 해 볼 수 있습니다.

+0

하지만 좋은 시작이다. –

+0

참. 다른 방법으로 가서 히스토그램의 전경 피크와의 거리를 기준으로 픽셀을 전경색으로 레이블을 지정하고 나머지는 모두 흰색으로 바꿀 수 있습니다. –

+0

이런 종류의 응용 프로그램에 대해 RGB 공간이 잘못 되었습니까? HSV/HSL이 더 좋지 않습니까? –

1

얼마전에 임의의 배경색을 투명하게 만들기 위해이 스크립트를 개발했습니다. 이미지에서 가장 인기있는 (배경) 색상을 사용하고 투명도가 배경색과의 거리에 비례하는 알파 마스크를 만듭니다. RGB colorspace 거리를 사용하는 것은 큰 이미지의 경우 값 비싼 프로세스이므로 numpy와 빠른 정수 sqrt 근사값 연산을 사용하여 최적화를 시도했습니다. 먼저 HSV로 전환하는 것이 올바른 접근 방법 일 수 있습니다.

from PIL import Image 
import sys, time, numpy 

fldr = r'C:\python_apps' 
fp = fldr+'\\IMG_0377.jpg' 

rz = 0 # 2 will halve the size of the image, etc.. 

# ---------------- 

im = Image.open(fp) 

if rz: 
    w,h = im.size 
    im = im.resize((w/rz,h/rz)) 
    w,h = im.size 

h = im.histogram() 
rgb = r0,g0,b0 = [b.index(max(b)) for b in [ h[i*256:(i+1)*256] for i in range(3) ]] 

def isqrt(n): 
    xn = 1 
    xn1 = (xn + n/xn)/2 
    while abs(xn1 - xn) > 1: 
     xn = xn1 
     xn1 = (xn + n/xn)/2 
    while xn1*xn1 > n: 
     xn1 -= 1 
    return xn1 

vsqrt = numpy.vectorize(isqrt) 

def dist(image): 
    imarr = numpy.asarray(image, dtype=numpy.int32) # dtype=numpy.int8 
    d = (imarr[:,:,0]-r0)**2 + (imarr[:,:,1]-g0)**2 + (imarr[:,:,2]-b0)**2 
    d = numpy.asarray((vsqrt(d)).clip(0,255), dtype=numpy.uint8) 
    return Image.fromarray(d,'L') 

im.putalpha(dist(im)) 
im.save(fldr+'\\test.png') 
+0

감사합니다. 한번 시도해 보겠습니다. –

1

내가 질문은 오래 알고,하지만 난 ImageMagick이 비슷한 일을하려고 주위에 놀고 있었는데,이 함께했다 : 아직 문제가 해결 havn't는 경우에, 나는이 도움이 되었으면 좋겠

이로

enter image description here

:

convert text.jpg -fill white -fuzz 50% +opaque black out.jpg 

이 변환 이 색상

convert text.jpg -colors 2 -colorspace RGB -format %c histogram:info:- 
5894: (50, 49, 19) #323113 rgb(50,49,19) 
19162: (186,187, 87) #BABB57 rgb(186,187,87)  <- THIS ONE ! 

:

enter image description here

좀 더 실험 후, 나는이 얻을 수있는 "평균"색에 관해서는

enter image description here

, 나는 이것을 사용 :

enter image description here

이를 사용하여 1,363,210

: 일부 가장자리의 계단 현상을 떠날 것입니다

convert text.jpg -fill black -fuzz 50% -opaque rgb\(50,50,10\) -fill white +opaque black out.jpg 
+0

거의 효과가없는 인상적인 결과. 특히 수평선을 제거하기 때문에 특히 그렇습니다. 더 많은 회색 값을 유지하여 나머지 글자가 픽셀 화되지 않도록하는 방법이 있습니까? –

+0

조금 더 열심히 시도했는데 다른 결과가 나타났습니다. 편집을 참조하십시오. 또한 채도 레이어를 추출해보십시오 (텍스트의 회색 픽셀이 본질적으로 불포화되어 있기 때문에). 그리고 대비를 늘리면되지만 너무 잘 작동하지는 않습니다. –

+0

마지막 이미지를 입력 마스크로 사용한 다음 그레이 스케일로 변환하는 방법은 어떻습니까? –

관련 문제