簡體   English   中英

標記空白圖像的像素

[英]Mark pixels of a blank image

我想標記像素,

Mark=[2, 455, 6, 556, 12, 654, 22, 23, 4,86,.....] 這樣它就不會標記第一個 2 個像素,然后用 a 標記接下來的 455 個像素顏色,對於接下來的 6 個像素,它不會標記並再次用相同的顏色標記接下來的 556 個像素,依此類推。 圖像尺寸為 500x500x3。 我如何計算這些步驟?

Img=np.zeros((500,500,3),dtype=np.uint8)

您的算法實際上在您的問題中。 500x500x3 我猜你的意思是你的圖像是 500(寬度)在 500(高度)上具有 3 個顏色通道?

它可以如下實現,無需任何優化:

color = (128, 50, 30)
x, y = 0, 0
for (skip, count) in [Mark[n:n+2] for n in range(len(Mark) // 2)]:
    x += skip
    y += x // 500  # keep track of the lines, when x > 500,
                       # it means we are on a new line
    x %= 500  # keep the x in bounds

    # colorize `count` pixels in the image
    for i in range(0, count):
        
        Img[x, y, 0] = color[0]
        Img[x, y, 1] = color[1]
        Img[x, y, 2] = color[2]
        x += 1
        y += x // 500
        x %= 500  # keep the x in bounds

zip([a for i, a in enumerate(Mark) if i % 2 == 0], [a for i, a in enumerate(Mark) if i % 2 != 0])只是一種分組方式對(跳過,像素着色)。 不過,它肯定可以改進,我不是 Python 專家。

編輯:修改 zip() 以使用 Peter 建議的[Mark[n:n+2] for n in range(len(Mark) // 2)] ,更簡單,更容易理解。

最簡單的方法可能是將圖像轉換為 Numpy 數組:

import numpy as np
na = np.array(Img)

然后使用 Numpy ravel()為您提供陣列的扁平(1-D)視圖

flat = np.ravel(na)

您現在可以看到平面視圖的形狀:

print(flat.shape)

然后,您可以通過從您的問題中迭代您的偏移數組來進行着色。 那么好消息是,因為ravel()為您提供了原始數據view ,您對視圖所做的所有更改都將反映在您的原始數據中。

因此,要回到PIL Image ,您只需要:

RecolouredImg = Image.fromarray(na)

在擔心你的長列表之前,只需為前十個像素着色即可嘗試一下。


如果您喜歡使用 Python 列表(我不喜歡),您可以通過使用PIL getdata()獲取扁平的像素列表,然后根據您的要求處理列表並putdata()將它們全部放回,從而獲得類似的效果. 效果將是相同的,只需選擇適合您大腦工作方式的方法即可。

暫無
暫無

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

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