首页 文章

OpenCV:如何增加色彩通道

提问于
浏览
0

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

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

3 回答

  • 0

    通常,像素值的乘法虽然是对比度的增加,但是增加虽然是亮度的增加 .

    在c#中

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

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

    和对比度和亮度值如下:

    float gC = 1.5;
    float gB = 50;
    

    您可以乘以和/或添加到绿色通道以达到您想要的效果:(r - row,c - column,ch - nr of channels)

    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
    

    显然你会想在这里使用指针加快速度 .

    (请注意:此代码尚未经过测试)

  • 0

    对于AFORGE.NET,我建议使用 ColorRemapping class将绿色通道中的值映射到其他值 . 如果你想增加亮度而不丢失细节,映射函数应该是从[0,255]到[0,255]的凹函数 .

  • 1

    这是我在阅读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);
    

相关问题