与颜色矩阵形成对比

嗨我想在我的应用程序中实现对比度filter, 如此链接或此对比度,但颜色矩阵和跟踪栏的值
我已经找到了它的颜色矩阵

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 myImage = new Image(bmpInverted); imageBoxCamera.Image = myImage; } 

t值必须从新的对比度值c 导出 。 所以改变它的任务如下:

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

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

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

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

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

  • 此外,轨迹栏应该是初始化的,它以值1开头。

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

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

以下是关于该过程背后的数学的一些进一步解释。 如果你要接受答案,接受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);