从 16bpp 到 BMP 图像上的伪影
Artifacts on Image from 16bpp to BMP
我在自己开发的显微镜上有一堆用 CCD 相机拍摄的图像。
我正在使用 Lumenera 的 CCD 相机,它生成 12bpp 的图像,拉伸,
<<4(在 LSB 上移动 4 个零)
到 16bpp。我附上原始图片 - 看起来很合理:
这是另一个:
以及其中许多的蒙太奇,其中有垂直线:
唯一的"Processing"我我认为蒙太奇是缩放最小值和最大值之间的值,并将该值压缩成一个字节,以便使用它在 8bpp 位图中,使用以下行:
public static void ParseImage(ushort[]image,ushort minVal,ushort maxVal, int nx,int ny)
{
...........
byte val = (byte)((image[i]-minval)/(maxVal-minVal)*byte.maxValue);
我知道:经过处理的图像中出现伪影,这通常让我将手指放在相机上,但相机制造商表示这可能与 12 位到 16 位之间的转换有关...
任何人都可以理解如何解决,如果是的话 - 如何解决?
或者我有一些可以通过这些工件识别的错误?
任何帮助(提示,给我更多的作业..)将不胜感激!谢谢
看不到原始数据,我只能根据您显示的图像进行工作。但我怀疑你的图像创建代码根本就错了。
据我所知,您有两个问题,这两个问题都源于原始数据。
- 图片整体亮度不一样。
- 图像的亮度有偏差,右上角有点暗,像阴影或单边晕影。
第一个问题比较容易克服;第二个不是这样。
这是一个简单的,实际上非常简单的方法将相当均匀的图像带到一个共同的亮度水平:
- 准备图片;由于它们相当粗糙,我们从每个创建一个较小的版本来进行统计。
- 计算整体亮度。我们不需要查看每个像素;一个相当大的数字就可以了。我使用
1000
个随机选择的像素。
- 调整图像以具有均匀的亮度。这是最好和最快的
ColorMatrix
.
- 使用两个颜色矩阵将图像拼接在一起。
我为两个较大的做了这个。正如您所看到的,左侧部分几乎是水平的,但在右侧,顶部的阴影比底部的阴影更暗,拼接伪影也很明显。
如果您无法在相机级别或通过更仔细的闪电解决此问题,我认为最好的解决方案是创建标准图像以进行校正;它将完全是空白的,即除了阴影之外没有动机。然后你可以通过某种方式从每个真实图像中减去它,即可能在计算一些因子以允许伽玛差异之后。
结果如下:
..这是代码:
private void button1_Click(object sender, EventArgs e)
{
Bitmap bmp1 = (Bitmap) Image.FromFile(path1);
Bitmap bmp2 = (Bitmap) Image.FromFile(path2);
int factor = 8; // size reduction for smooth measurement data
Size sz = bmp1.Size;
Size szs = new Size(sz.Width / factor, sz.Height / factor);
Bitmap bmp1s = new Bitmap(bmp1, szs);
Bitmap bmp2s = new Bitmap(bmp2, szs);
float avgBrightnes1 = getAvgBrightness(bmp1, 1000);
float avgBrightnes2 = getAvgBrightness(bmp2, 1000);
float avgB12 = (avgBrightnes1 + avgBrightnes2) / 2f;
float deltaB1 = avgB12 - avgBrightnes1;
float deltaB2 = avgB12 - avgBrightnes2;
Console.WriteLine(" B1 = " + avgBrightnes1.ToString("0.000")
+ "B2 = " + avgBrightnes2.ToString("0.000"));
pictureBox1.Image = (Bitmap)bmp1;
pictureBox2.Image = (Bitmap)bmp2;
Rectangle r1 = new Rectangle(0, 0, sz.Width, sz.Height);
Rectangle r2 = new Rectangle(0, sz.Height, sz.Width, sz.Height);
Bitmap bmp12 = new Bitmap(sz.Width, sz.Height * 2);
ColorMatrix M1 = new ColorMatrix();
M1.Matrix40 = M1.Matrix41 = M1.Matrix42 = deltaB1;
ColorMatrix M2 = new ColorMatrix();
M2.Matrix40 = M2.Matrix41 = M2.Matrix42 = deltaB2;
ImageAttributes iAtt = new ImageAttributes();
using (Graphics g = Graphics.FromImage(bmp12))
{
iAtt.SetColorMatrix(M1, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
g.DrawImage(bmp1,r1, 0, 0, sz.Width, sz.Height, GraphicsUnit.Pixel, iAtt);
iAtt.ClearColorMatrix();
iAtt.SetColorMatrix(M2, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
g.DrawImage(bmp2,r2, 0, 0 ,sz.Width, sz.Height, GraphicsUnit.Pixel, iAtt);
}
pictureBox3.Image = (Bitmap)bmp12;
}
float getAvgBrightness(Bitmap bmp, int count)
{
Random rnd = new Random(0);
float b = 0f;
for (int i = 0; i < count; i++)
{
b += bmp.GetPixel(rnd.Next(bmp.Width), rnd.Next(bmp.Height)).GetBrightness();
}
return b/count;
}
getAvgBrightness
很简单。人们可以使用更高级的统计数据来权衡最常见或最中值的亮度水平;我认为 MSChart
控件具有可以使用的内置统计功能。但据我所知,真正的问题在于相机图像中的伽玛和暗角阴影..
注意:虽然图片比较简单,但拼接起来可不是一件简单的事情。那里的全景拼接软件非常专业!在您的图像中,伪影非常容易检测到,因为我们的眼睛没有太多其他东西可以看到和发现..
PS: 看着第三张图,不禁想知道为什么图像变得 progressivley 更暗了?在这里帮不上忙,但我建议先调查一下。-另外:某些模式似乎在重复,而另一些则没有。-像往常一样,最好在处理链中尽早提高质量。
我在自己开发的显微镜上有一堆用 CCD 相机拍摄的图像。
我正在使用 Lumenera 的 CCD 相机,它生成 12bpp 的图像,拉伸,
<<4(在 LSB 上移动 4 个零)
到 16bpp。我附上原始图片 - 看起来很合理:
这是另一个:
唯一的"Processing"我我认为蒙太奇是缩放最小值和最大值之间的值,并将该值压缩成一个字节,以便使用它在 8bpp 位图中,使用以下行:
public static void ParseImage(ushort[]image,ushort minVal,ushort maxVal, int nx,int ny)
{
...........
byte val = (byte)((image[i]-minval)/(maxVal-minVal)*byte.maxValue);
我知道:经过处理的图像中出现伪影,这通常让我将手指放在相机上,但相机制造商表示这可能与 12 位到 16 位之间的转换有关... 任何人都可以理解如何解决,如果是的话 - 如何解决? 或者我有一些可以通过这些工件识别的错误?
任何帮助(提示,给我更多的作业..)将不胜感激!谢谢
看不到原始数据,我只能根据您显示的图像进行工作。但我怀疑你的图像创建代码根本就错了。
据我所知,您有两个问题,这两个问题都源于原始数据。
- 图片整体亮度不一样。
- 图像的亮度有偏差,右上角有点暗,像阴影或单边晕影。
第一个问题比较容易克服;第二个不是这样。
这是一个简单的,实际上非常简单的方法将相当均匀的图像带到一个共同的亮度水平:
- 准备图片;由于它们相当粗糙,我们从每个创建一个较小的版本来进行统计。
- 计算整体亮度。我们不需要查看每个像素;一个相当大的数字就可以了。我使用
1000
个随机选择的像素。 - 调整图像以具有均匀的亮度。这是最好和最快的
ColorMatrix
. - 使用两个颜色矩阵将图像拼接在一起。
我为两个较大的做了这个。正如您所看到的,左侧部分几乎是水平的,但在右侧,顶部的阴影比底部的阴影更暗,拼接伪影也很明显。
如果您无法在相机级别或通过更仔细的闪电解决此问题,我认为最好的解决方案是创建标准图像以进行校正;它将完全是空白的,即除了阴影之外没有动机。然后你可以通过某种方式从每个真实图像中减去它,即可能在计算一些因子以允许伽玛差异之后。
结果如下:
..这是代码:
private void button1_Click(object sender, EventArgs e)
{
Bitmap bmp1 = (Bitmap) Image.FromFile(path1);
Bitmap bmp2 = (Bitmap) Image.FromFile(path2);
int factor = 8; // size reduction for smooth measurement data
Size sz = bmp1.Size;
Size szs = new Size(sz.Width / factor, sz.Height / factor);
Bitmap bmp1s = new Bitmap(bmp1, szs);
Bitmap bmp2s = new Bitmap(bmp2, szs);
float avgBrightnes1 = getAvgBrightness(bmp1, 1000);
float avgBrightnes2 = getAvgBrightness(bmp2, 1000);
float avgB12 = (avgBrightnes1 + avgBrightnes2) / 2f;
float deltaB1 = avgB12 - avgBrightnes1;
float deltaB2 = avgB12 - avgBrightnes2;
Console.WriteLine(" B1 = " + avgBrightnes1.ToString("0.000")
+ "B2 = " + avgBrightnes2.ToString("0.000"));
pictureBox1.Image = (Bitmap)bmp1;
pictureBox2.Image = (Bitmap)bmp2;
Rectangle r1 = new Rectangle(0, 0, sz.Width, sz.Height);
Rectangle r2 = new Rectangle(0, sz.Height, sz.Width, sz.Height);
Bitmap bmp12 = new Bitmap(sz.Width, sz.Height * 2);
ColorMatrix M1 = new ColorMatrix();
M1.Matrix40 = M1.Matrix41 = M1.Matrix42 = deltaB1;
ColorMatrix M2 = new ColorMatrix();
M2.Matrix40 = M2.Matrix41 = M2.Matrix42 = deltaB2;
ImageAttributes iAtt = new ImageAttributes();
using (Graphics g = Graphics.FromImage(bmp12))
{
iAtt.SetColorMatrix(M1, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
g.DrawImage(bmp1,r1, 0, 0, sz.Width, sz.Height, GraphicsUnit.Pixel, iAtt);
iAtt.ClearColorMatrix();
iAtt.SetColorMatrix(M2, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
g.DrawImage(bmp2,r2, 0, 0 ,sz.Width, sz.Height, GraphicsUnit.Pixel, iAtt);
}
pictureBox3.Image = (Bitmap)bmp12;
}
float getAvgBrightness(Bitmap bmp, int count)
{
Random rnd = new Random(0);
float b = 0f;
for (int i = 0; i < count; i++)
{
b += bmp.GetPixel(rnd.Next(bmp.Width), rnd.Next(bmp.Height)).GetBrightness();
}
return b/count;
}
getAvgBrightness
很简单。人们可以使用更高级的统计数据来权衡最常见或最中值的亮度水平;我认为 MSChart
控件具有可以使用的内置统计功能。但据我所知,真正的问题在于相机图像中的伽玛和暗角阴影..
注意:虽然图片比较简单,但拼接起来可不是一件简单的事情。那里的全景拼接软件非常专业!在您的图像中,伪影非常容易检测到,因为我们的眼睛没有太多其他东西可以看到和发现..
PS: 看着第三张图,不禁想知道为什么图像变得 progressivley 更暗了?在这里帮不上忙,但我建议先调查一下。-另外:某些模式似乎在重复,而另一些则没有。-像往常一样,最好在处理链中尽早提高质量。