2012-10-07 26 views
4

我想知道如何從圖像中移除整行,最好基於行的顏色?使用PIL或Numpy數組,我該如何從圖像中移除整行?

例如:我有一個高度爲5像素的圖像,頂部兩行和底部兩行是白色,中間一行是黑色。我想知道如何讓PIL識別這行黑色像素,然後刪除整行並保存新圖像。

我對python有一些瞭解,並且迄今爲止一直在列出「getdata」的結果來編輯我的圖像,所以任何使用僞代碼的答案都可能足夠。謝謝。

回答

3

我給你寫了下面的代碼,刪除每一行是完全黑色的。我使用for循環的else clause,該循環在循環爲而不是中斷時退出。

from PIL import Image 

def find_rows_with_color(pixels, width, height, color): 
    rows_found=[] 
    for y in xrange(height): 
     for x in xrange(width): 
      if pixels[x, y] != color: 
       break 
     else: 
      rows_found.append(y) 
    return rows_found 

old_im = Image.open("path/to/old/image.png") 
if old_im.mode != 'RGB': 
    old_im = old_im.convert('RGB') 
pixels = old_im.load() 
width, height = old_im.size[0], old_im.size[1] 
rows_to_remove = find_rows_with_color(pixels, width, height, (0, 0, 0)) #Remove black rows 
new_im = Image.new('RGB', (width, height - len(rows_to_remove))) 
pixels_new = new_im.load() 
rows_removed = 0 
for y in xrange(old_im.size[1]): 
    if y not in rows_to_remove: 
     for x in xrange(new_im.size[0]): 
      pixels_new[x, y - rows_removed] = pixels[x, y] 
    else: 
     rows_removed += 1 
new_im.save("path/to/new/image.png") 

如果你有問題,只是問:)

+0

感謝您抽出寶貴時間來回答哈萊克斯。我想我應該對我給出的例子更具體一些,因爲我之前嘗試過類似的東西。有可能任何一行都可能以黑色像素開始,所以有些行並不意味着被刪除。這就是爲什麼我需要知道如何只刪除完全黑色的行(顏色不重要,僅作爲示例給出)或者甚至是完全透明的行。 –

+1

@ Py-Newbie我更改了代碼以刪除完全黑色的行。如果你想刪除透明的行,你不能將圖像轉換爲RGB,而是轉換爲'RGBA'。 – halex

+0

我剛剛看到編輯,謝謝halex! –

相關問題