从Image <gray,float>到Image <gray,byte>的Emgu图像转换导致强度损失?</gray,byte> </grey,float>

时间:2015-01-06 07:20:09

标签: c# opencv emgucv

我们通过从原始图像中减去图像的拉普拉斯算子来执行图像类型的灰度图像的图像锐化。结果,如果保存为JPEG,则具有良好定义的边缘和对比度。但是,如果结果图像转换为位图OR&#34; Image<Gray, Byte>&#34; 并保存为JPEG,强度降低,锐化效果丢失。我怀疑转换为Bitmap可能会导致此问题。因此,我保存了一些中间图像,并将图像转换为&#34; Image<Gray,Byte>&#34;。这没有用。我还尝试使用简单的方法缩放图像。这也没有帮助。

当我们执行拉普拉斯并从原始图像中减去合成图像时,上述行为也是如此。插图如下(为简单起见,代码已经过修改):

...

Image<Gray, Byte> sharpenedImage = Sharpen(filter, originalprocessedImage);
ProcessedImage = sharpenedImage.ToBitmap(); // Or ProcessedImage.Bitmap;
ProcessedImage.Save("ProcessedImage.jpg");  // results in intensity loss

...

public Image<Gray, Byte> Sharpen(Image<Gray, Byte> inputFrame)
{
    ConvolutionKernelF Sharpen1Kernel = new ConvolutionKernelF (new float[,] { { -1,-1,-1 }, { -1, 8,-1 }, { -1,-1,-1 } });
    Image<Gray, float> newFloatImage = inputFrame.Convert<Gray, float>();
    Image<Gray, float> newConvolutedImage = newFloatImage.Convolution(Sharpen1Kernel);    
    Image<Gray, float> convolutedScaledShiftedImage = newFloatImage.AddWeighted(newConvolutedImage, 1.0, 1.0, 0);

    // added for testing
    convolutedScaledShiftedImage .Save("ConvolutedScaledShiftedImage .jpg");

    //Now try to scale and save:
    Image<Gray, float> scaledImageFloat = convolutedScaledAddedImage.Clone();
    Image<Gray, float> scaledImageFloat2 = ScaleImage(scaledImageFloat);

    // added for testing
    scaledImageFloat.Save("ScaledImage.jpg");

    // added for testing
    scaledImageFloat2.Convert<Gray,Byte>().Save("ScaledImage-8Bits.jpg");

    // both of these return the images of lower intensity
    return scaledImageFloat2.Convert<Gray,Byte>();
    return convolutedScaledShiftedImage.Convert<gray,Byte>();
}

虽然ConvolutedScaledShifteImage.jpeg更亮并且具有更好的对比度,但是#34; ScaledImage.jpeg&#34;和&#34; ScaledImage-8Bits.jpeg&#34;与ConvolutedScaledShifteImage.jpeg相比,已经失去了强度等级。对于ProcessedImage.jpeg也是如此。

ScaleImage如下。这不是必要的。由于转换失去了强度,我尝试进行转换并检查:

Image<Gray, float> ScaleImage(Image<Gray, float> inputImage)
{
    double[] minValue;
    double[] maxValue;
    Point[] minLocation;
    Point[] maxLocation;

    Image<Gray, float> scaledImage = inputImage.Clone();

    scaledImage.MinMax(out minValue, out maxValue, out minLocation, out maxLocation);

    double midValue = (minValue[0] + maxValue[0] ) / 2;
    double rangeValue = (maxValue[0]) - (minValue[0]);
    double scaleFactor = 1 / rangeValue;
    double shiftFactor = midValue;

    Image<Gray, float> scaledImage1 = scaledImage.ConvertScale<float>(1.0, Math.Abs(minValue[0]));
    Image<Gray, float> scaledImage2 = scaledImage1.ConvertScale<float>(scaleFactor * 255, 0);

    return scaledImage2;
}

是否有人能够提出可能出现的问题以及为何上述行动中的强度会丢失?感谢。

修改:修复了格式问题...转化时间为Image<Gray, float>Image<Gray, Byte>

编辑12月1日:我进一步挖掘OpenCV代码,据我所知,当您将Image<Gray,float>类型的图像保存为JPEG时,imwrite()首先将图像转换为8位图像{ {1}}并写入文件。当使用image.convertTo( )temp, CV_8U );执行相同操作时,强度不同。所以,目前尚不清楚两者之间有什么区别。

0 个答案:

没有答案