我想調整python中圖像的顏色級別。我可以使用任何可以輕鬆安裝在我的Ubuntu桌面上的Python庫。我想和ImageMagick的-level
(http://www.imagemagick.org/www/command-line-options.html#level)一樣。 PIL(Python圖像庫)似乎沒有它。我一直呼籲convert
在圖像上,然後再讀迴文件,但這似乎很浪費。有更好/更快的方法嗎?與python/PIL中ImageMagick的「-level」一樣嗎?
3
A
回答
6
如果我正確理解了ImageMagick的-level
選項,那麼我提供的level_image
函數應該做你想做的。
有兩點需要注意:
- 速度絕對可以提高
- 它目前只適用於RGB圖像作品
- 算法經過了HSV色彩空間,並且隻影響V(亮度)部件
的代碼:
import colorsys
class Level(object):
def __init__(self, minv, maxv, gamma):
self.minv= minv/255.0
self.maxv= maxv/255.0
self._interval= self.maxv - self.minv
self._invgamma= 1.0/gamma
def new_level(self, value):
if value <= self.minv: return 0.0
if value >= self.maxv: return 1.0
return ((value - self.minv)/self._interval)**self._invgamma
def convert_and_level(self, band_values):
h, s, v= colorsys.rgb_to_hsv(*(i/255.0 for i in band_values))
new_v= self.new_level(v)
return tuple(int(255*i)
for i
in colorsys.hsv_to_rgb(h, s, new_v))
def level_image(image, minv=0, maxv=255, gamma=1.0):
"""Level the brightness of image (a PIL.Image instance)
All values ≤ minv will become 0
All values ≥ maxv will become 255
gamma controls the curve for all values between minv and maxv"""
if image.mode != "RGB":
raise ValueError("this works with RGB images only")
new_image= image.copy()
leveller= Level(minv, maxv, gamma)
levelled_data= [
leveller.convert_and_level(data)
for data in image.getdata()]
new_image.putdata(levelled_data)
return new_image
如果有某種方法可以使用PIL進行RGB→HSV轉換(反之亦然),那麼可以將其分割爲H,S,V帶,使用V帶的.point
方法並將其轉換回RGB,加速這個過程很多;但是,我還沒有找到這樣的方式。
3
爲什麼不使用PythonMagick?它是Image Magick的Python界面。
相關問題
- 1. ftp.storbinary與ftp.retrbinary不一樣嗎?
- 2. 是window.load()與.load()在jQuery中一樣嗎?
- 3. 比ImageMagick快嗎?
- 4. 與ImageMagick的
- 5. 與ImageMagick的
- 6. 與ImageMagick的
- 7. 與MongoDB一樣,緩存與MySQL一樣重要嗎?
- 8. b2Body與CCSprite的大小不一樣嗎?
- 9. F#與Haskell的where子句一樣嗎?
- 10. 麻煩與ImageMagick的
- 11. 啤酒與ImageMagick的
- 12. DOM Level 0事件與DOM Level 2事件有什麼區別?
- 13. ImageMagick與Visual Studio
- 14. Codeigniter與ImageMagick
- 15. AS3 - 「\ u2605」與「\\ u」+「2605」不一樣嗎?
- 16. Ie6 * lat與1000000 * lat不一樣嗎?
- 17. FetchType EAGER與Root fetch()不一樣嗎?
- 18. PostgreSQL在Oracle中是否有像「LEVEL」這樣的僞列?
- 19. C#公鑰中的RSA與私鑰是一樣的嗎?
- 20. C++中的「char * p1; p1 = str;」與「char * p1 = str;」是一樣的嗎?
- 21. 「int」真的需要至少與C中的「short」一樣大嗎?
- 22. 我應該在Drupal中將ImageMagick或GD2與ImageAPI一起使用嗎?
- 23. SQL與CodeIgniter中的一樣
- 24. 用戶主頁與R中的「〜」不一樣嗎?
- 25. 「Joe Smith」與rspec中的Joe Smith不一樣嗎?
- 26. PHP中的封送/序列化與serialize($ var)一樣簡單嗎?
- 27. pdf到jpg與ImageMagick
- 28. 如何與XQuartz一起使用ImageMagick
- 29. Imagemagick不與MAMP一起安裝
- 30. PowerShell與ImageMagick/VIPS的集成