Cla*_*diu 10 python performance image image-processing python-imaging-library
我想拍摄RGB图像并将其转换为黑白RGB图像,如果其HSV值在某个范围之间,则像素为黑色,否则为白色.
目前我创建了一个新图像,然后通过迭代其数据创建一个新的像素值列表,然后创建.putdata()
该列表以形成新图像.
感觉应该有一个更快的方法来做这个,例如.point()
,但似乎.point()
没有得到像素,而是从0到255的值.是否有.point()
转换,但像素?
Pau*_*aul 21
好的,这确实有效(修复了一些溢出错误):
import numpy, Image
i = Image.open(fp).convert('RGB')
a = numpy.asarray(i, int)
R, G, B = a.T
m = numpy.min(a,2).T
M = numpy.max(a,2).T
C = M-m #chroma
Cmsk = C!=0
# Hue
H = numpy.zeros(R.shape, int)
mask = (M==R)&Cmsk
H[mask] = numpy.mod(60*(G-B)/C, 360)[mask]
mask = (M==G)&Cmsk
H[mask] = (60*(B-R)/C + 120)[mask]
mask = (M==B)&Cmsk
H[mask] = (60*(R-G)/C + 240)[mask]
H *= 255
H /= 360 # if you prefer, leave as 0-360, but don't convert to uint8
# Value
V = M
# Saturation
S = numpy.zeros(R.shape, int)
S[Cmsk] = ((255*C)/V)[Cmsk]
# H, S, and V are now defined as integers 0-255
Run Code Online (Sandbox Code Playgroud)
它基于维基百科对HSV的定义.随着时间的推移,我会仔细研究.肯定有加速和错误.如果您发现任何问题,请告诉我.干杯.
结果:
从这个色轮开始:
我得到这些结果:
色调:
值:
饱和:
编辑2:现在返回与Paul的代码相同的结果,因为它应该......
import numpy, scipy
image = scipy.misc.imread("test.png") / 255.0
r, g, b = image[:,:,0], image[:,:,1], image[:,:,2]
m, M = numpy.min(image[:,:,:3], 2), numpy.max(image[:,:,:3], 2)
d = M - m
# Chroma and Value
c = d
v = M
# Hue
h = numpy.select([c ==0, r == M, g == M, b == M], [0, ((g - b) / c) % 6, (2 + ((b - r) / c)), (4 + ((r - g) / c))], default=0) * 60
# Saturation
s = numpy.select([c == 0, c != 0], [0, c/v])
scipy.misc.imsave("h.png", h)
scipy.misc.imsave("s.png", s)
scipy.misc.imsave("v.png", v)
Run Code Online (Sandbox Code Playgroud)
它给出了从0到360的色调,从0到1的饱和度以及从0到1的值.我以图像格式查看结果,它们看起来很好.
我不确定通过阅读你的问题是否只是你感兴趣的HSV中的"价值".如果是,那么你可以绕过大部分代码.
然后,您可以根据这些值选择像素,并使用以下内容将它们设置为1(或白/黑):
newimage = (v > 0.3) * 1
Run Code Online (Sandbox Code Playgroud)