2014-10-11 2 views
3

오래된 사진을 스캔하므로 스캐너의 이미지와 흰색 배경이 나타납니다. 내 목표는 흰색 배경을 제거하고 사진을 찍는 것입니다. 어떻게해야합니까? 가 enter image description here파이썬으로 흰색 배경에 이미지를 자르려면 어떻게해야합니까?

내 간단한 방법 : 아래의 예

import os 
import time 
from PIL import Image 
from collections import Counter 
import numpy as np 

def get_cropped_image(image, crop_folder, threshold): 
    image_name = image.split("\\")[-1] 
    im = Image.open(image) 
    pixels = im.load() 
    width, height = im.size 

    rows = [] 
    for h_index in xrange(height): 
     row = [] 
     for w_index in xrange(width): 
      row.append(pixels[((w_index, h_index))]) 
     color_count = Counter(row)[(255, 255, 255)]/float(len(row)) 
     rows.append([h_index, color_count]) 

    columns = [] 
    for w_index in xrange(width): 
     column = [] 
     for h_index in xrange(height): 
      column.append(im.getpixel((w_index, h_index))) 
     color_count = Counter(column)[(255, 255, 255)]/float(len(column)) 
     columns.append([w_index, color_count]) 

    image_data = csv.writer(open("image_data.csv", "wb")).writerows(zip(rows, columns)) 

    rows_indexes = [i[0] for i in rows if i[1] < threshold] 
    columns_indexes = [i[0] for i in columns if i[1] < threshold] 

    x1, y1, x2, y2 = columns_indexes[0], rows_indexes[0], columns_indexes[-1], rows_indexes[-1] 

    im.crop((x1, y1, x2, y2)).save(os.path.join(cropped_folder, "c_" + image_name)) 
+0

체크 블롭 검출 알고리즘 및 방법. SimpleCV 라이브러리에는 몇 가지가 있습니다. 계산 : http://simplecv.readthedocs.org/en/1.0/cookbook/ – darxtrix

+0

우리가 볼 수있는 예제 사진이 있습니까? – rayryeng

+0

사진은 개인 사진이므로 게재 할 수 없습니다. 인쇄 된 사진을 스캐너에 올려 놓고 스캔하는 것을 상상해보십시오. 인쇄 된 사진과 흰색 배경이있는 이미지를 만듭니다. – GiannisIordanou

답변

4

, 난 (백색 닫으 모든 픽셀을 선택하여 마스크를 작성하기 때문에

예시 그림은 다음과 같다 관심 영역 바깥의 값은 정확히 흰색이 아닙니다. 그런 다음 마스크를 반전하여 잠재적으로 이미지에 속하는 픽셀을 찾습니다. 그런 다음 해당 픽셀의 경계 상자를 계산하고 관심 영역을 추출하는 데 사용합니다.

from skimage import io, img_as_float 
import matplotlib.pyplot as plt 
import numpy as np 


image = img_as_float(io.imread('universe.jpg')) 

# Select all pixels almost equal to white 
# (almost, because there are some edge effects in jpegs 
# so the boundaries may not be exactly white) 
white = np.array([1, 1, 1]) 
mask = np.abs(image - white).sum(axis=2) < 0.05 

# Find the bounding box of those pixels 
coords = np.array(np.nonzero(~mask)) 
top_left = np.min(coords, axis=1) 
bottom_right = np.max(coords, axis=1) 

out = image[top_left[0]:bottom_right[0], 
      top_left[1]:bottom_right[1]] 

plt.imshow(out) 
plt.show() 
+0

완벽하게 작동합니다. 여러 이미지를 자르기 위해 이와 같은 것을 적용하는 것은 너무 복잡할까요? – GiannisIordanou

+0

흰색 배경에서 여러 사각형 이미지를자를 방법을 찾고 있습니까? –

+0

그건 정확히 내가 원하는거야. 나는 창에서 사용하는 방법을 모르겠 imagemagick에 대한 multicrop라는 스크립트와 스크립트를 분할이라고 불리는 김프에 대한 플러그인을 발견했습니다. – GiannisIordanou

관련 문제