从32位JPG到14位灰度的比特变化我的数学是错误的

本文关键字:我的 变化 错误 JPG 32位 14位 灰度 | 更新日期: 2023-09-27 18:29:29

我有14位图像,然后我作为JPG进行一些处理,然后将其转换回14位。但我的数学最终都错了。

我尝试使用原始的"最小/最大"值。

ushort[,] outputImage = new ushort[sourceBitmap.Height, sourceBitmap.Width];
//Max = White Min = White ... relatively
int distance = io_current.MaximumValue - io_current.MinimumValue; 

作为一段距离。。。价值但我不知道这是否正确。Jpg是PixelFormat.Format32ppArgb它仍然是一个灰度图像,所以我只取BlueColor,因为它们都是相同的值:

在for循环中遍历JPG时Rows和Cols:Each值我的代码实际上是以这种方式创建一个新的JPG:

resultBuffer[byteOffset] = (byte)(blueTotal);
resultBuffer[byteOffset + 1] = (byte)(greenTotal);
resultBuffer[byteOffset + 2] = (byte)(redTotal);
resultBuffer[byteOffset + 3] = 255;

如前所述,蓝色、绿色和红色都是相同的值。

因此,我的数学变得不稳定的地方是:

long total = (long)(255 - blueTotal); //invert the value;
total = ((total * distance) / 255); //Convert to 14bit within the 
                                   //confines of the  original Min and Max
if (total < io_current.MinimumValue) total = io_current.MinimumValue;
else if (total > io_current.MaximumValue) total = io_current.MaximumValue;
outputImage[offsetY, offsetX] = (ushort)total;

注意:我可以将"距离"更改为38416:最大14位,但这两个数字都会产生糟糕的结果。

从32位JPG到14位灰度的比特变化我的数学是错误的

如果我理解正确:

  • 您的图像具有14位灰度像素
  • 您知道现有的最小值和最大值
  • 您正在将其转换为8位灰度进行处理
  • 您希望重新转换为14位灰度,映射到原始的最小-最大范围

如果这是正确的,那么假设你已经保存了你的原始范围:

double dMin = yourOriginalMin, dMax = yourOriginalMax;

那么你想映射到的范围的大小是:

double dRange = dMax - dMin;

所以现在你有一个在0到255范围内的像素,你想把它映射回你的14位范围:

unsigned char uSrcPixel = 111; // some arbitrary value for example
ushort uDstPixel = dMin + ((double)uSrcPixel / 255.0) * dRange;

这有帮助吗?