2014-10-11 133 views
3

我正在掃描舊照片,因此我有掃描儀的圖像和白色背景。我的目標是拍攝照片,消除白色背景。我怎樣才能做到這一點 ?如何使用python在白色背景上裁剪圖像?

一個例子畫面如下: 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

結帳blob檢測算法和方法。 SimpleCV庫有一些。結帳:http://simplecv.readthedocs.org/en/1.0/cookbook/ – darxtrix 2014-10-11 04:26:16

+0

你有我們可以看到的示例圖片嗎? – rayryeng 2014-10-11 22:02:41

+0

他們是個人照片,所以我無法顯示。想象一下,將打印的照片放在掃描儀上並進行掃描。它使用打印的照片和白色背景創建圖像。 – GiannisIordanou 2014-10-11 22:31:27

回答

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 2014-10-16 17:14:18

+0

您是否正在尋找一種方法來裁剪出白色背景中的多個長方形圖像? – 2014-10-17 01:27:25

+0

這正是我想要的。我找到了一個GIMP插件,稱爲分割掃描圖像和一個名爲multirop for imagemagick的腳本,我不知道如何在Windows中使用它。 – GiannisIordanou 2014-10-17 06:24:24