问题描述
我想将一个 RGB 图像转换为黑白 RGB 图像,如果像素的 HSV 值在一定范围内则为黑色,否则为白色.
I want to take an RGB image and convert it to a black and white RGB image, where a pixel is black if its HSV value is between a certain range and white otherwise.
目前我创建了一个新图像,然后通过遍历其数据创建一个新像素值列表,然后 .putdata()
该列表形成新图像.
Currently I create a new image, then create a list of new pixel values by iterating through its data, then .putdata()
that list to form the new image.
感觉应该有一种更快的方法来做到这一点,例如使用 .point()
,但似乎 .point()
没有得到给定的像素,而是从 0 到 255 的值.是否有 .point()
变换但在像素上?
It feels like there should be a much faster way of doing this, e.g. with .point()
, but it seems .point()
doesn't get given pixels but values from 0 to 255 instead. Is there a .point()
transform but on pixels?
推荐答案
好的,这确实有效(修复了一些溢出错误):
Ok, this does work (fixed some overflow errors):
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
它基于维基百科对HSV的定义.当我有更多时间时,我会查看它.肯定有加速,也许还有错误.如果你找到了,请告诉我.干杯.
It is based on the Wikipedia's definition of HSV. I'll look it over as I get more time. There are definitely speedups and maybe bugs. Please let me know if you find any. cheers.
结果:
从这个色轮开始:
我得到了这些结果:
色调:
值:
饱和度:
这篇关于使用 Python/PIL 检测 HSV 颜色空间(来自 RGB)中的阈值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!