【问题标题】:contrast with color matrix与颜色矩阵对比
【发布时间】:2014-05-26 08:05:26
【问题描述】:

您好,我想在我的应用程序中实现对比度过滤器,例如 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;
    }

【问题讨论】:

  • 请添加代码的相关部分。你如何应用这个矩阵?
  • 看看这个link。它说t = (1.0 - c) / 2.0c = contrast。所有值都从 0 到 1。
  • @NicoSchertler 请查看我更新的帖子
  • @TaW 我很抱歉,但结果还是一样的投射到浮动..请检查我更新的帖子也许你可以帮助修复它

标签: c# contrast colormatrix


【解决方案1】:

t 值必须从新的对比度值 c派生。所以像这样改变它的分配:

浮点数 = (1.0f - c) / 2.0f;

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

注意:我对 c 的范围有误!! c 的值不是绝对值,而是应该应用的因素!所以要将对比度 加倍,它应该是 2f

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

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

  • 另外,trackbar 应该以 1 开头。

  • 最后,为了降低对比度,值应转换为 0

Nico 的建议 c = 1+ value; 可以很好地适用于您的 original 范围 -100 到 +100,初始值为 0,因子为 0.01f。

【讨论】:

  • hm...我认为现在的问题是限制最大和最小轨迹栏值...我使用 100 作为最大值和 -100 作为最小值....当轨迹栏最大值图像变得正常时& 在最低限度时它几乎与负数相同
  • 哈,我没看到,因为它只是看不见。另外:我对 c 范围的评论是错误的!这不是一个绝对值,而是一个因素!所以要加倍对比度,它应该是 2f。
【解决方案2】:

这里有一些关于该过程背后的数学的进一步解释。如果您要接受答案,请接受 TaW 的答案,他比我快。

调整对比度主要做以下事情:

  1. 它将所有像素值移动 -0.5(使中灰色变为 0)
  2. 它将因子应用于所有像素值
  3. 它恢复了班次

所以在一个公式中:

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

【讨论】:

    猜你喜欢
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    相关资源
    最近更新 更多