2014-02-19 43 views
-1

我有一張圖片(使用img = ImageGrab.grab(box)得到),我希望用白色替換某個RGB值的所有像素(精確到rgb(74,38,63)),其餘部分用黑色替換。如何使用PIL的im.point()查找和修改像素的RGB顏色?

問題是,圖像是在RGB,如果它是在一個單一的樂隊(如我以前在程序中),我可以使用:img2 = img.point (lambda i: i>254 and 255);但這不適用於rgb圖像,i在img.point似乎不是3個整數的元組(正如我所希望的那樣),它只是數字0到255(如果我沒有搞亂某處)。



注意,我不希望使用.getpixel()方法,它是我想要做的太慢了。

我的問題的一種替代方法是使用img.load()然後通過自己的像素矩陣工作,但我不知道這是多高效。

回答

0

Numpy非常適合廣義快速和特定的像素操作。下面是一個例子:

enter image description here

import Image 
import numpy as np 
import matplotlib.pyplot as plt 

im = Image.open("python.jpg") 
a = np.asarray(im) 

b = np.where(np.all(((a>[240, 40, 20]) * (a<=[255, 255, 150])), axis=2, keepdims=True), [80,0,0], [0,0,90]) 

plt.figure() 
plt.subplot(1,2,1) 
plt.imshow(a) 
plt.subplot(1,2,2) 
plt.imshow(b) 
plt.show() 

這裏我轉換的像素值範圍的,而不是一個單一的值。要執行單個值,請刪除使用==而不是>,並僅使用一個條件。另外,我使用matplotlib以簡單的方式顯示輸出和輸入,但也可以使用Image.fromarray(b.astype(np.uint8))將其轉換回圖像。

如果您想要應用一些簡單的標準過濾器,或者使用本地的getpixel操作,那麼保持純PIL可以正常工作,但對於大多數使用圖像的數字工作來說,numpy或圖像處理軟件包是最佳選擇。