簡體   English   中英

在Python上使用PIL更改像素顏色

[英]Changing pixel color using PIL on Python

我對編程非常陌生,並且正在學習有關使用PIL進行圖像處理的更多信息。

我有一項特定的任務,要求我將每個特定像素的顏色更改為另一種顏色。 由於需要更改的像素不止幾個,因此我創建了一個for循環來訪問每個像素。 腳本至少“有效”,但是結果只是每個像素中具有(0,0,0)顏色的黑屏。

from PIL import Image
img = Image.open('/home/usr/convertimage.png')
pixels = img.load()
for i in range(img.size[0]):
    for j in range(img.size[1]):
            if pixels[i,j] == (225, 225, 225):
                pixels[i,j] = (1)
            elif pixels[i,j] == (76, 76, 76):
                pixels [i,j] = (2)
            else: pixels[i,j] = (0)
img.save('example.png')

我的圖像是灰度圖像。 有特定的顏色,並且邊框附近有漸變顏色。 我試圖用另一種顏色替換每種特定的顏色,然后用另一種顏色替換漸變顏色。

但是,對於我一生來說,我根本不明白為什么我的輸出完全只顯示一種(0,0,0)顏色。

我試圖在網上和朋友那里尋找答案,但無法提出解決方案。

如果外面有人知道我在做什么錯,我們將非常感謝您提供任何反饋意見。 提前致謝。

問題是,正如您所說,您的圖像是灰度的 ,因此在此行上:

if pixels[i,j] == (225, 225, 225):

沒有像素會等於RGB三元組(255,255,255)因為白色像素將只是灰度值255而不是RGB三元組。

如果將循環更改為:

        if pixels[i,j] == 29:
            pixels[i,j] = 1
        elif pixels[i,j] == 179:
            pixels [i,j] = 2
        else:
            pixels[i,j] = 0

這是對比結果:

在此處輸入圖片說明


您可能要考慮使用“ Look Up Table”或LUT進行轉換,因為大量的if語句可能會變得笨拙。 基本上,圖像中的每個像素都會替換為一個新像素,該像素可以通過在表中查找其當前索引來找到。 我也用numpy來做,很有趣:

#!/usr/local/bin/python3
import numpy as np
from PIL import Image

# Open the input image
PILimage=Image.open("classified.png")

# Use numpy to convert the PIL image into a numpy array
npImage=np.array(PILimage)

# Make a LUT (Look-Up Table) to translate image values. Default output value is zero.
LUT=np.zeros(256,dtype=np.uint8)
LUT[29]=1    # all pixels with value 29, will become 1
LUT[179]=2   # all pixels with value 179, will become 2

# Transform pixels according to LUT - this line does all the work
pixels=LUT[npImage];

# Save resulting image
result=Image.fromarray(pixels)
result.save('result.png')

結果-拉伸對比度后:

在此處輸入圖片說明


上面我可能有點冗長,所以如果您喜歡更簡潔的代碼:

import numpy as np
from PIL import Image

# Open the input image as numpy array
npImage=np.array(Image.open("classified.png"))

# Make a LUT (Look-Up Table) to translate image values
LUT=np.zeros(256,dtype=np.uint8)
LUT[29]=1    # all pixels with value 29, will become 1
LUT[179]=2   # all pixels with value 179, will become 2

# Apply LUT and save resulting image
Image.fromarray(LUT[npImage]).save('result.png')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM