C# Emgu图像从图像转换<;灰色,浮动>;去想象<;灰色,字节>;导致强度损失?
我们通过从原始图像中减去图像的拉普拉斯函数,对类型图像的灰度图像执行图像锐化。如果将结果保存为JPEG,则具有定义良好的边缘和对比度。但是,如果生成的图像转换为位图或“C# Emgu图像从图像转换<;灰色,浮动>;去想象<;灰色,字节>;导致强度损失?,c#,opencv,emgucv,C#,Opencv,Emgucv,我们通过从原始图像中减去图像的拉普拉斯函数,对类型图像的灰度图像执行图像锐化。如果将结果保存为JPEG,则具有定义良好的边缘和对比度。但是,如果生成的图像转换为位图或“图像”” 并保存为JPEG,强度降低,锐化效果丢失。我怀疑转换为位图可能导致此问题。因此,我保存了一些中间图像,并将图像转换为“image”。这没有帮助。我还尝试用一种简单的方法缩放图像。这也无济于事 当我们执行拉普拉斯并从原始图像中减去合成图像时,上述行为也是正确的。插图如下(为简单起见,对代码进行了修改): 。。。 图像锐化图
图像”
”
并保存为JPEG,强度降低,锐化效果丢失。我怀疑转换为位图可能导致此问题。因此,我保存了一些中间图像,并将图像转换为“image
”。这没有帮助。我还尝试用一种简单的方法缩放图像。这也无济于事
当我们执行拉普拉斯并从原始图像中减去合成图像时,上述行为也是正确的。插图如下(为简单起见,对代码进行了修改):
。。。
图像锐化图像=锐化(过滤器、原始处理图像);
processeImage=锐化图像。ToBitmap();//或ProcessedImage.Bitmap;
ProcessedImage.Save(“ProcessedImage.jpg”);//导致强度损失
...
公共图像锐化(图像输入框)
{
ConvolctionKernelF-Ripper1Kernel=新的ConvolctionKernelF(新的浮点[,]{-1,-1,-1},{-1,8,-1},{-1,-1});
Image newFloatImage=inputFrame.Convert();
Image newcurrencedimage=newFloatImage.currension(锐化1kernel);
图像卷积ScaledShiftedImage=newFloatImage.AddWeighted(new卷积图像,1.0,1.0,0);
//添加用于测试的
concurvedScaledShiftedImage.Save(“concurvedScaledShiftedImage.jpg”);
//现在尝试缩放和保存:
Image scaledImageFloat=卷积的scaledAddedimage.Clone();
图像缩放图像浮动2=缩放图像(缩放图像浮动);
//添加用于测试的
scaledImageFloat.Save(“ScaledImage.jpg”);
//添加用于测试的
scaledImageFloat2.Convert().Save(“ScaledImage-8Bits.jpg”);
//这两种方法都返回较低强度的图像
返回scaledImageFloat2.Convert();
返回ConvertedScaledShiftedImage.Convert();
}
虽然卷积ScaledShifteimage.jpeg更亮,对比度更好,“ScaledImage.jpeg”和“ScaledImage-8Bits.jpeg”与卷积ScaledShifteimage.jpeg相比失去了强度级别。ProcesseImage.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;
}
图像缩放图像(图像输入图像)
{
双[]最小值;
双[]最大值;
点位置;
点[]最大位置;
图像缩放图像=inputImage.Clone();
MinMax(out minValue、out maxValue、out minLocation、out maxLocation);
双中值=(最小值[0]+最大值[0])/2;
双范围值=(最大值[0])-(最小值[0]);
双刻度因子=1/范围值;
双移位因子=中值;
Image scaledImage1=scaledImage.ConvertScale(1.0,Math.Abs(minValue[0]);
图像缩放图像2=缩放图像1.ConvertScale(缩放因子*255,0);
返回缩放图像2;
}
是否有人能提出可能出现的问题,以及为什么在上述操作中强度损失?谢谢
编辑:修复了格式问题。。。转换是从Image
到Image
编辑1月12日:我进一步深入研究了OpenCV代码,据我所知,当您将image
类型的图像保存为JPEG时,imwrite()
首先将图像转换为8位图像image.convertTo()temp,CV\u 8U)代码>并写入文件。使用Convert()
执行相同操作时,强度不同。因此,目前尚不清楚两者之间的区别
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;
}