OpenCV:如何增加颜色通道

本文关键字:增加 颜色 通道 何增加 OpenCV | 更新日期: 2023-09-27 18:31:30

在RGB图像(来自网络摄像头)中,我正在寻找一种增加绿色强度/亮度的方法。如果有人能给出一个起点,那就太高兴了。

我直接在 C++ 中使用 C# 和/或 OpenCV 中的 AFORGE.NET。

OpenCV:如何增加颜色通道

通常像素

值的乘法是对比度的增加,加法是亮度的增加。

在 C# 中

其中有一个到图像中第一个像素的数组,如下所示:

byte[] pixelsIn;  
byte[] pixelsOut; //assuming RGB ordered data

以及对比度和亮度值,如下所示:

float gC = 1.5;
float gB = 50;

您可以乘以和/或添加到绿色通道以达到您想要的效果:(R - 行,C - 列,通道 - nr)

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);