我想调整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的集成