我有一堆我用CCD相机拍摄的照片,在我开发的显微镜上。
我正在使用Lumenera的CCD相机,它生成12 by图像,拉伸,通过
<<4 (向LSB移动4个零点)到16 LSB。我附上原图--这看上去很合理:

这是另一个:

还有其中许多有垂直线的蒙太奇:

我认为在蒙太奇上做的唯一“处理”是缩放minValue和maxValue之间的值,并将值压缩为一个字节,以便在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位之间的移动有关……谁能理解如何修复,如果是的话-如何修复?,或者我是否有一些错误,可以通过这些工件来识别?
任何帮助(提示,给我更多的homeWork )将被感激地接受!谢谢
发布于 2017-05-19 09:33:30
没有看到原始数据,我只能从您显示的图像工作。但我怀疑你的形象创作代码是错的。
据我所见,您有两个问题,这两个问题都源于原始数据。
第一个问题很容易解决;第二个问题不容易解决。
这里有一个简单的,实际上是非常简单的方法,它将相当均匀的图像带到一个普通的亮度级别
1000像素。ColorMatrix。我这么做是为了两个更大的。正如你所看到的,左边的部分几乎是平的,但是在右边,顶部的阴影比底部的要暗,缝制的伪影显示的很强。
如果你不能在相机的水平上解决这个问题,或者通过更小心的闪电,最好的解决方法是为校正目的创建一个规范的图像;它将是完全空白的,即除了阴影之外没有动机。然后你可以用某种方式从每一幅真实的图像中减去这一点,比如,在计算了一些因子之后,允许伽马射线的差异。
结果如下:

..and这里是代码:
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的图像变得更暗了?这里帮不上忙但我建议你先调查一下..。-另外:有些模式似乎在重复,有些则没有.-如往常一样,最好尽早改善加工环节的质量。
https://stackoverflow.com/questions/44026194
复制相似问题