Python的標準庫不附帶任何強大,足以圖像處理的代碼,但也有易於安裝和使用一些替代品。我將展示如何使用PIL來做到這一點。
from PIL import Image
def randomStars(small, large):
import random
filename = pickAFile()
pic = Image.open(filename)
max_x, max_y = pic.size
pixels = im.load()
x = random.randrange(max_x)
y = random.randrange(max_y)
for i in range(max_x):
for j in range(max_y):
if random.random() < 0.25:
red = random.randint(256)
green = random.randint(256)
blue = random.randint(256)
pixels[i, j] = (red, green, blue, 1)
im.show()
在你的應用程序的show
功能不顯示圖像(對於這一點,你需要某種形式的GUI與事件循環,像tkinter
或PySide
);它將文件保存到臨時目錄並運行特定於平臺的程序(如Preview或xv)以顯示它。
我假設你也想保存文件。這是太容易了:
name, ext = os.path.splitext(filename)
outfilename = '{}-with-stars.{}'.format(name, ext)
im.save(outfilename)
這將重新保存到默認設置JPEG .jpg格式,依賴於PIL猜你從文件名想要的東西。 (這意味着,是的,你可以通過使用'{}-with-stars.png'.format(name)
將它保存爲PNG。)如果你想要更多的控制,PIL也可以這樣做,指定一個明確的格式和特定格式的選項。
到目前爲止,這僅僅是如何將現有的代碼能夠正確地運行,你可以玩,並開始調試;它實際上並沒有回答原來的問題。
我想在這張照片
所以首先天上來寫,這將創建一個隨機數的函數的明星(m和n之間(含)),你需要這個作爲你的循環,而不是遍歷所有像素:現在
for _ in random.randint(m, n):
:
我要天上的星星應該隨機組成d爲單個白色像素或4個相鄰白色像素的正方形。
x, y = random.randrange(max_x), random.randrange(max_y)
if random.random() < .5:
# draw white pixel at [x, y]
pixels[x, y] = (1, 1, 1, 1)
else:
# draw square at [x, y], making sure to handle edges
我也不想放置一個「明星」(1個像素),在樹枝,月亮或鳥雖然
您需要定義如何知道什麼是樹枝,月亮或鳥的一部分。你可以用像素顏色來定義它嗎?
從快速一瞥,它看起來像你可能會。月亮的像素比其他任何東西都明亮,更飽和,更偏紅等等(除了角落裏的AP標誌,它更亮)。鳥和樹枝比其他任何東西都黑。事實上,它們非常獨特,你甚至不必擔心做正確的顏色空間數學;它可以是這樣的簡單:
r, g, b, a = pixels[x, y]
fake_brightness = r+g+b+a
if fake_brightness < 0.2:
# Tree or bird, pick a new random position
elif 1.2 < fake_brightness < 2.8:
# Moon, pick a new random position
else:
# Sky or API logo, scribble away
(這些數字顯然只是無中生有的,但有點試驗和錯誤應該給你可用值。)
當然,如果你在做這個學習練習,你可能想要學習正確的色彩空間數學,甚至可以編寫一個邊緣檢測算法,而不是依賴這個圖像是如此簡單的解析。
這東西,有在其他照片的效果? Gimp可能是你最好的選擇;-)。 – Hoopdady 2013-02-28 20:34:50
@Hopopady:爲什麼?他想要做的每件事都很容易在'PIL','ImageMagick'包裝器,'scipy'等等中完成。 – abarnert 2013-02-28 20:38:01
@abarnert爲何選擇哪一部分?我想知道它是否需要在其他圖片上工作,因爲它不會覆蓋鳥,月亮或樹木,而是要針對這一個。爲什麼使用gimp?因爲它的超級快速隨機點擊鋼筆工具,並在天空中放置一些1x1或4x4的白點。 – Hoopdady 2013-02-28 20:41:22