2013-02-11 198 views
2

我有一些產品圖像。這些圖像的背景是白色的。現在,在我的網站上,我想在不同的地方使用不同尺寸的相同圖像。問題是,由於圖像背景的顏色是白色的。但是,我需要作爲縮略圖的背景顏色是綠色的。同樣,作爲主要產品圖像,我希望背景呈淺藍色。例如,這是一張圖片。 link。你可以看到這個圖像的背景是白色的。我想使用與縮略圖相同的圖像。我寫了一個代碼來生成圖像縮略圖。但我想要一些其他顏色的背景。這可以通過圖像處理完成,最好在python中完成? 謝謝。相同圖像的不同背景,但大小不同

編輯:我不能評論任何答案嗎,不明白爲什麼。請回復。

+0

他們處理4個圖像的透明度 – wim 2013-02-11 06:49:41

+1

這是棘手其實,你需要處理您的鏈接的圖像JPG的工件,還處理這應該是白色的,但不是背景像素。之後,你必須進行一次轉變,使其看起來不可怕。我相信我在這個網站上看到過類似的問題,也許有人知道我指的是什麼,並且會包含一個鏈接。 – mmgp 2013-02-11 19:42:33

+0

@mmgp你在想這個嗎? http://stackoverflow.com/questions/8041703/remove-white-background-from-an-image-and-make-it-transparent – 2013-02-11 21:35:11

回答

2

這很容易做,如果你可以容忍在結果圖像中的一些醜陋的影響。如果具有不同背景顏色的此圖像將顯示爲原始圖像的縮小版本,則這些效果可能不明顯,並且都是好的。

所以這裏是一個簡單的方法:

  • 洪水從像素填充率爲(0,0),假設它是背景像素(在你的榜樣白色),並進行顏色填充時接受的細微差別。背景像素被透明點所取代。
  • 上述步驟提供了一個掩模,例如,您可以執行腐蝕和高斯過濾。
  • 用上面創建的蒙版粘貼「充滿洪水」的圖像。

以下是您可以從這種方法中得到的結果。輸入圖像,然後兩次轉換爲不同的背景顏色。

enter image description hereenter image description hereenter image description here

import sys 
import cv2 
import numpy 
from PIL import Image 

def floodfill(im, grayimg, seed, color, tolerance=15): 
    width, height = grayimg.size 
    grayim = grayimg.load() 
    start_color = grayim[seed] 

    mask_img = Image.new('L', grayimg.size, 255) 
    mask = mask_img.load() 
    count = 0 
    work = [seed] 
    while work: 
     x, y = work.pop() 
     im[x, y] = color 
     for dx, dy in ((-1,0), (1,0), (0,-1), (0,1)): 
      nx, ny = x + dx, y + dy 
      if nx < 0 or ny < 0 or nx > width - 1 or ny > height - 1: 
       continue 
      if mask[nx, ny] and abs(grayim[nx, ny] - start_color) <= tolerance: 
       mask[nx, ny] = 0 
       work.append((nx, ny)) 
    return mask_img 

img = Image.open(sys.argv[1]).convert('RGBA') 
width, height = img.size 
img_p = Image.new('RGBA', (width + 20, height + 20), img.getpixel((0, 0))) 
img_p.paste(img, (3, 3)) 
img = img_p 
img_g = img.convert('L') 
width, height = img.size 

im = img.load() 
mask = floodfill(im, img_g, (0, 0), (0, 0, 0, 0), 20) 

mask = numpy.array(mask) 
se = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7)) 
mask = cv2.erode(mask, se) 
mask = cv2.GaussianBlur(mask, (9, 9), 3) 
mask = Image.fromarray(mask) 

result_bgcolor = (0, 0, 0, 255) # Change to match the color you wish. 
result = Image.new('RGBA', (width, height), result_bgcolor) 
result.paste(img_p, (0, 0), mask) 

result.save(sys.argv[2]) 
相關問題