在 RGB 图像(来自网络摄像头)中,我正在寻找一种增加绿色强度/亮度的方法。很高兴有人能给出一个起点。
我在 C# 中使用 AFORGE.NET 和/或直接在 C++ 中使用 OpenCV。
一般来说,像素值的乘法是增加对比度,加法是增加亮度。
在c#中
你有一个数组到图像中的第一个像素,例如:
byte[] pixelsIn;
byte[] pixelsOut; //assuming RGB ordered data
以及对比度和亮度值,例如:
float gC = 1.5;
float gB = 50;
您可以乘以和/或添加到绿色通道以达到您想要的效果:(r - 行,c - 列,ch - 通道数)
pixelsOut[r*w*ch + c*ch] = pixelsIn[r*w*ch + c*ch] //red
int newGreen = (int)(pixelsIn[r*w*ch + c*ch+1] * gC + gB); //green
pixelsOut[r*w*ch + c*ch+1] = (byte)(newGreen > 255 ? 255 : newGreen < 0 ? 0 : newGreen); //check for overflow
pixelsOut[r*w*ch + c*ch+2] = pixelsIn[r*w*ch + c*ch+2]//blue
显然你会想在这里使用指针来加快速度。
(请注意:此代码尚未经过测试)
对于 AFORGE.NET,我建议使用ColorRemapping
类将绿色通道中的值映射到其他值。如果您想在不丢失细节的情况下增加亮度,映射函数应该是从 [0,255] 到 [0,255] 的凹函数。
这是我在阅读了很多页的 AForge.NET 和 OpenCV 文档后得出的结论。如果您先应用饱和度滤镜,您可能会得到一个令人头晕的图像。如果您稍后应用它,您将获得更清晰的图像,但在应用 HSV 过滤器之前可能会丢失一些“浅绿色”像素。
// apply saturation filter to increase green intensity
var f1 = new SaturationCorrection(0.5f);
f1.ApplyInPlace(image);
var filter = new HSLFiltering();
filter.Hue = new IntRange(83, 189); // all green (large range)
//filter.Hue = new IntRange(100, 120); // light green (small range)
// this will convert all pixels outside the range into gray-scale
//filter.UpdateHue = false;
//filter.UpdateLuminance = false;
// this will convert all pixels outside that range blank (filter.FillColor)
filter.Saturation = new Range(0.4f, 1);
filter.Luminance = new Range(0.4f, 1);
// apply the HSV filter to get only green pixels
filter.ApplyInPlace(image);