我尝试了很多事情,但是所有尝试都失败了。
我需要将灰度图像(2560x1440)调整为更低或更高的分辨率,然后我需要将边界设置为原始大小(2560x1440),但将调整后的图像保持在中心。
我使用的是EmguCV 4.3和Mat,我尝试了许多方法,并在Mat构造函数和copyTo上使用了ROI,但没有任何效果,它总是使用调整大小的边界设置新Mat
要求的示例:
源图像:(2560x1440)
调整了50%的大小,但与源保持相同的边界(2560x1440)
调整大小为300%,但与来源保持相同的边界(2560x1440)
最佳答案
使用WarpAffine对图像应用仿射变换。使用转换矩阵,您可以应用比例并转换转换。还支持旋转,但在我的示例中未涉及。转换值也可以为负。
WrapAffine方法还有更多参数可供您使用。
public void Test()
{
var img = new Mat("Bmv60.png", ImreadModes.Grayscale);
Mat upscaled = GetContentScaled(img, 2.0, 0.5, 0, 0);
upscaled.Save("scaled1.png");
Mat downscaled = GetContentScaled(img, 0.5, 0.5, 0, 0);
downscaled.Save("scaled2.png");
}
private Mat GetContentScaled(Mat src, double xScale, double yScale, double xTrans, double yTrans, Inter interpolation = Inter.Linear)
{
var dst = new Mat(src.Size, src.Depth, src.NumberOfChannels);
var translateTransform = new Matrix<double>(2, 3)
{
[0, 0] = xScale, // xScale
[1, 1] = yScale, // yScale
[0, 2] = xTrans + (src.Width - src.Width * xScale) / 2.0, //x translation + compensation of x scaling
[1, 2] = yTrans + (src.Height - src.Height * yScale) / 2.0 // y translation + compensation of y scaling
};
CvInvoke.WarpAffine(src, dst, translateTransform, dst.Size, interpolation);
return dst;
}
关于image - C#EmguCV调整Mat大小但保持边界/分辨率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62524257/