我正在寻找某种公式或算法来确定给定RGB值的颜色的亮度.我知道它不能像将RGB值一起添加并且具有更高的总和更简单一样简单,但我有点不知道从哪里开始.
我想根据0到100之间的值显示颜色.在一端(100),它是纯红色,另一端(0),纯绿色.在中间(50),我希望它是黄色的.
而且我希望颜色逐渐从一个渐变到另一个,这样在75,颜色是半红色和半黄色等.
如何编程RGB值以反映这种衰落?谢谢.
我正在将Color类作为c ++中非常基本的图形API的一部分.所以我决定看一下微软的.NET框架,发现他们的Color类有HSB的功能.
然后我开始研究,以确定我是否应该在课堂上提供HSB,HSL或HSV或所有这些.
所以,我有3个关于HSB,HSL,HSV的问题:
HSB与HSL相同吗?
如果没有,为什么没有HSBL甚至HSBLV?
我发现有很多不同的计算这些值的方法,有人能告诉我最快的吗?
我正在开发一种自动增强扫描35毫米幻灯片的程序.我正在寻找一种增强对比度和消除色偏的好算法.该算法必须是完全自动的,因为将有数千个图像要处理.这些是直接来自扫描仪的几个样本图像,仅针对网络裁剪和缩小尺寸:
我正在使用AForge.NET库,并尝试了HistogramEqualization
和ContrastStretch
过滤器.HistogramEqualization
有利于最大化局部对比度但总体上不会产生令人满意的结果.ContrastStretch
更好,但由于它单独拉伸每个色带的直方图,它有时会产生强烈的色偏:
为了减少颜色偏移,我UniformContrastStretch
自己使用ImageStatistics
和LevelsLinear
类创建了一个过滤器.这对所有色带使用相同的范围,以较低的对比度为代价保留色彩.
ImageStatistics stats = new ImageStatistics(image);
int min = Math.Min(Math.Min(stats.Red.Min, stats.Green.Min), stats.Blue.Min);
int max = Math.Max(Math.Max(stats.Red.Max, stats.Green.Max), stats.Blue.Max);
LevelsLinear levelsLinear = new LevelsLinear();
levelsLinear.Input = new IntRange(min, max);
Bitmap stretched = levelsLinear.Apply(image);
Run Code Online (Sandbox Code Playgroud)
虽然图像仍然很蓝,所以我创建了一个ColorCorrection
首先计算图像平均亮度的滤镜.然后为每个颜色通道计算伽马校正值,使得每个颜色通道的平均值将等于平均亮度.均匀对比度拉伸图像具有平均值R=70 G=64 B=93
,平均亮度为(70 + 64 + 93) / 3 = 76
.计算伽玛值R=1.09 G=1.18 B=0.80
,得到的非常中性的图像具有R=76 G=76 B=76
预期的平均值:
现在,解决真正的问题...我想将图像的平均颜色校正为灰色有点过于剧烈,会使一些图像在外观上显得相当沉闷,就像第二个样本(第一个图像是均匀拉伸的,接下来是相同的图像颜色校正):
在照片编辑程序中手动执行色彩校正的一种方法是对已知中性色(白色/灰色/黑色)的颜色进行采样,并将图像的其余部分调整为该颜色.但由于这个例程必须是完全自动的,所以这不是一个选择.
我想我可以为我的ColorCorrection
滤镜添加强度设置,因此强度为0.5会将平均值的一半移动到平均亮度.但另一方面,一些图像可能会做得最好,没有任何颜色校正.
有什么想法可以获得更好的算法吗?或者某些方法来检测图像是否有偏色或者只是有很多颜色,比如第二个样本?
.NET框架中是否内置了将HSV转换为RGB的API ?我没有在System.Drawing.Color中看到一个方法,但是平台上没有一个方法似乎令人惊讶.
如果给出的红色,绿色和蓝色值范围为0-255,那么获得色调值的最快计算是什么?该公式将以30fps(每秒920万次)用于640x480图像的每个像素,因此每一点速度优化都有帮助.
我见过其他公式,但我不满意他们涉及多少步骤.我正在寻找一个实际的公式,而不是内置的库函数.
我有PNG图像代表扑克牌.它们是标准颜色,俱乐部和黑桃是空白的,而钻石和红心是红色的.
我希望通过将俱乐部转换为绿色并将钻石转换为蓝色来创建一个4色套牌.
我不想重新绘制它们,但只是手工更换它们似乎很多工作,因为颜色不是全部"纯粹",而是在边缘附近分级.
我该怎么做?
我可能没有使用正确的颜色术语,但我希望基本上能够缩放类似于附加图片的颜色.我一直在寻找饱和度来做到这一点,因为看起来正确的版本只是左边的必须不那么饱和的版本.
我正在尝试这个(我找到了),但它看起来并不正确:
Public Shared Function GetDesaturatedColor(color As Color) As Color
Const kValue As Double = 0.01R
Dim greyLevel = (color.R * 0.299R) + _
(color.G * 0.587R) + _
(color.B * 0.144R)
Dim r = greyLevel * kValue + (color.R) * (1 - kValue)
Dim g = greyLevel * kValue + (color.G) * (1 - kValue)
Dim b = greyLevel * kValue + (color.B) * (1 - kValue)
' ColorUtils.ToByte converts the double value
' to a byte safely
Return …
Run Code Online (Sandbox Code Playgroud) 背景:
我们计划在传送系统上使用相机来计算物体.在这种特定情况下,我们不能使用传感器.我的所有物体都非常一致,如果它们出现在图片中,很容易被发现.我一直在寻找Aforge和其他一些图书馆,看起来很容易. 这就是我想要做的.
话虽如此,我确实有一些担忧.在过滤过程中,您必须指定要搜索的颜色.我的对象是纯色,但我们都知道在我看到的特定点上可能有100多个不同的rgb值.
有没有办法搜索一系列颜色,或者看一种颜色是否"喜欢"特定的颜色?
这是我第一次进行任何图像处理.我还没有尝试任何东西,即将开始,这在我开始之前就是一个问题.
任何帮助将不胜感激.