【问题标题】:How to use setpixel for negative pixel value in c#?如何在 c# 中将 setpixel 用于负像素值?
【发布时间】:2017-12-05 14:29:30
【问题描述】:

当我通过这样做从像素中获取图像并得到错误为:

附加信息:“-13”的值无效。

所以请帮帮我。

bmp.Setpixel(x,y,Color.FromArgb(100,-12,100,100);

如上负像素值怎么办?

【问题讨论】:

  • 对不起,不是-13,而是-12。-12的值无效。
  • 你从哪里得到负值?您只能将值 0 到 255 与 FromArgb 函数一起使用:msdn.microsoft.com/en-us/library/at1k42eh(v=vs.110).aspx
  • 实际上我正在做人脸识别,我遇到了必须从给定像素值中减去平均像素值的情况。有什么解决办法吗?
  • 假设您的范围是 [min_in…max_in],您需要将其映射到每个颜色通道的 [0…255],即 out = (in - min_in) / (max_in - min_in) * 255。如果 min_in 和 max_in 不受限制或未知,一个好方法是将 min_in 设置为所有值的第 5 个百分位,将 max_in 设置为第 95 个百分位。
  • 好的,我会尝试并很快评论你。thanx很多@ckuri

标签: c# image-processing graphics


【解决方案1】:

你应该做两件事之一。

选项 1 是您现在正在做的事情,但有一个限制

int clampedRed = Math.Max(0, red - average);
// Repeat for Blue, Green  

bmp.SetPixel(x,y,Color.FromArgb(100, clampedRed, ...)

不过,最好不要使用平均像素值,因为这会将一半的图像变为黑色。可能更好地“标准化”图像。这意味着您需要找到图像(或四分位数)中每个通道的 MIN 和 MAX,然后缩放所有像素。

int minRed = // Get min in image
int maxRed = // get max in image
int rangeRed = maxRed - minRed
float scaling = 255 / rangeRed;

foreach (pixel in image){
   int normalisedRed = (int)((pixelRed - minRed) * scaling)
   int clampedRed = Math.Max(0, Math.Min(255, normalisedRed));
   // And then use that...   
}

【讨论】:

  • 好的,先生。实际上我所做的是 .avg=(pixel.R+pixel.G+pixel.B)/3 ,这个平均值是我的灰度颜色。所以在做any_pixel_value_image-avg的时候。我得到了否定的结果。我已经尝试了您的第一个,并且略有改进。我会尝试第二个。
  • 我做了平均。 Becoz 在将图像 (40*40) 像素转换为一维 (1*1600) 像素时。我强制将该值存储为每个维度的红色、绿色和蓝色的平均值。是否有任何解决方案可以将所有 3 个像素值存储到一个维度中,然后提前获取所有像素值..thanx
  • @DiwasPoudel - 如果要将图像转换为 1600 值数组,我建议您改为创建 3 个数组。一个红色值数组、一个单独的蓝色数组和一个单独的绿色数组。例如,要获取特定的像素值,您可以使用SetPixel(redArray[101], greenArray[101], blueArray[101])
  • 如果您有更多详细信息,请提出另一个问题,而不是使用 cmets,请随时评论并附上指向它的链接,我会去看看。
猜你喜欢
  • 2016-10-13
  • 2019-11-19
  • 2011-07-07
  • 2011-04-21
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 2020-04-11
相关资源
最近更新 更多