我正在尝试自动增强一些要转换为数码相框的图像。我有适当的代码调整大小,将日期/时间添加到图像的最不重要(最少细节)角落,并将成对的肖像图像粘贴在一起,以避免在帧的41:20低分辨率屏幕中显示单个肖像。 / p>
我为那些光线不太好的照片实现了亮度拉伸滤镜,使用colorsys.rgb_to_hsv
函数计算H,S,V波段,在V 1上运行然后转换回来在将数字帧保存为JPEG之前将RGB格式化为RGB。显然,即使使用itertools
技巧,转换也需要很长时间;我设法使用psyco
改善了一些事情。
但是,我注意到PIL Image.convert
的一个示例,其中RGB可以使用4×4矩阵转换为XYZ color space作为convert
方法的第二个参数,我得到了想知道:
如何在convert
方法调用中使用自定义矩阵将RGB转换为HSV(然后将HSV转换回RGB)? (在这种情况下,小的舍入误差并不重要,所以我不介意每个波段将表示为一系列0 ... 255个整数)
提前谢谢。
答案 0 :(得分:1)
虽然我已经看过声称HSV色彩空间是RGB的线性变换的参考文献[1],这似乎意味着它可以用矩阵完成,但我一直无法找到或确定自己是什么这样的矩阵看起来像。在某种程度上,基于我所见过的所有[类似]非矩阵程序实现,这并不让我感到惊讶 - 它们的方式不会看起来线性。
无论如何,在调查这篇文章的过程中,我遇到了前SGI研究员Paul Haeberli的在线计算机图形笔记本[{3}}的一篇[有点过时]的文章,其中描述了如何做出多种不同的颜色使用4x4矩阵的转换可能对您有所帮助。给出的所有示例都直接在RGB彩色图像上运行,并且像几何矩阵变换一样,它们的任何序列都可以使用串联组合成单个矩阵。
希望这会有所帮助。
<小时/> [1]:色彩空间转换&lt; Matrix Operations for Image Processing&gt;:
2.7.3 HSL(色调饱和度和亮度)
这代表了丰富的类似 色彩空间,替代名称 包括HSI(强度),HSV(值), HCI(色度/色彩),HVC, TSD(色调饱和度和黑暗度)等 大多数这些色彩空间都是 来自RGB的线性变换和 因此设备依赖和 非线性的。他们的优势在于 非常直观的方式 指定颜色。这很容易 选择所需的色调,然后选择 通过调整稍微修改它 它的饱和度和强度。
答案 1 :(得分:0)
可以在此处找到将RGB值转换为HSV值的公式:http://www.rapidtables.com/convert/color/rgb-to-hsv.htm。我曾经反过来需要它,并为它做了以下功能。
def hsb2rgb(hsb):
'''
Transforms a hsb array to the corresponding rgb tuple
In: hsb = array of three ints (h between 0 and 360, s and v between 0 and 100)
Out: rgb = array of three ints (between 0 and 255)
'''
H = float(hsb[0] / 360.0)
S = float(hsb[1] / 100.0)
B = float(hsb[2] / 100.0)
if (S == 0):
R = int(round(B * 255))
G = int(round(B * 255))
B = int(round(B * 255))
else:
var_h = H * 6
if (var_h == 6):
var_h = 0 # H must be < 1
var_i = int(var_h)
var_1 = B * (1 - S)
var_2 = B * (1 - S * (var_h - var_i))
var_3 = B * (1 - S * (1 - (var_h - var_i)))
if (var_i == 0):
var_r = B ; var_g = var_3 ; var_b = var_1
elif (var_i == 1):
var_r = var_2 ; var_g = B ; var_b = var_1
elif (var_i == 2):
var_r = var_1 ; var_g = B ; var_b = var_3
elif (var_i == 3):
var_r = var_1 ; var_g = var_2 ; var_b = B
elif (var_i == 4):
var_r = var_3 ; var_g = var_1 ; var_b = B
else:
var_r = B ; var_g = var_1 ; var_b = var_2
R = int(round(var_r * 255))
G = int(round(var_g * 255))
B = int(round(var_b * 255))
return [R, G, B]