与颜色矩阵形成对比

时间:2014-05-26 08:05:27

标签: c# contrast colormatrix

您好我想在我的应用程序中实施对比度过滤器,例如this linkthis contrast,但颜色矩阵和轨迹栏用于值
我已经为它找到了颜色矩阵

float c = mytrackbar.value * 0.01f //maxTrackbarValue = 100, minTrackbarValue = -100 
float t = 0.01f;
cmPicture = new ColorMatrix(new float[][] {
    new float[] {c,0,0,0,0},
    new float[] {0,c,0,0,0},
    new float[] {0,0,c,0,0},
    new float[] {0,0,0,1,0},
    new float[] {t,t,t,0,1}
});

但结果却截然不同。我尝试在~c~ 中改变 0.01f,在~t~ 中改变 0.01f,但它只给出亮度等结果 (例如:c = mytrackbar.value * 0.04f)

我不知道是什么~c~& ~t~值以及我应该用于创建对比度的最大和最小范围


更新@Nico

    private void myTrackBar_ValueChanged(object sender, EventArgs e) {
        imageHandle = imageHandleTemp.Bitmap;
        myNumericUpDown.Text = myTrackBar.Value.ToString();
        float value = myTrackBar.Value * 0.01f;

        Bitmap bmpInverted = new Bitmap(imageHandle.Width, imageHandle.Height);
        ImageAttributes ia = new ImageAttributes();
        ColorMatrix cmPicture = new ColorMatrix();

        float c = value;
        float t = 0.01f;
        cmPicture = new ColorMatrix(new float[][] {
            new float[] {c,0,0,0,0},
            new float[] {0,c,0,0,0},
            new float[] {0,0,c,0,0},
            new float[] {0,0,0,1,0},
            new float[] {t,t,t,0,1}
        });

        ia.SetColorMatrix(cmPicture);
        Graphics g = Graphics.FromImage(bmpInverted);
        g.DrawImage(imageHandle, new Rectangle(0, 0, imageHandle.Width, imageHandle.Height), 0, 0, imageHandle.Width, imageHandle.Height, GraphicsUnit.Pixel, ia);
        g.Dispose();

        Image<Bgr, Byte> myImage = new Image<Bgr, byte>(bmpInverted);
        imageBoxCamera.Image = myImage;
    }

2 个答案:

答案 0 :(得分:3)

t值必须来自新对比度值c 派生。所以改变它的任务如下:

float t =(1.0f - c)/ 2.0f;

根据ColorMatrix Guide的这个很好的链接,矩阵代码的其余部分似乎没问题。

注意:我对c的范围错了!! c的值不是绝对值,但应该应用因子!所以要加倍对比,它应该 2f

注2:您的代码不清楚源和目标;并且由于您正在使用轨迹栏动态更改对比度,因此应该明确在应用更改之前

  • 必须始终从同一原始位图计算中间结果。

  • 此外,轨迹栏应如此初始化,以值1开头。

  • 最后,为了减少对比度值,应转换为0 <0。 c&lt; 1。

Nico的建议c = 1+ value;可以很好地处理原始范围-100到+100,初始值为0,因子为0.01f。

答案 1 :(得分:3)

以下是关于该过程背后的数学的一些进一步解释。如果你要接受答案,接受TaW的回答,他比我快。

调整对比度基本上可以做到以下几点:

  1. 将所有像素值移位-0.5(使中灰色变为0)
  2. 它将因子应用于所有像素值
  3. 它还原了转变
  4. 所以在公式中:

    newValue = factor * (oldValue - 0.5) + 0.5
             = factor * oldValue - factor * 0.5 + 0.5
             = factor * oldValue + 0.5 * (1 - factor)
    

    对于单通道图像,我们可以将其转换为矩阵乘法:

    (newValue, 1) = (oldValue, 1) * /        factor      , 0\     <-- this is c, 0
                                    \ 0.5 * (1 - factor) , 1/     <-- this is t, 1
    

    对于多通道图像,2x2矩阵变为5x5(四个通道+ w通道用于平移)矩阵,c和t位于您已指定的位置。

    请注意,因素1不会改变任何内容。因子0使整个图像呈中灰色。所以你可能想调整你的c:

    的计算
    c = 1 + value;
    t = 0.5f * (1.0f - c);